Dubbo是一个JavaRPC框架,致力于提供高性能的RPC远程服务调用解决方案。下面我将着重讲解Dubbo的原理和机制@mikechen目录Dubbo核心功能Dubbo核心组件Dubbo架构设计Dubbo调用流程Dubbo核心功能Dubbo主要提供三个核心功能:面向接口的远程方法调用、智能容错和负载均衡和服务会自动注册和发现。1)远程方法调用网络通信框架,它提供了各种NIO框架的抽象封装,包括“同步到异步”和“请求-响应”模式的信息交换方式。2)智能容错和负载均衡提供基于接口方法的透明远程过程调用,包括多协议支持,软负载均衡、容错、地址路由、动态配置等集群支持。3)服务注册与发现服务注册,基于注册中心目录服务,使服务消费者能够动态发现服务提供者,使地址透明化,使服务提供者能够平滑地增减机器。Dubbo核心组件Dubbo角色主要包括以下核心组件:1)Registry(注册中心)生产者在这里注册和发布内容,消费者在这里订阅和接收发布的内容。2)消费者(consumer)客户端从注册中心获取方法,可以调用生产者中的方法。3)producer(provider)服务器,生产内容,生产前需要依赖容器(先启动容器)。4)容器(container)生产者启动并执行时,必须依赖容器才能正常启动(默认依赖spring容器),5)监控器(Monitor)统计服务调用的次数和时间。Dubbo的架构设计Dubbo的整体架构如下图所示:图中左侧浅蓝色背景的界面是服务消费者使用的界面,右侧浅绿色背景的界面是服务消费者使用的界面。服务商使用的接口,中轴上的接口是双方使用的接口。Dubbo框架设计分为10层:1.服务接口层(Service)该层与实际业务逻辑相关,根据服务提供者和服务消费者的业务设计相应的接口和实现。2、配置层(Config)的对外配置接口,以ServiceConfig和ReferenceConfig为核心,可以直接新建配置类,也可以通过spring解析配置生成配置类。3、服务代理层(Proxy)是服务接口的透明代理,生成服务客户端Stub和服务端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。4、服务注册层(Registry)封装了服务地址的注册和发现,以服务URL为中心,扩展接口有RegistryFactory、Registry和RegistryService。可能没有服务注册中心,在这种情况下,服务提供者直接公开服务。5、集群层(Cluster)封装了多个provider的路由和负载均衡,桥接注册中心,以Invoker为中心,扩展接口有Cluster、Directory、Router和LoadBalance。将多个服务提供者合并为一个服务提供者,对服务消费者来说是透明的,只需要与一个服务提供者进行交互。6、监控层(Monitor)监控RPC调用次数和调用时间,以Statistics为中心,扩展接口有MonitorFactory、Monitor和MonitorService。7、远程调用层(Protocol)封装RPC调用,以Invocation和Result为中心,扩展接口有Protocol、Invoker和Exporter。Protocol即服务域,是Invoker暴露和引用的主要功能入口,负责Invoker的生命周期管理。调用者是一个实体域。它是Dubbo的核心模型。其他模型依赖它,或将其转换为它。它代表一个可执行体,可以向它发起invoke调用。可能是本地实现,也可能是远程实现,也可能是集群实现。8、信息交换层(Exchange)封装了请求-响应模式,从同步到异步,以Request和Response为中心,扩展接口有Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。9、网络传输层(Transport)将mina和netty抽象为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server、Codec。10、数据序列化层(Serialize)的一些可复用工具,扩展接口有Seri??alization、ObjectInput、ObjectOutput和ThreadPool。对比上面的整体架构图,Dubbo调用流程大致分为以下8大步骤:1、服务提供者启动,启动Netty服务,创建Zookeeper客户端,向注册中心注册服务;2、服务消费者启动,通过Zookeeper到注册中心获取服务提供者列表,通过Netty与服务提供者建立长连接;3、服务消费者开始通过接口远程调用服务,ProxyFactory初始化Proxy对象,Proxy创建动态代理对象;4、动态代理对象通过invoke方法,层层封装生成一个Invoker对象,其中包含一个代理对象;5、Invoker通过路由和负载均衡选择最合适的服务提供者,通过添加各种过滤器DubboInvoker对象生成新的协议层封装;6、然后将DubboInvoker对象通过exchange包装成一个Reuqest对象,对象通过NettyClient通过序列化传输到服务提供者的NettyServer端;解密等操作生成一个DubboExporter对象,然后层层传递,在服务提供者端生成一个Invoker对象;8、这个Invoker对象会调用本地的服务,获取结果并通过层层回调返回给服务消费者,服务消费者拿到结果后进行解析,得到最终的结果。作者简介陈锐|mikechen,10年+大厂架构经验,《mikechen的互联网架构》系列文章作者,专注于互联网架构技术。更多技术文章合集JavaConcurrency|JVM|MySQL|Spring|Redis|Distributed|HighConcurrency等阅读《mikechen的互联网架构》更多合集,关注“mikechen的互联网架构”?,回复【架构】获取
