美文网首页
Dubbo再分析

Dubbo再分析

作者: isuntong | 来源:发表于2020-02-22 19:41 被阅读0次

维基:

远程过程(Remote Procedure Call,缩写为RPC)是一个计算机通信协议。该协议允许运行一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程(java),那么远程过程调用亦可称作远程调用或远程方法调用

HTTP、TCP、socket都是RPC

优点:

  1. 面向接口代理的高性能RPC调用
    提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用的细节

  2. 智能负载均衡
    内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
    随机、轮询、哈希、最少调用
    Service Match进一步让业务更加纯粹,不用修改代码

  3. 服务自动注册与发现
    支持多种注册中心服务,服务实例上下线实时感知。

  4. 高度可扩展能力
    遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

  5. 运行期流量调度
    内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

  6. 可视化的服务治理与运维
    提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

不使用Dubbo的话调用另一个服务的service的话要用HTTP请求,通过Controller获取

手写Dubbo

provider模块:提供API、实现API、暴露(启动tomcat,nettyServer)、服务本地注册、服务注册中心注册

Consumer:拿接口名从注册中心获取服务地址、调用服务

Registry模块:保存服务配置信息(服务名:List<URL>)

RpcProtocol模块:基于Tomcat的HttpProtocol、基于Netty的DubboProtocol

Framework模块:框架实现

netty、Dubbo spi

Java SPI

java.sql.java是一个接口,其他数据库继承之后修改驱动实现扩展

java spi 不能单独的获得某个指定的实现类
java spi 没有IOC、AOP

  • 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
  • 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
  • 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
  • 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
调用链:

调用步骤:
代理对象如果有其他功能由Filter介入,否则用cluster封装多个invoker,多个invoker时可以选择一种负载均衡机制,调用错了还会有重试。

在负载均衡期间还会有其他filter介入统计一些数据,最终执行的还是Dubbo协议下的invoker,调用的底层时client发送请求,底层就是netty客户端连接服务器发送请求,服务器收到数据以后,解码返回,再由代理对象交给我们。

领域模型

在 Dubbo 的核心领域模型中:

  • Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。
  • Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
  • Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等。

基本设计原则

采用 Microkernel + Plugin 模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换。
采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息。

相关文章

网友评论

      本文标题:Dubbo再分析

      本文链接:https://www.haomeiwen.com/subject/oewhqhtx.html