- 博客(96)
- 资源 (1)
- 收藏
- 关注
原创 精尽 MyBatis 源码分析 —— IO 模块
1. 概述资源加载模块,主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能 。2. ClassLoaderWrapperorg.apache.ibatis.io.ClassLoaderWrapper ,ClassLoader 包装器。可使用多个 ClassLoader 加载对应的资源,直到有一成功后返回资源。2.1 构造方法// ClassLoaderWrapper.java/** * 默认 ClassLoader 对象 */ClassLoader
2020-08-29 19:40:26 314
原创 精尽 MyBatis 源码分析 —— 类型模块
1. 概述① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及:在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型2. TypeHandlerorg.apache.ibatis.type.TypeHandler ,类型转换处理器。
2020-08-22 14:46:34 384
原创 精尽 MyBatis 源码分析 —— 日志模块
1. 概述无论在开发测试环境中,还是在线上生产环境中,日志在整个系统中的地位都是非常重要的。良好的日志功能可以帮助开发人员和测试人员快速定位 Bug 代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的 Java 世界中存在很多优秀的日志框架,例如 Log4j、 Log4j2、Slf4j 等。MyBatis 作为一个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。2. LogFactoryorg.apache.ibatis.lo
2020-08-16 11:44:17 225
原创 精尽 MyBatis 源码分析 —— 缓存模块
1. 概述在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的。这里需要读者注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时,优先考虑使用 R
2020-08-16 10:47:56 300
原创 精尽 MyBatis 源码分析 —— 事务模块
1. 概述MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务2. Transactionorg.apache.ibatis.transaction.Transaction ,事务接口。代码如下:public interface Transaction { /** * Retrieve inner database connection. * @return
2020-08-15 20:39:29 170
原创 精尽 MyBatis 源码分析 —— 异常模块
1.概述定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。2. exceptions 包2.1 IbatisExceptionorg.apache.ibatis.exceptions.IbatisException ,实现 RuntimeException 类,IBatis 的异常基类。代码如下:@Deprecatedpublic class IbatisException extends RuntimeExcep
2020-08-12 23:12:05 224
原创 精尽 MyBatis 源码分析 —— 反射模块
1.概述Java 中的反射虽然功能强大,但对大多数开发人员来说,写出高质量的反射代码还是 有一定难度的。MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。2. Reflectororg.apache.ibatis.reflection.Reflector ,反射器,每个 Reflector 对应一个类。Reflector 会缓存反射操作需要的类的信
2020-08-09 21:09:49 321
原创 精尽 MyBatis 源码分析 —— 解析器模块
1.概述解析器模块,主要提供了两个功能:一个功能,是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。另一个功能,是为处理动态 SQL 语句中的占位符提供支持。源码对应 parsing 包。2. XPathParserorg.apache.ibatis.parsing.XPathParser ,基于 Java XPath 解析器,用于解析 MyBatis mybatis-config.xml 和 **Mapper.
2020-08-05 23:15:37 295
原创 精尽 MyBatis 源码分析 —— 项目结构一览
1.概述MyBatis 的整体架构分为三层:基础支持层核心处理层接口层2 基础支持层2.1 反射模块对应 reflection 包。Java 中的反射虽然功能强大,但对大多数开发人员来说,写出高质量的反射代码还是 有一定难度的。MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。2.2 类型模块对应 type 包。① MyBa
2020-08-05 21:11:48 327
原创 mysql实战从0到1笔记 ———日志系统
1.重要的日志模块:redo logMySQL 里经常说到的 WAL 技术,WAL 的全称 是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(粉 板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时 候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个
2020-06-26 13:36:46 185
原创 mysql实战从0到1笔记 ———基础架构
1.一条SQL查询语句是如何执行的?下面我给出的是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核 心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引 擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是
2020-06-26 10:44:03 133
原创 DDD实战笔记(2) DDD领域驱动代码结构设计
1. DDD 分层架构与微服务代码模型微服务代码模型就是依据DDD 分层架构模型设计出来的。那为什么是 DDD 分层架构模型呢?用户接口层:面向前端提供服务适配,面向资源层提供资源适配。这一层聚集了接口适配相关的功能。应用层职责:实现服务组合和编排,适应业务流程快速变化的需求。这一层聚集了应用服务和事件相关的功能。领域层:实现领域的核心业务逻辑。这一层聚集了领域模型的聚合、聚合根、实体、值对象、领域服务和事件等领域对象,以及它们组合所形成的业务能力。基础层:贯穿所有层,为各层提供基础资源服
2020-06-20 18:47:25 2131 1
原创 DDD实战笔记(1) 什么是DDD领域驱动
1. 概述DDD 是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD 不是架构,而是一种架构设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。2.什么是领域?DDD通过分析业务,最终构建成一个个“领域”,设计出一个个富含业务行为的、饱满的“领域模型”。在DDD里,“领域”指的就是一块业务范围。比如在一个电商系统中,可能会有“商品领域”、“订单领
2020-06-20 17:51:06 1612 1
原创 精尽 Dubbo 源码分析 —— 序列化(一)之总体实现
1. 概述在 《Dubbo 开发指南 —— 序列化扩展.》 ,对序列化定义如下:将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。API 接口,类图如下:2. 源码实现2.1 Serialization/** * Serialization. (SPI, Singleton, ThreadSafe) * * 序列化接口 */@SPI("...
2020-04-18 15:46:12 580 2
原创 精尽 Dubbo 源码分析 —— HTTP 服务器
1.概述Dubbo 的 HTTP 服务器,在 dubbo-remoting-http 模块中实现,使用在 http://、 rest://、hessian://、webservice://协议上。dubbo-remoting-http 模块,类图如下:2.API2.1 HttpServer实现 Resetable 接口,HTTP 服务器接口。方法如下:/** * HTTP 服务器接...
2020-04-15 16:16:58 362
原创 精尽 Dubbo 源码分析 —— 过滤器(一)之 ClassLoaderFilter
1.概述在 ProtocolFilterWrapper 中,在服务引用和暴露时,#buildInvokerChain(invoker, key, group) 方法中,基于 Dubbo SPI Active 机制,加载匹配对应的过滤器数组,创建带有过滤器链的 Invoker 对象。代码如下:/** * 创建带 Filter 链的 Invoker 对象 * * @param invoker...
2020-04-14 16:28:58 407
原创 精尽 Dubbo 源码分析 —— 调用特性(一)之回声测试
1.概述回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。2. 服务消费者com.alibaba.dubbo.rpc.service.EchoService ,Echo 服务接口。代码如下:/** * Echo service. * * 回音服务,用于监控。 * * @export */public interface Echo...
2020-04-14 14:42:06 221
原创 精尽 Dubbo 源码分析 —— 服务调用(四)之远程调用(Hessian)
1.概述Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。本文涉及类图(红圈部分)如下:2. HttpClientConnection实现 HessianConnection 接口,HttpClient 连接器实现类。/** * HttpClientConn...
2020-04-13 23:01:07 284
原创 精尽 Dubbo 源码分析 —— 服务调用(三)之远程调用(HTTP)
1. 概述基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现涉及类图(红圈部分)如下:2. AbstractProxyProtocol现 AbstractProtocol 抽象类,Proxy 协议抽象类。为 HttpProtocol 、RestProtocol 等子类,提供公用的服务暴露、服务引用的公用方法,同时定义了如下抽象方法,用于不同子类协议实...
2020-04-13 17:20:09 558
原创 精尽 Dubbo 源码分析 —— 服务调用(二)之远程调用(Dubbo)【2】同步调用
1.概述在 dubbo:// 协议的调用,一共分成三种:sync 同步调用async 异步调用oneway 单向调用前两种比较好理解,都是基于 Request Response 模型,差异点在异步调用,服务消费者不阻塞等待结果,而是通过回调的方式,处理服务提供者返回的结果。最后一种,基于 Message 模型,发起调用,而不关注等待和关注执行结果。因此,从性能上:oneway >...
2020-04-12 17:46:41 323
原创 精尽 Dubbo 源码分析 —— 服务调用(二)之远程调用(Dubbo)【1】通信实现
1.概述本文涉及类图如下:2.ExchangeHandler在 DubboProtocol 中,实现了 ExchangeHandler ,代码如下:private ExchangeHandler requestHandler = new ExchangeHandlerAdapter() { @Override public Object reply(ExchangeCh...
2020-04-12 15:50:56 404
原创 精尽 Dubbo 源码分析 —— NIO 服务器(五)之 Buffer 层
1. 概述在 dubbo-remoting-api 的 buffer 包中,一方面定义了 ChannelBuffer 和 ChannelBufferFactory 的接口,同时提供了多种默认的实现。整体类图如下:2. ChannelBuffer实现 Comparable 接口,通道 Buffer 接口。2.1 AbstractChannelBuffer实现 ChannelBuffer ...
2020-04-11 18:34:54 240
原创 精尽 Dubbo 源码分析 —— NIO 服务器(四)之 Exchange 层
1.概述exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。
2020-04-11 18:13:55 239
原创 精尽 Dubbo 源码分析 —— NIO 服务器(三)之 Telnet 层
1.概述在 《Dubbo 用户指南 —— Telnet 命令参考手册》 一文中,我们可以看到,Dubbo 支持通过 telnet 命令,用来服务治理。本文涉及类图如下:2.TelnetCodec实现 TransportCodec 类,Telnet 命令编解码器。protected Object decode(Channel channel, ChannelBuffer buffer, ...
2020-04-10 14:37:09 229
原创 精尽 Dubbo 源码分析 —— NIO 服务器(二)之 Transport 层
1.概述dubbo-remoting-api 模块, transport 包,网络传输层。涉及的类图如下:2.AbstractPeer实现 Endpoint、ChannelHandler 接口,Peer 抽象类。/** * AbstractPeer * * Peer 抽象类 */public abstract class AbstractPeer implements End...
2020-04-09 22:57:51 323
原创 精尽 Dubbo 源码分析 —— NIO 服务器(一)之抽象 API
1.概述Dubbo 自己实现的 NIO 服务器,使用在 dubbo:// 和 thrift:// 协议上。2.源码分析dubbo-remoting-api 的项目结构:Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。from 《Dubbo 用户指南 —— dubbo://》本文涉及的类图如下...
2020-04-08 22:20:54 226
原创 精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)
1.概述Dubbo 服务暴露有两种方式本地暴露,JVM 本地调用。配置如下:<dubbo:service scope=“local” /><dubbo:service scope=“remote” />在不配置 scope 的情况下,默认两种方式都暴露。2.doExportUrls本地暴露服务的顺序图如下:我们看到 ServiceConfig#export...
2020-04-08 17:28:01 476
原创 精尽 Dubbo 源码分析 —— 动态代理(二)之 JDK 和 本地存根 Stub
1.概述本文使用 JDK 生成动态代理的代码实现和 Dubbo 本地存根( Stub )的特性。2.JdkProxyFactory实现 AbstractProxyInvoker 抽象类,代码如下:/** * JavaassistRpcProxyFactory */public class JdkProxyFactory extends AbstractProxyFactory {...
2020-04-05 23:03:48 457
原创 精尽 Dubbo 源码分析 —— 动态代理(一)之 Javassist
1.概述在 《Dubbo 用户指南 —— schema 配置参考手册》 中,我们可以看到 <dubbo:service /> 和 <dubbo:reference /> 标签中,可以通过 “proxy” 属性,可以配置动态代理的生成方式:生成动态代理方式,可选:jdk / javassist2.整体流程在 Consumer 中,我们调用 Service 接口的方法...
2020-04-05 22:55:25 465
原创 精尽 Dubbo 源码分析 —— 动态编译(一)之 Javassist
1.概述在 Java 语言中,大多数情况下,我们已经编写好 Java 类,并编译成 Class 文件进行运行。但是在一些场景下,例如动态代理,需要运用到动态编译的技术例如,SPI中的 createAdaptiveExtensionClassCode方法中,我们可以看到如下代码: /** * 自动生成自适应拓展的代码实现,并编译后返回该类。 * * @ret...
2020-04-05 15:06:49 254
原创 精尽 Dubbo 源码分析 —— 注册中心 之 Redis
1.概述看下 《Dubbo 用户指南 —— Redis 注册中心》 文档,内容如下:基于 Redis实现的注册中心 :使用 Redis 的 Key/Map 结构存储数据结构:主 Key 为服务名和类型Map 中的 Key 为 URL 地址Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除类图如下:2. RedisRegistry2.1 属性和构造方...
2020-04-02 21:10:33 484
原创 精尽 Dubbo 源码分析 —— 注册中心抽象 API
1. 概述本文分享 dubbo-registry-api 模块,注册中心模块:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。2. 抽象 API2.1 RegistryFactory注册中心工厂接口,代码如下:/** * 注册中心工厂 */@SPI("dubbo")public interface RegistryFactory { /** * 连...
2020-03-28 16:48:43 236
原创 精尽 Dubbo 源码分析 —— Zookeeper 客户端
1.概述在 dubbo-remoting-zookeeper 模块,实现了 Dubbo 对 Zookeeper 客户端的封装。在该模块中,抽象了通用的 Zookeeper Client API 接口,实现了两种 Zookeeper Client 库的接入:基于 Apache Curator 实现:<dubbo:registry address=“zookeeper://127.0.0....
2020-03-26 21:24:05 252
原创 精尽 Dubbo 源码分析 —— 服务引用
1. 概述Dubbo 服务引用,和 Dubbo 服务暴露一样,也有两种方式:本地引用,JVM 本地调用。远程暴露,网络远程通信。2. 本地引用2.1 createProxy本地引用服务的顺序图如下: /** * 创建 Service 代理对象 * * @param map 集合 * @return 代理对象 */ @Su...
2020-03-22 21:20:34 649
原创 精尽 Dubbo 源码分析 —— 服务暴露
1. 概述Dubbo 服务暴露有两种方式本地暴露,JVM 本地调用。配置如下:远程暴露,网络远程通信。配置如下:在不配置 scope 的情况下,默认两种方式都暴露2.本地暴露2.1 doExportUrls本地暴露服务的顺序图如下:ServiceConfig#export() 方法中,会在配置初始化完成后,调用顺序图的起点 #doExportUrls() 方法,开始暴...
2020-03-09 17:24:08 790
原创 精尽 Dubbo 源码分析 —— Wrapper扩展点 Dubbo AOP实现
概述Dubbo中也支持Spring AOP类似功能,通过装饰者模式,使用包装类包装原始的扩展点实例。在扩展点实现前后插入其他逻辑,实现AOP功能。说这很绕口啊,那什么是包装类呢?举个例子你就知道了class A{ private A a; public A(A a){ this.a = a; } public void do(){ ...
2020-03-07 16:06:05 575
原创 精尽 Dubbo 源码分析 —— SPI 机制
1. 概述SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按照SPI 标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。Dubbo 的扩展点加载从 JDK 标准的 SPI (Serv...
2020-03-01 23:03:05 280
原创 精尽 Dubbo 源码分析 —— 核心流程
1. 概述本文主要分享 Dubbo 的核心流程。在 《Dubbo 开发指南 —— 框架设计.》和《Dubbo 开发指南 —— 实现细节.》2. 框架设计2.1 整体设计图例说明:图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以...
2020-02-29 16:21:54 573
原创 精尽 Dubbo 源码分析 —— API 配置
1. 概述Dubbo 的配置目前提供了四种配置方式:1. API 配置 2. 属性配置 3. XML 配置 4. 注解配置2. 配置一览我们来看看 dubbo-config-api 的项目结构,如下图所示:类之间的关系如图所示:3. Config我们现在按照配置之间的关系,逐步分析3.1 AbstractConfigcom.alibaba.dubbo.config.Abstra...
2020-02-26 16:26:17 356
原创 精尽 Dubbo 源码分析 —— 线程池
1. 概述在 《Dubbo 用户指南 —— 线程模型.》 一文中,我们可以看到 Dubbo 提供了三种线程池的实现:ThreadPoolfixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)cached 缓存线程池,空闲一分钟自动删除,需要时重建。limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题...
2020-02-20 17:11:31 437
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人