摘要: 原创出处 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢!
1.【芋艿】精尽 Dubbo 原理与源码专栏
2.【老徐】RPC 专栏
3.【肥朝】Dubbo 源码解析
4.【MR_QI】Dubbo 源码解析
5.【杨武兵】Dubbo 源码解析
666. 彩蛋
关注**微信公众号:【芋道源码】**有福利:
RocketMQ / MyCAT / Sharding-JDBC 所有 源码分析文章列表
RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
您对于源码的疑问每条留言 都 将得到 认真 回复。 甚至不知道如何读源码也可以请教噢 。
新的 源码解析文章 实时 收到通知。 每周更新一篇左右 。
认真的 源码交流微信群。
1. 【芋艿】精尽 Dubbo 原理与源码专栏
作者:芋艿
只更新在笔者的知识星球,欢迎加入一起讨论 Dubbo 源码与实现 。
目前已经有 600+ 位球友加入...
进度:已经完成 69+ 篇,预计总共 75+ 篇,完成度 92% 。
对应 Dubbo 版本号: 2.6.X
1.1 目录
调试环境搭建
《精尽 Dubbo 源码分析 —— 调试环境搭建》
项目结构一览
《精尽 Dubbo 源码分析 —— 项目结构一览》
配置 Configuration
《精尽 Dubbo 源码解析 —— API 配置(一)之应用》
《精尽 Dubbo 源码解析 —— API 配置(二)之服务提供者》
《精尽 Dubbo 源码解析 —— API 配置(三)之服务消费者》
《精尽 Dubbo 源码分析 —— 属性配置》
《精近 Dubbo 源码解析 —— XML 配置》
[ ] 《精尽 Dubbo 源码解析 —— 注解配置》
[ ] 《精尽 Dubbo 源码解析 —— 外部化配置》
[ ] 《精尽 Dubbo 源码解析 —— 自动装配》
核心流程一览
《精近 Dubbo 源码解析 —— 核心流程一览》
拓展机制 SPI
《精尽 Dubbo 源码分析 —— 拓展机制 SPI》
线程池
服务暴露 Export
《精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)》
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
服务引用 Refer
《精尽 Dubbo 源码分析 —— 服务引用(一)之本地引用(Injvm)》
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
注册中心 Registry
《精尽 Dubbo 源码分析 —— Zookeeper 客户端》
《精尽 Dubbo 源码分析 —— 注册中心(一)之抽象 API》
《精尽 Dubbo 源码分析 —— 注册中心(二)之 Zookeeper》
《精尽 Dubbo 源码分析 —— 注册中心(三)之 Redis》
《精尽 Dubbo 源码分析 —— 注册中心(四)之 Simple 》
《精尽 Dubbo 源码分析 —— 注册中心(五)之 Multicast 》
动态编译 Compile
《精尽 Dubbo 源码分析 —— 动态编译(一)之 Javassist》
《精尽 Dubbo 源码分析 —— 动态编译(二)之 JDK》
动态代理 Proxy
《精尽 Dubbo 源码分析 —— 动态代理(一)之 Javassist》
《精尽 Dubbo 源码分析 —— 动态代理(二)之 JDK》
《精尽 Dubbo 源码分析 —— 动态代理(三)之本地存根 Stub》
服务调用 Invoke
《精尽 Dubbo 源码分析 —— 服务调用(一)之本地调用(Injvm)》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【1】通信实现》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【2】同步调用》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【3】异步调用》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【4】参数回调》
《精尽 Dubbo 源码解析 —— 服务调用(三)之远程调用(HTTP)》
《精尽 Dubbo 源码解析 —— 服务调用(四)之远程调用(Hessian)》
《精尽 Dubbo 源码解析 —— 服务调用(五)之远程调用(Webservice)》
《精尽 Dubbo 源码解析 —— 服务调用(六)之远程调用(REST)》
《精尽 Dubbo 源码解析 —— 服务调用(七)之远程调用(RMI)》
《精尽 Dubbo 源码解析 —— 服务调用(八)之远程调用(Redis)》
《精尽 Dubbo 源码解析 —— 服务调用(九)之远程调用(Memcached)》
《精尽 Dubbo 源码解析 —— 服务调用(十)之远程调用(Thrift)》
调用特性
《精尽 Dubbo 源码解析 —— 调用特性(一)之回音测试》
《精尽 Dubbo 源码解析 —— 调用特性(二)之泛化引用》
《精尽 Dubbo 源码解析 —— 调用特性(三)之泛化实现》
过滤器 Filter
《精尽 Dubbo 源码解析 —— 过滤器(一)之 ClassLoaderFilter》
《精尽 Dubbo 源码解析 —— 过滤器(二)之 ContextFilter》
《精尽 Dubbo 源码解析 —— 过滤器(三)之 AccessLogFilter》
《精尽 Dubbo 源码分析 —— 过滤器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
《精尽 Dubbo 源码分析 —— 过滤器(五)之 TimeoutFilter》
《精尽 Dubbo 源码分析 —— 过滤器(六)之 DeprecatedFilter》
《精尽 Dubbo 源码分析 —— 过滤器(七)之 ExceptionFilter》
《精尽 Dubbo 源码分析 —— 过滤器(八)之 TokenFilter》
《精尽 Dubbo 源码分析 —— 过滤器(九)之 TpsLimitFilter》
《精尽 Dubbo 源码分析 —— 过滤器(十)之 CacheFilter》
《精尽 Dubbo 源码分析 —— 过滤器(十一)之 ValidationFilter》
NIO 服务器
《精尽 Dubbo 源码分析 —— NIO 服务器(一)之抽象 API》
《精尽 Dubbo 源码分析 —— NIO 服务器(二)之 Transport 层》
《精尽 Dubbo 源码分析 —— NIO 服务器(三)之 Telnet 层》
《精尽 Dubbo 源码分析 —— NIO 服务器(四)之 Exchange 层》
《精尽 Dubbo 源码分析 —— NIO 服务器(五)之 Buffer 层》
《精尽 Dubbo 源码分析 —— NIO 服务器(六)之 Netty4 实现》
《精尽 Dubbo 源码分析 —— NIO 服务器(七)之 Netty3 实现》
《精尽 Dubbo 源码分析 —— NIO 服务器(八)之 Mina1 实现》
《精尽 Dubbo 源码分析 —— NIO 服务器(九)之 Grizzly 实现》
P2P 服务器
《精尽 Dubbo 源码分析 —— P2P 服务器》
HTTP 服务器
《精尽 Dubbo 源码分析 —— HTTP 服务器》
序列化 Serialization
《精尽 Dubbo 源码分析 —— 序列化(一)之 总体实现》
《精尽 Dubbo 源码分析 —— 序列化(二)之 Dubbo 实现》
《精尽 Dubbo 源码分析 —— 序列化(三)之 Kryo 实现》
服务容器 Container
集群容错 Cluster
《精尽 Dubbo 源码解析 —— 集群容错(一)之抽象 API》
《精尽 Dubbo 源码解析 —— 集群容错(二)之 Cluster 实现》
《精尽 Dubbo 源码解析 —— 集群容错(三)之 Directory 实现》
《精尽 Dubbo 源码解析 —— 集群容错(四)之 Loadbalance 实现》
《精尽 Dubbo 源码解析 —— 集群容错(五)之 Merger 实现》
《精尽 Dubbo 源码解析 —— 集群容错(六)之 Configurator 实现》
《精尽 Dubbo 源码解析 —— 集群容错(七)之 Router 实现》
《精尽 Dubbo 源码解析 —— 集群容错(八)之 Mock 实现》
优雅停机
日志适配
状态检查
监控中心 Monitor
管理中心 Admin
运维命令 QOS
链路追踪 Tracing
《SkyWalking 源码分析 —— Agent 插件(二)之 Dubbo》
ps:
小圆点代表已完成;
小方块代表未来计划完成
钟华贤代表不考虑写
1.2 Dubbo 用户指南
本小节,我们将《精尽 Dubbo 源码解析》和《Dubbo 用户指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地方,欢迎大家给我留言斧正。
【<2> 快速启动】
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展进行加载。
如果不想使用 Spring 配置,可以通过API 的方式 进行调用。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 调试环境搭建》
【<5.1> XML 配置】
有关 XML 的详细配置项,请参见:配置参考手册。如果不想使用 Spring 配置,而希望通过 API 的方式进行调用,请参见:API配置。想知道如何使用配置,请参见:快速启动。
对应源码解析文章:
《精近 Dubbo 源码解析 —— XML 配置》
【<5.2> 属性配置】
如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。
Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx.properties
改变缺省配置位置。1
对应源码解析文章:
【<5.3> API 配置】
API 属性与配置项一对一,各属性含义,请参见:配置参考手册,比如: ApplicationConfig.setName("xxx")
对应 <dubbo:application name="xxx" />
1
对应源码解析文章:
《精尽 Dubbo 源码解析 —— API 配置(一)之应用》
《精尽 Dubbo 源码解析 —— API 配置(二)之服务提供者》
《精尽 Dubbo 源码解析 —— API 配置(三)之服务消费者》
【<5.4> 注解配置】
需要 2.5.7
及以上版本支持
对应源码解析文章:
[ ] 《精尽 Dubbo 源码解析 —— 注解配置》
【<6.1> 启动时检查】
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"
。
可以通过 check="false"
关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false"
,总是会返回引用,当服务恢复时,能自动连上。
注意 ,服务提供者注册失败,是没有启动检查功能的。这一点,笔者一直理解错了。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 注册中心(一)之抽象 API》
【<6.2> 集群容错】
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(一)之抽象 API》
《精尽 Dubbo 源码解析 —— 集群容错(二)之 Cluster 实现》
《精尽 Dubbo 源码解析 —— 集群容错(三)之 Directory 实现》
【<6.3> 负载均衡】
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random
随机调用。
可以自行扩展负载均衡策略,参见:负载均衡扩展
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(四)之 Loadbalance 实现》
【<6.4> 线程模型】
如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。
如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
对应源码解析文章:
【<6.5> 直连提供者】
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
【<6.6> 只订阅】
为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。
可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务引用(一)之本地暴露(Injvm)》
【<6.7> 只注册】
如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务引用(一)之本地暴露(Injvm)》
【<6.8> 静态服务】
有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 注册中心(二)之 Zookeeper》
《精尽 Dubbo 源码分析 —— 注册中心(三)之 Redis》
【<6.9> 多协议】
Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)》
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
【<6.10> 多注册中心】
Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)》
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
《精尽 Dubbo 源码分析 —— 服务引用(一)之本地引用(Injvm)》
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
【<6.11> 服务分组】
当一个接口有多种实现时,可以用 group 区分。
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
【<6.12> 多版本】
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
在低压力时间段,先升级一半提供者为新版本
再将所有消费者升级为新版本
然后将剩下的一半提供者升级为新版本
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【2】同步调用》
【<6.13> 分组聚合】
按组合并返回结果1,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(五)之 Merger 实现》
【<6.14> 参数验证】
参数验证功能1 是基于JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证2。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 过滤器(十一)之 ValidationFilter》
【<6.15> 结果缓存】
结果缓存1,用于加速热门数据的访问速度,Dubbo 提供声明式缓存,以减少用户加缓存的工作量2。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 过滤器(十)之 CacheFilter》
【<6.16> 泛化引用】
泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map
表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService
调用所有服务实现。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 调用特性(二)之泛化引用》
【<6.17> 泛化实现】
泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 调用特性(三)之泛化实现》
【<6.18> 回声测试】
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
所有服务自动实现 EchoService
接口,只需将任意服务引用强制转型为 EchoService
,即可使用。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 调用特性(一)之回音测试》
【<6.19> 上下文信息】
上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为 URL 的参数,参见schema 配置参考手册 中的 对应URL参数 一列。
RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 过滤器(二)之 ContextFilter》
【<6.20> 隐式参数】
可以通过 RpcContext
上的 setAttachment
和 getAttachment
在服务消费方和提供方之间进行参数的隐式传递。1
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 过滤器(二)之 ContextFilter》
【<6.21> 异步调用】
基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。1
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【3】异步调用》
【<6.22> 本地调用】
本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务调用(一)之本地调用(Injvm)》
【<6.23> 参数回调】
参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑1。可以参考 dubbo 项目中的示例代码 。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【4】参数回调》
【<6.24> 事件通知】
在调用之前、调用之后、出现异常时,会触发 oninvoke
、 onreturn
、 onthrow
三个事件,可以配置当事件发生时,通知哪个类的哪个方法1。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【3】异步调用》
【<6.25> 本地存根】
远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub1,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 动态代理(三)之本地存根 Stub》
【<6.26> 本地伪装】
本地伪装1 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(八)之 Mock 实现》
【<6.27> 延迟暴露】
如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— API 配置(二)之服务提供者》
【<6.28> 并发控制】
限制 com.foo.BarService
的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个
限制 com.foo.BarService
的 sayHello
方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个
限制 com.foo.BarService
的每个方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个
限制 com.foo.BarService
的 sayHello
方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 过滤器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
《精尽 Dubbo 源码解析 —— 集群容错(四)之 Loadbalance 实现》
【<6.29> 连接控制】
限制服务器端接受的连接不能超过 10 个1:
限制客户端服务使用连接不能超过 10 个2:
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 过滤器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
【<6.30> 延迟连接】
延迟连接用于减少长连接数。当有调用发起时,再创建长连接。1
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【1】通信实现》
【<6.31> 粘滞连接】
粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。
粘滞连接将自动开启延迟连接,以减少长连接数。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(一)之抽象 API》
【<6.32> 令牌验证】
通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 过滤器(八)之 TokenFilter》
【<6.33> 路由规则】
路由规则1 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展2。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(七)之 Router 实现》
【<6.34> 配置规则】
向注册中心写入动态配置覆盖规则1。该功能通常由监控中心或治理中心的页面完成。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(六)之 Configurator 实现》
【<6.35> 服务降级】
可以通过服务降级功能1 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 集群容错(八)之 Mock 实现》
【<6.36> 优雅停机】
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用 kill -9 PID
等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID
时,才会执行。
对应源码解析文章:
【<6.37> 主机绑定】
缺省主机 IP 查找顺序:
LocalHost.getLocalHost()
127.*
对应源码解析文章:
《精尽 Dubbo 源码解析 —— API 配置(二)之服务提供者》
【<6.38> 日志适配】
自 2.2.1
开始,dubbo 开始内置 log4j、slf4j、jcl、jdk 这些日志框架的适配1,也可以通过以下方式显示配置日志输出策略:
dubbo.properties
dubbo.xml
对应源码解析文章:
【<6.39> 访问日志】
如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。 注意 :此日志量比较大,请注意磁盘容量。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 过滤器(三)之 AccessLogFilter》
【<6.40> 服务容器】
服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。
服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。
服务容器的加载内容可以扩展,内置了 spring, jetty, log4j 等加载,可通过容器扩展点进行扩展。配置配在 java 命令的 -D 参数或者 dubbo.properties
中。
对应源码解析文章:
【<6.41> ReferenceConfig 缓存】
ReferenceConfig
实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存。否则重复生成 ReferenceConfig
可能造成性能问题并且会有内存和连接泄漏。在 API 方式编程时,容易忽略此问题。
因此,自 2.4.0
版本开始, dubbo 提供了简单的工具类 ReferenceConfigCache
用于缓存 ReferenceConfig
实例。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— API 配置(三)之服务消费者》
【<6.42> 分布式事务】
分布式事务基于 JTA/XA 规范实现1。
两阶段提交:
目前该功能暂未实现,如下是推荐阅读的内容:
《RocketMQ 源码分析 —— 事务消息》
《Sharding-JDBC 源码分析 —— 分布式事务(一)之最大努力型》
《MyCAT 源码分析 —— XA分布式事务》
《TCC-Transaction 源码解析 —— 精品合集》
《Happylifeplat-TCC 源码解析 —— 精品合集》
《Myth 源码解析 —— 精品合集》
【<6.43> 线程栈自动dump】
当业务线程池满时,我们需要知道线程都在等待哪些资源、条件,以找到系统的瓶颈点或异常点。dubbo通过Jstack自动导出线程堆栈来保留现场,方便排查问题
默认策略:
导出路径,user.home标识的用户主目录
导出间隔,最短间隔允许每隔10分钟导出一次
对应源码解析文章:
【<6.44> Netty4】
dubbo 2.5.6版本新增了对netty4通信模块的支持
对应源码解析文章:
《精尽 Dubbo 源码分析 —— NIO 服务器(六)之 Netty4 实现》
【<8> schema 配置参考手册】
这里以 XML Config1 为准,列举所有配置项2。其它配置方式,请参见相应转换关系:属性配置, 注解配置 , API 配置 。
对应源码解析文章:
《精近 Dubbo 源码解析 —— XML 配置》
【<9.1> dubbo://】
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【1】通信实现》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【2】同步调用》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【3】异步调用》
《精尽 Dubbo 源码解析 —— 服务调用(二)之远程调用(Dubbo)【4】参数回调》
【<9.2> rmi://】
RMI 协议采用 JDK 标准的 java.rmi.*
实现,采用阻塞式短连接和 JDK 标准序列化方式。
注意:如果正在使用 RMI 提供服务给外部访问1,同时应用里依赖了老的 common-collections 包2 的情况下,存在反序列化安全风险3。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(七)之远程调用(RMI)》
【<9.3> hessian://】
Hessian1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:
提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用
或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(四)之远程调用(Hessian)》
【<9.4> http://】
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现1
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(三)之远程调用(HTTP)》
【<9.5> webservice://】
基于 WebService 的远程调用协议,基于Apache CXF 1 的 frontend-simple
和 transports-http
实现2。
可以和原生 WebService 服务互操作,即:
提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,
或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协议调用。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(五)之远程调用(Webservice)》
【<9.6> thrift://】
当前 dubbo 支持1的 thrift 协议是对 thrift 原生协议2 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。
使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(十)之远程调用(Thrift)》
【<9.7> memcached://】
基于 memcached1 实现的 RPC 协议2。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(九)之远程调用(Memcached)》
【<9.8> redis://】
基于 Redis1 实现的 RPC 协议2。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(八)之远程调用(Redis)》
【<9.9> rest://】
对应文档为
《在Dubbo中开发REST风格的远程调用(RESTful Remoting)》 。
对应源码解析文章:
《精尽 Dubbo 源码解析 —— 服务调用(六)之远程调用(REST)》
【<10.1> Multicast 注册中心】
Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。
unicast=false
组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 注册中心(五)之 Multicast 》
【<10.2> zookeeper 注册中心】
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用1。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— Zookeeper 客户端》
《精尽 Dubbo 源码分析 —— 注册中心(一)之抽象 API》
《精尽 Dubbo 源码分析 —— 注册中心(二)之 Zookeeper》
【<10.3> Redis 注册中心】
基于 Redis1 实现的注册中心2。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 注册中心(三)之 Redis》
【<10.4> Simple 注册中心】
Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 注册中心(四)之 Simple 》
【<11> Telnet 命令参考手册】
从 2.0.5
版本开始,dubbo 开始支持通过 telnet 命令来镜像服务治理。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— NIO 服务器(三)之 Telnet 层》
【<12> 在线运维命令-QOS】
dubbo 2.5.8 新版本重构了 telnet 模块,提供了新的 telnet 命令支持。
对应源码解析文章:
TODO
dubbo-ops
1.3 Dubbo 开发指南
本小节,我们将《精尽 Dubbo 源码解析》和《Dubbo 开发指南》 做一次映射,方便大家直接找到感兴趣的功能的具体源码实现。当然,如果有整理不到位的地方,欢迎大家给我留言斧正。
【<1> 源码构建】
代码签出
分支
构建
构建源代码 jar 包
IDE 支持
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 调试环境搭建》
【<2> 框架设计】
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 项目结构一览》
《精近 Dubbo 源码解析 —— 核心流程一览》
【<3> 扩展点加载】
Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。
Dubbo 改进了 JDK 标准的 SPI 的以下问题:
getName()
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 拓展机制 SPI》
【<5.1> 协议扩展】
RPC 协议扩展,封装远程调用细节。
契约:
当用户调用 refer()
所返回的 Invoker
对象的 invoke()
方法时,协议需相应执行同 URL 远端 export()
传入的 Invoker
对象的 invoke()
方法。
其中, refer()
返回的 Invoker
由协议实现,协议通常需要在此 Invoker
中发送远程请求, export()
传入的 Invoker
由框架实现并传入,协议不需要关心。
注意:
协议不关心业务接口的透明代理,以 Invoker
为中心,由外层将 Invoker
转换为业务接口。
协议不一定要是 TCP 网络通讯,比如通过共享文件,IPC 进程间通讯等。
对应源码解析文章:
《精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)》
《精尽 Dubbo 源码分析 —— 服务暴露(二)之远程暴露(Dubbo)》
《精尽 Dubbo 源码分析 —— 服务引用(一)之本地引用(Injvm)》
《精尽 Dubbo 源码分析 —— 服务引用(二)之远程引用(Dubbo)》
https://juejin.im/post/5b2d928ff265da597e35a784