jannal(无名小宝)

没有失败,只有缓慢的成功

导航

Dubbo之基础

Dubbo版本

  1. Dubbo版本2.6.7

Dubbo架构

  1. 工作原理

  2. 涉及的角色

    • Provider: 暴露服务的服务提供方。
    • Consumer: 调用远程服务的服务消费方。
    • Registry: 服务注册与发现的注册中心。
    • Monitor: 服务治理平台,提供开发和运维人员服务查询、路由规则、服务 Mock 和测试等治理能力
    • Container:服务运行容器
  3. 调用关系

    • 服务容器负责启动,加载,运行服务提供者。
    • 服务提供者在启动时,向注册中心注册自己提供的服务。
    • 服务消费者在启动时,向注册中心订阅自己所需的服务。
    • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo的优势

  1. 可伸缩性

    • 注册中心可动态增删实例,所有客户端将自动发现新的注册中心
    • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者
  2. 可用性

    • 注册中心是集群,任意宕机可继续提供服务。

    • 注册中心推送的是服务提供者列表,并缓存在消费者本地,注册中心全部宕机并不影响服务调用

    • 监控中心宕机只会丢失统计数据,不影响服务调用

    • 服务提供者无状态,任意一台宕掉后,不影响使用

核心组件

  1. Dubbo核心组件

    组件 描述
    service 业务层。包括业务代码的接口和实现
    config 配置层。主要围绕ServiceConfig(暴露的服务配置)和ReferenceConfig(引用的服务配置)两个实现类展开,初始化配置信息。
    proxy 服务代理层。Dubbo中,服务提供者和消费者都会生成一个代理类。当调用远程接口时,通过代理层自动做远程调用并返回结果,让业务无感
    register 注册层。负责服务注册与发现,当有新的服务加入或服务下线时,注册中心能感知并通知所有订阅方
    cluster 集群容错层。主要负责消费端远程调用失败时的容错策略,特殊调用路径的路由策略
    monitor 监控层。主要监控统计调用次数和调用时间
    protocol 远程调用层,封装RPC调用具体过程。Protocol是Invoke暴露和引用的功能入口,负责管理Invoker的整个生命周期。Invoker是Dubbo的核心模型,框架中所有其他模型都向它靠拢,或者装换成它,它代表一个可执行的调用,可能是一个本地调用,也可能是一个远程调用,还可能是一个集群实现
    exchange 信息交换层。建立请求响应模型,封装请求响应模式,把同步请求转化成异步请求
    transport 网络传输层。把网络传输抽象为统一的接口。
    Serialize 序列化层。二进制流与对象的序列化和反序列

总体调用流程

服务暴露过程

  1. 在Dubbo启动时,服务提供者通过Proxy组件调用具体的Protocol把服务端要暴露的接口封装成Invoker,然后转换成Exporter。打开服务端口,保存服务实例到内存中,最后通过Registry把服务元数据注册到注册中心中

  2. ServiceConfig类引用对外提供服务的实现类ref(如HelloServiceImpl),然后通过ProxyFactory接口的扩展实现类的getInvoker()方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成了具体服务到Invoker的转化。接下来就是Invoker转换到Exporter的过程。Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export()方法中,Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程中,在这个过程中会先启动Netty Server监听服务连接,然后将服务注册到服务注册中心。

消费者调用过程

  1. 调用过程从Proxy开始,Proxy持有了一个Invoker对象。然后发出invoke调用。在invoke调用过程中,需要使用Cluster,Cluster负责容错。Cluster在调用之前会通过Directory获取所有可以调用的远程服务Invoker列表(一个接口可能有多个节点提供服务),如果配置了路由规则(比如指定某些方法只能调用某个节点),那么还会根据路由规则过滤Invoker列表

  2. 通过LoadBalance选出一个可以调用的Invoker,这个Invoker在调用之前会经过一个过滤器链,通常用于处理上下文、限流、计数等

  3. 使用Client做数据传输,传输前做私有协议的构造(Codec)。构造完成,对数据包做序列化处理,然后经过网络传输到服务提供者。服务提供者接收到二进制数据包,使用Codec处理半包、粘包等。处理完成后做反序列处理

  4. 分配此次请求到一个ThreadPool中进行处理。服务提供者会根据请求查找对应的Exporter(持有一个Invoker对象)

  5. 总体流程图

配置总线

  1. Dubbo使用URL统一描述所有对象和配置信息,URL贯穿整个Dubbo框架之中。Dubbo中的URL称之为配置总线或者公共契约,本质可以认为是一个全局的配置类

    1. 一个标准URL的格式
    protocol://username:password@host:port/path?key=value&key=value
    2. Dubbo 中URL示例
    dubbo://192.168.1.3:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=com.alibaba.dubbo.demo.DemoService&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=59124&side=provider&timestamp=1577191564974
    
  2. URL解析

    • protocol:dubbo 协议。
    • username/password:没有用户名和密码。
    • host/port:192.168.1.3:20880
    • path:com.alibaba.dubbo.demo.DemoService
    • parameters:参数键值对,这里是问号后面的参数。
  3. Dubbo中URL类的构造函数

    public URL(String protocol, 
               String username,
               String password, 
               String host, 
               int port, 
               String path,
               Map<String, String> parameters){
      
    }
    
  4. Dubbo中使用URL的好处

    • 使用统一的公共契约进行上下文信息传递
    • 新增参数直接追加到URL参数中,无需改变入参
    • 统一语言,减少开发沟通成本。

posted on 2021-12-25 19:40  jannal  阅读(73)  评论(0编辑  收藏  举报