
dubbo源码解析
青花鱼罐头丨
java后台开发
展开
-
精尽 Dubbo 源码分析 —— 序列化(一)之总体实现
1. 概述在 《Dubbo 开发指南 —— 序列化扩展.》 ,对序列化定义如下:将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。API 接口,类图如下:2. 源码实现2.1 Serialization/** * Serialization. (SPI, Singleton, ThreadSafe) * * 序列化接口 */@SPI("...原创 2020-04-18 15:46:12 · 660 阅读 · 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 · 388 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 过滤器(一)之 ClassLoaderFilter
1.概述在 ProtocolFilterWrapper 中,在服务引用和暴露时,#buildInvokerChain(invoker, key, group) 方法中,基于 Dubbo SPI Active 机制,加载匹配对应的过滤器数组,创建带有过滤器链的 Invoker 对象。代码如下:/** * 创建带 Filter 链的 Invoker 对象 * * @param invoker...原创 2020-04-14 16:28:58 · 435 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 调用特性(一)之回声测试
1.概述回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。2. 服务消费者com.alibaba.dubbo.rpc.service.EchoService ,Echo 服务接口。代码如下:/** * Echo service. * * 回音服务,用于监控。 * * @export */public interface Echo...原创 2020-04-14 14:42:06 · 242 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务调用(四)之远程调用(Hessian)
1.概述Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。本文涉及类图(红圈部分)如下:2. HttpClientConnection实现 HessianConnection 接口,HttpClient 连接器实现类。/** * HttpClientConn...原创 2020-04-13 23:01:07 · 307 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务调用(三)之远程调用(HTTP)
1. 概述基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现涉及类图(红圈部分)如下:2. AbstractProxyProtocol现 AbstractProtocol 抽象类,Proxy 协议抽象类。为 HttpProtocol 、RestProtocol 等子类,提供公用的服务暴露、服务引用的公用方法,同时定义了如下抽象方法,用于不同子类协议实...原创 2020-04-13 17:20:09 · 610 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务调用(二)之远程调用(Dubbo)【2】同步调用
1.概述在 dubbo:// 协议的调用,一共分成三种:sync 同步调用async 异步调用oneway 单向调用前两种比较好理解,都是基于 Request Response 模型,差异点在异步调用,服务消费者不阻塞等待结果,而是通过回调的方式,处理服务提供者返回的结果。最后一种,基于 Message 模型,发起调用,而不关注等待和关注执行结果。因此,从性能上:oneway >...原创 2020-04-12 17:46:41 · 354 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务调用(二)之远程调用(Dubbo)【1】通信实现
1.概述本文涉及类图如下:2.ExchangeHandler在 DubboProtocol 中,实现了 ExchangeHandler ,代码如下:private ExchangeHandler requestHandler = new ExchangeHandlerAdapter() { @Override public Object reply(ExchangeCh...原创 2020-04-12 15:50:56 · 421 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— NIO 服务器(五)之 Buffer 层
1. 概述在 dubbo-remoting-api 的 buffer 包中,一方面定义了 ChannelBuffer 和 ChannelBufferFactory 的接口,同时提供了多种默认的实现。整体类图如下:2. ChannelBuffer实现 Comparable 接口,通道 Buffer 接口。2.1 AbstractChannelBuffer实现 ChannelBuffer ...原创 2020-04-11 18:34:54 · 260 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— NIO 服务器(四)之 Exchange 层
1.概述exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。原创 2020-04-11 18:13:55 · 265 阅读 · 0 评论 -
精尽 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 · 249 阅读 · 0 评论 -
精尽 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 · 348 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— NIO 服务器(一)之抽象 API
1.概述Dubbo 自己实现的 NIO 服务器,使用在 dubbo:// 和 thrift:// 协议上。2.源码分析dubbo-remoting-api 的项目结构:Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。from 《Dubbo 用户指南 —— dubbo://》本文涉及的类图如下...原创 2020-04-08 22:20:54 · 245 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务暴露(一)之本地暴露(Injvm)
1.概述Dubbo 服务暴露有两种方式本地暴露,JVM 本地调用。配置如下:<dubbo:service scope=“local” /><dubbo:service scope=“remote” />在不配置 scope 的情况下,默认两种方式都暴露。2.doExportUrls本地暴露服务的顺序图如下:我们看到 ServiceConfig#export...原创 2020-04-08 17:28:01 · 498 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 动态代理(二)之 JDK 和 本地存根 Stub
1.概述本文使用 JDK 生成动态代理的代码实现和 Dubbo 本地存根( Stub )的特性。2.JdkProxyFactory实现 AbstractProxyInvoker 抽象类,代码如下:/** * JavaassistRpcProxyFactory */public class JdkProxyFactory extends AbstractProxyFactory {...原创 2020-04-05 23:03:48 · 481 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 动态代理(一)之 Javassist
1.概述在 《Dubbo 用户指南 —— schema 配置参考手册》 中,我们可以看到 <dubbo:service /> 和 <dubbo:reference /> 标签中,可以通过 “proxy” 属性,可以配置动态代理的生成方式:生成动态代理方式,可选:jdk / javassist2.整体流程在 Consumer 中,我们调用 Service 接口的方法...原创 2020-04-05 22:55:25 · 500 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 动态编译(一)之 Javassist
1.概述在 Java 语言中,大多数情况下,我们已经编写好 Java 类,并编译成 Class 文件进行运行。但是在一些场景下,例如动态代理,需要运用到动态编译的技术例如,SPI中的 createAdaptiveExtensionClassCode方法中,我们可以看到如下代码: /** * 自动生成自适应拓展的代码实现,并编译后返回该类。 * * @ret...原创 2020-04-05 15:06:49 · 280 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 注册中心 之 Redis
1.概述看下 《Dubbo 用户指南 —— Redis 注册中心》 文档,内容如下:基于 Redis实现的注册中心 :使用 Redis 的 Key/Map 结构存储数据结构:主 Key 为服务名和类型Map 中的 Key 为 URL 地址Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除类图如下:2. RedisRegistry2.1 属性和构造方...原创 2020-04-02 21:10:33 · 628 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 注册中心抽象 API
1. 概述本文分享 dubbo-registry-api 模块,注册中心模块:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。2. 抽象 API2.1 RegistryFactory注册中心工厂接口,代码如下:/** * 注册中心工厂 */@SPI("dubbo")public interface RegistryFactory { /** * 连...原创 2020-03-28 16:48:43 · 249 阅读 · 0 评论 -
精尽 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 · 266 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务引用
1. 概述Dubbo 服务引用,和 Dubbo 服务暴露一样,也有两种方式:本地引用,JVM 本地调用。远程暴露,网络远程通信。2. 本地引用2.1 createProxy本地引用服务的顺序图如下: /** * 创建 Service 代理对象 * * @param map 集合 * @return 代理对象 */ @Su...原创 2020-03-22 21:20:34 · 702 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 服务暴露
1. 概述Dubbo 服务暴露有两种方式本地暴露,JVM 本地调用。配置如下:远程暴露,网络远程通信。配置如下:在不配置 scope 的情况下,默认两种方式都暴露2.本地暴露2.1 doExportUrls本地暴露服务的顺序图如下:ServiceConfig#export() 方法中,会在配置初始化完成后,调用顺序图的起点 #doExportUrls() 方法,开始暴...原创 2020-03-09 17:24:08 · 831 阅读 · 0 评论 -
精尽 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 · 618 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— SPI 机制
1. 概述SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按照SPI 标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。Dubbo 的扩展点加载从 JDK 标准的 SPI (Serv...原创 2020-03-01 23:03:05 · 309 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 核心流程
1. 概述本文主要分享 Dubbo 的核心流程。在 《Dubbo 开发指南 —— 框架设计.》和《Dubbo 开发指南 —— 实现细节.》2. 框架设计2.1 整体设计图例说明:图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以...原创 2020-02-29 16:21:54 · 656 阅读 · 0 评论 -
精尽 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 · 388 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 线程池
1. 概述在 《Dubbo 用户指南 —— 线程模型.》 一文中,我们可以看到 Dubbo 提供了三种线程池的实现:ThreadPoolfixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)cached 缓存线程池,空闲一分钟自动删除,需要时重建。limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题...原创 2020-02-20 17:11:31 · 482 阅读 · 0 评论 -
精尽 Dubbo 源码分析 —— 属性配置
1. 概述属性配置如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器中共享配置,那么,我们可以直接使用 dubbo.properties作为默认配置。Dubbo可以自动加载classpath根目录下的dubbo.properties,但是你同样可以使用JVM参数来指定路径:-Ddubbo.properties.file=xxx.properties。重写与优先...原创 2020-02-05 16:05:08 · 604 阅读 · 0 评论