
java
文章平均质量分 52
eric1984
喜欢技术的架构师
展开
-
DCI架构的理解
/ DCI,app层与domain层之间有了一个role的桥廊,app(context)不会耦合特别多的属性,只耦合少部分的行为。对聚合根的直接耦合,变成了对角色的使用。DDD里聚合根同时实现类的属性和方法,容易出现上帝类;传统的ddd架构,领域层是纯oop模型,应用层使用领域层的聚合根来完成业务,DCI是把。总结:app与domain层中间,添加一层role,用来切分聚合根。// context里面仅依赖角色,不直接依赖聚合根Person。// 纯DDD,聚合根是铁板一块,容易形成上帝类。原创 2022-11-23 17:05:52 · 657 阅读 · 1 评论 -
springdata jdbc设计理念
多对多的关系数据结构上用2个聚合实现,领域函数上使用实体。// 领域服务是添加作者,数据结构是存储关联关系。DDD里的核心关系,1、聚合 2、关联。原创 2022-09-02 21:04:24 · 298 阅读 · 1 评论 -
JVM GC
GC最佳实践原创 2022-08-29 17:49:20 · 133 阅读 · 0 评论 -
dataql的内部实现
1、整体是自定义了一门dsl,并实现了指令集和执行器2、核心数据结构QueryModel 语法树 QIL 指令集 Query:整体dsl解析执行的门面 DataModel:通用数据类型,可以解包成具体的object list 原子类型等UDF (User-Defined Function)用户定义函数,mysql的udf是用c写的,dataql的udf是用java写的(注册后可以在脚本中使用)3、运行时核心逻辑QueryResultImpl QueryImpl.execute(Custom...原创 2021-09-28 16:25:03 · 392 阅读 · 0 评论 -
mysql的锁 和可重复读 RR的实际业务场景与实际意义
mysql的锁锁的颗粒度,决定并发度和速度InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁;rr的业务场景:多个相关的查询,同时取出来使用,并且要保证业务含义一致1》 对数。 上个月的余额,本月的账单(3个结果),当前的余额(修改了1个结果),正常应该是上月余额-本月账单==当前余额,现在因为2次读时,差了1个更新事务,所以对不上了2》 汇总数额不对。同一个事务内,先查详情,后聚合count,详情加起来和count返回的结果不一致3》..原创 2021-06-17 20:58:52 · 761 阅读 · 0 评论 -
nginx 常用配置
多进程模型:master负责管理,worker负责处理连接和http请求sendfile:从默认的 磁盘--内核(read文件)--用户态--内核(write数据)--协议栈,变成磁盘--内核--协议栈upstream 定义后端的多个服务器地址server { listen 80 default_server; # 域名不匹配时的默认server listen [::]:80 default_server; server...原创 2021-06-17 20:19:13 · 2058 阅读 · 0 评论 -
postman学习
1、全局变量 环境变量 测试集变量{{variable}}2、测试脚本pm.test("Status code is 200", function () { pm.response.to.have.status(200); });3、发送前的脚本pm.globals.set("filter", "user-1");4、工作流 用test脚本来实现postman.setNextRequest('Postman Echo PUT')5、取出数据塞入全局变量var jsonData = pm原创 2021-06-17 14:31:02 · 81 阅读 · 0 评论 -
关于mysql的 mvcc和read view
RR隔离级别下,整个事务开始时创建1个read view,后面的事务提交的结果,不会体现在读的结果里。RC隔离级别下,每个快照读,都会生成新的read view。mysql的所有的快照读,都不保证读到最新的结果,因为都不会加锁...原创 2021-06-17 09:52:58 · 190 阅读 · 0 评论 -
单机与分布式的组件差异
用内存存储数据, 5、用多线程提高并发, 6、防止被kil掉(多个进程之间彼此守护,在合适的时候互相拉起) 二、分布式环境下: 1、消息队列 mq实现异步化(顶住流量洪峰)和解耦(适合彼此调用关系非常复杂的场景), 2、数据库hash实现分库分表,ES实现快速查询 3、分布式锁来同步各个服务(进程)或资源(比如db), 4、使用redis等替代内存, 5、使用多个service的RPC实现扩展性, 6、使用zoo原创 2018-07-25 15:51:01 · 130 阅读 · 0 评论 -
dubbo 概览
;dubbo:reference id="userService" interface="org.huxin.dubbo.test.user.service.UserInterface" stub="org.huxin.dubbo.test.UserServiceStub" protocol="dubbo"/> public class UserS原创 2018-07-09 21:34:20 · 80 阅读 · 0 评论 -
java spi机制
oader加载具体的实现(通过无参数构造函数实现对象创建)2、提供者在jar包的META-INF/services/目录里创建前面接口的全名文件3、在文本文件里写上具体实现类的全名4、具体的例子,数据库驱动spi META-INF/services/java.sql.Driver ,实现者 /mysql-connector-java/5.1.29/mysql-connector-java-5.1.29.jar原创 2018-06-22 19:48:19 · 87 阅读 · 0 评论 -
light-task-scheduler
时性的任务可以使用调度器scheduler(每个任务一个线程,对于周期性任务非常浪费资源)2、如果有非常多调度性任务需要处理,可以每台机器分别布置一套调度器,并且不同机器调度不同的任务。3、2中每个机器进行调度很浪费(比如每1ms检查一次条件),不同的任务不能跨机器共享硬件,而且无法看到所有调度任务的整体的情况。另一种方案是,一个master进行时间和条件的调度,到了执行条件再扔给具体的机器执行,这样很方便进行横向扩展,只要维护一套调度集群,就解决所有调度需求(分布式调度)4、分布式调度引进原创 2018-06-09 18:58:37 · 346 阅读 · 0 评论 -
关于java log框架
控,slf4j使用静态绑定logback:增强版的log4j,提供 配置扫描更新、占位符、运行时过滤器、处理IO异常……等功能 目前最佳搭配:slf4j logback slf4j实现方式:org.slf4j.impl.StaticLoggerBinder由集成方实现 某个配置例子logback.xml<?xml version="1.0" encoding="UTF-8"?><con原创 2018-05-17 09:46:13 · 94 阅读 · 0 评论 -
后端技术的演化
据分析2、ETL、数据仓库->大数据、大规模分布式数据处理->大规模机器学习->实时数据处理三、各个技术之间的演化对应关系mysql VS redis ETL VS storm数据仓库 VS hive数据挖掘 VS 机器学习OA VS 工作流IPC VS RPC内存 VS redis查找 VS 搜索(solr)文件系统 VS 分布式存储map/reduce VS 流计算原创 2018-01-05 18:04:05 · 148 阅读 · 0 评论 -
java并发四 api 抽象
oncurrentHashMap 分段加锁(二级的map结构)hashmap的实现:table数组里放了多个桶(bucket),一个桶对应一个hashcode,有冲突的时候用链表链接,jdk8中如果一个桶内的节点太多,会使用红黑树。concurrencyLevel 分段的个数2^ninitialCapacity 整个map的初始值 每个entry的大小由loadFactor每个分段的装载因子modCount 修改的次数高效的原因:分段加锁;读(不加锁)写分离2、Concurre原创 2017-11-01 15:49:50 · 97 阅读 · 0 评论 -
java并发 三 概念和原理
调,是应用为了实现某种逻辑而写的,一般基于互斥实现4、POSIX中定义的工具:内存barrier(避免多核cache导致的不一致)、mutex、condition、readwritelock、semaphore5、管程 monitor,把pv操作、加解锁抽象成数据结构,而不是散列在线程的代码里6、io缓存:cpu用DMA缓存到内核,之后拷贝到用户空间,比不用缓存好的地方:不用多次分配和释放内存;可以一次让磁盘读入整个块;在读入的时候,使用更少的cpu干预。7、内存映射:内核和用户空间使用同一原创 2017-11-01 15:42:31 · 115 阅读 · 0 评论 -
消息队列mq的3个使用场景
态为init(设置定时时间,时间到后清除)3、client(app/h5/小程序) 通过msg id,定时向server获取msg处理状态(init时 画圈,没有时返回繁忙,fail时返回处理失败)4、server向redis查询处理的结果,返回 init/null/fail等状态 ------ 后台服务层1、原来controller里面的逻辑,改为使用rocketmq的消息来驱动2、processor(原来的controller里面的逻辑) 取出消息,rpc调用后台的服务,将结原创 2018-09-01 19:11:33 · 171 阅读 · 0 评论 -
java invokedynamic和GC
映射到哪个方法区(Callsite),可以实现根据数据类型的不同调用不同的指令(无类型的语言)。相应的Class文件的常量区里也设定了对应的字段。jit:即时编译,有一个编译的过程,本身花费时间,同时表以后的体积膨胀很厉害,所以不是jit一定优于AOTgc:针对堆和方法区一、算法1、标记-清除:大量碎片,效率低2、复制:内存使用率低(只有50%)3、标记-压缩:清除的同时,进行压缩4、分代收集:FullGC太慢,可以分代。young代才需要频繁的GC。年轻代存活时间短,进行复原创 2017-10-17 17:27:15 · 100 阅读 · 0 评论 -
自己动手写Java虚拟机 笔记
帧 = 一个调用深度= 局部变量表+操作数栈5、一个指令执行的例子:public static float circumference(float r){float pi = 3.14f;float area = 2 * pi * r;return area;}字节码如下:00 ldc #4 栈顶 3.1402 fstore_1 局部数据区 pi03 fconst_2 栈顶 04 fload_1局部数据区--》栈顶05 fmul弹出栈2个数据,结原创 2017-10-17 14:16:09 · 90 阅读 · 0 评论 -
java并发二 多线程的几个层次
程用户空间)。3、java线程对应os的进程,工作空间对应进程的用户空间,jvm对应硬件4、主内存的指令:lock(锁定到某个线程) unlock read write线程工作内存指令:load store use assign 。所有的函数内的操作,都针对线程的工作空间内存。5、linux中。一个java线程对应一个内核线程(轻量进程)6、CAS:自旋锁,乐观锁,不是每次强制切换上下文环境,而是短时间的轮训和等待,相当于锁的粒度更小了。CAS的原理:循环处理,每次比较假设和设置,一般不原创 2017-10-09 16:00:43 · 117 阅读 · 0 评论 -
Netty内部实现 一 消息处理主框架
了多个EventLoop,默认分配策略是依次为每个channel分配EventLoop。一个eventLoop循环多个连接获取消息。这样保证每个连接的消息是单线程的。2、EventLoop的具体实现是EpollEventLoop或NIOEventLoop,内部逻辑是每个obj对应一个线程,一个blockingqueue,一个事件循环。每一个循环周期,根据ioRatio,分别进行io事件监听和处理对应的回调。其中,processReady 回调各个handler。runAllTasks 依次回调Link原创 2017-09-30 14:49:53 · 149 阅读 · 0 评论 -
spring4 系列五 security 和sso
、用户名、电话号码credential的例子:密码、证书Permission:权限Policy:权限控制策略AccessController:使用权限ProtectionDomain:维护了一组身份和权限 加解密:Cipher 加密服务MessageDigest 摘要SecretKey 对称秘钥PublicKey和PrivateKey 非对称秘钥KeySpec具体的秘钥的说明Message Authentication Code (MAC):添加了秘钥的摘原创 2017-07-24 15:44:20 · 221 阅读 · 0 评论 -
spring4 系列四 cloud
。二、具体服务1、服务注册和发现<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> @EnableEurekaServer eureka: instance: hostna原创 2017-07-20 14:41:20 · 87 阅读 · 0 评论 -
spring4系列三 spring data 解析
引擎(solr),大数据(hdfs),云存储和CDN。其中前2个用于交易事物操作,第三个重点是快速查找,模糊查找(找到最相似的),第四个用于分析(数据仓库的升级),最后是纯粹的可靠存储(多备份的硬盘)。spring中,把所有能存储和处理数据的地方叫Repository。其目标是,提供统一的数据访问接口,尽可能避免写sql。 一、相关jar概述spring-data-commons封装了repository和相关的annotationspring-data-jpa实现jpaRepository原创 2017-07-14 16:40:40 · 106 阅读 · 0 评论 -
基于camunda的工作流开发
述。解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。二、作用1、企业太大时,做一件事情需要多个部门、多个人一起去合作完成,随着人员的流动,可能没有人能了解所有的流程细节,这时使用工作流来自动化的连接不同的部门和人员,简单的东西可以自动由程序来完成,每个具体的人只需要关注自己的一个工作就可以了。(流程能固化和自动化,流程是企业积累的重要资产,之前是积累到具体的人,而不是企业)2、确定每个人的权限和责任,保证事事有人做,人人有事做(管理上更原创 2017-07-11 09:21:03 · 1157 阅读 · 0 评论 -
服务端相关技术总结
况下怎样增删改查。个人理解,各个技术之间的发展关系如下: db、nosql-->大数据->数据分析、机器学习->自然语言处理 图形学、图像处理->模式识别->计算机视觉+人机交互->VR AR 网络->分布式->高可用->云计算、普适计算web后端的主要技术 交易处理+分析 cdn nginx反向代理和负载均衡 应用程序 分原创 2017-06-16 10:38:14 · 148 阅读 · 0 评论 -
web开发java VS python
,client与目标之间的中介5、https:安全传输层协议(TLS)之上的http6、servlet处理资源请求的程序逻辑,程序员自己处理多用户导致多线程问题7、ServletContext:多个servlet共享的环境8、servlet容器: 支持servlet执行的runtime9、forward:server内部流程跳转到别的页面10、redirect:强制client二次请求,可以体现在client的地址栏11、session:从客户打开浏览器连接到服务器,到客户关闭浏原创 2017-06-07 17:38:27 · 129 阅读 · 0 评论 -
spring4系列二 spring boot 解析
上下文环境Archive boot抽象出来的统一访问资源的层url的例子 jar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/lib/aopalliance-1.0.jarfat jar的目录结构:BOOT-INF/classes/ 自己写的代码BOOT-INF/lib/依赖的库META-INF元数据org/springframework/boot/loader boot的加载代码2、loader 启动流程 org.springfram原创 2017-05-15 17:42:15 · 108 阅读 · 0 评论 -
spring4 系列一 概览
在xml中。2、依赖注入:在需要的时候由容器来注入需要的对象,是具体被反转的东西3、aop:利用反射进行hack,对于原生支持函数式编程的语言来说根本不需要这种hack的机制4、java.lang.instrument 实现对jvm和class的动态代理http://www.cnblogs.com/wade-luffy/p/6078301.html 一、spring4工程概览spring boot微服务spring framework最基础的框架功能,比如ioc、ao原创 2017-05-03 14:28:24 · 72 阅读 · 0 评论 -
Dubbo源代码解析
p2p zookeeperRPC(协议、调用者、proxy、filter、tps)RMI、http、redis、memcached、injvm各种协议的支持monitor 监控和统计数据registry 管理和展示服务 二、consumer的实现xml--> ReferenceBean-->ReferenceConfig.createProxy->DubboInvoker->HeaderExchangeClient.req原创 2017-04-26 16:36:59 · 103 阅读 · 0 评论 -
java并发一 多线程编程
再是就绪状态。类型分为等待阻塞(o.wait)对应waitting queue、同步阻塞(lock)对应lock pool、其他阻塞(sleep、join、同步IO,满足后自动变成就绪)一、OS的封装 OS支持进程,支持cpu调度,所以多进程的同步由OS来实现(比如进程堵在磁盘访问的队列上),但是同一个进程内的多线程,属于应用的范畴,所以需要程序员自己来实现二、Linux对多线程的支持 linux没有单独实现线程,而是直接使用轻量级进程来模拟的(实现原创 2016-08-30 17:04:43 · 102 阅读 · 0 评论 -
继承环境下java初始化顺序
tected int j = 0;// 静态初始化块static { System.out.println(p_StaticField1); System.out.println("父类--静态初始化块");}// 初始化块{ System.out.println(p_Field); System.out.println("父类--初始化块");}public static String p_StaticField2 = &原创 2016-08-15 14:27:41 · 69 阅读 · 0 评论 -
netty学习总结
题 1、异步socket 2、异步IO 3、多协议支持(传输层之上) 4、减少内存碎片 5、减少锁的影响 ……三、netty的解决方案 1、使用java的nio,最好是aio(内核直接支持) 2、封装了promise,实现了基于回调的异步io 3、架构上区分了reactor层、pipeline层、协议层和逻辑层 4、封装了ByteBuf,自己来管理内存,而不是完全依赖jvm 5、单个socket只在一个线程上处理、避免不必要的线程调度开销四、2016-03-12 18:49:38 · 68 阅读 · 0 评论 -
几种常用编程语言的编程思想和方法
法层面c++是最复杂的)。不幸的是,软件的本质是逻辑,解决方案的设计是要借助某种解决问题或编程的思想的。本文试图从抽象层面概括一点编程思想方面的东西。一 c语言1、相关概念:实模式、保护模式、调度、中断、调用栈、回调……基本上计算机科学里面的基本概念都会涉及2、编程思想:结构化编程,即将解决方案描述为一个清晰的过程,这其中会涉及数据的建模(数据结构),接口的定义(函数),项目整体的组织结构(类似于中断向量表的注册、回调机制)。整个实现的过程就是这种流程从粗到细,步步细化的过程。3、适合的原创 2012-04-23 13:52:05 · 137 阅读 · 0 评论 -
java的扩展和架构
API for Integrated Networks)Java综合网络应用程序开发接口 JAI,(Java Advanced Imaging)Java进阶图像Java EE(原名J2EE),Java平台企业版Java ME(原名J2ME) ,Java平台微型版为PDA和智能手机开发的移动版本Java SE(原名J2SE),Java平台标准版JDBC ,(Java Database Connectivity)Java数据库联通 JDMK,(Java Dynam原创 2012-04-06 10:17:23 · 76 阅读 · 0 评论 -
读代码的方法总结
务器或者对性能要求较高的工程会用纯C来写,这种工程是不太好读的。要读这种代码首先需要了解相应的基本概念,其次是一些核心的数据结构和功能模块,再次如果能找到相应的逻辑架构图(因为不涉及实现的细节还是比较容易找到的)会对理解代码有重要的帮助。C的工程大多数会写make文件,有时通过make文件可以帮助我们找到模块之间的依赖关系。最重要的是要理解系统的组织形式,典型的形式是利用函数指针来分割和挂载模块。apache的web服务器软件httpd便是用纯C实现的,其对于配置文件的处理、动态加载的实现、分阶段分模块建立原创 2012-04-06 10:17:01 · 102 阅读 · 0 评论 -
Java 编程的动态性
执行文件)、操作系统的装载程序将其装入内存(建立进程)来运行java程序的执行:编译、加载、在虚拟机中执行新加载的类与其他类的链接由jvm来完成,所以java可以实现动态的链接,即在程序已经运行起来之后决定更新哪些模块、使用哪些模块(可以实现不停机而更新功能)。java的这种机制与C++的dll的区别是,前者完全动态,允许在程序运行的时候改变代码的逻辑、后者所谓的动态在代码逻辑上来讲是静态的(使用的条件、功能的组合要硬编码)。如:用户输入了A 则加载A模块,否则不加载这样一段逻辑,对原创 2012-04-06 10:16:42 · 108 阅读 · 0 评论 -
jvm 源代码笔记 四 jvm主要功能模块
种计数的处理) 管理内存、线程、垃圾回收等,内部初始化了 线程服务、运行时服务、类加载服务2、bytecodes_init 建立好字节码相关的表结构,便于后面利用查表实现相应的逻辑3、classLoader_init 统计class,维护classpath、class与字节码等之间的映射关系4、codeCache_init(); 缓冲代码5、VM_Version_init(); 设置 主、次版本号、 设置build数等6、stubRoutines_init1(); 便于c中调用jav原创 2012-04-05 16:44:23 · 135 阅读 · 0 评论 -
jvm 源代码笔记 三 create_vm 主流程
vaVMInitArgs* args, bool* canTryAgain)1、hotspot/src/os/windows/vm/os_windows.cpp line:3498 os::init() win32::initialize_system_info(); 从系统中返回相关信息 主要数据结构 SYSTEM_INFO win32::setmode_streams(); 改变标准文件的打开方式,如stdin、stdout 从文本模式转到二进制模式 in原创 2012-04-05 16:43:22 · 134 阅读 · 0 评论 -
jvm源代码笔记 二
代码的位置终于找到了。openjdk\hotspot\src\share\tools\launcher\java.c 中的main函数是整个hotspot虚拟机的入口,和其他程序一样,main函数是在非常高的抽象程度进行抽象并进而描述主流程,进行必要的初始化之后,JavaMain在新的线程中开启并开始执行java的main class。从jvm本身启动的角度来看,最主要的流程是通过一个回调来进行的,此回调函数通过 InvocationFunctions 数据结构进行传递。主要的函数原创 2012-04-05 16:41:38 · 92 阅读 · 0 评论