dubbo学习 基础和总体架构

dubbo简介 :

     dubbo是一个分布式的RPC框架,核心设计原则是:微内核 + 插件体系

dubbo架构图

总体技术架构针对 总体架构是什么_远程调用


        服务提供方启动时会将服务信息注册到注册中心(服务ip,端口等),服务消费方在启动时不仅将自身信息注册到注册中心,同时会从注册中心订阅服务提供方的所有数据(第一次订阅会拉取所有信息).

        当注册中心中数据变更(provider变化),注册中心会把数据推送给消费者;获取到服务调用方数据后,服务消费者可以发起RPC调用;在调用前后会向监控中心上报统计信息(调用url,并发数等);

        至此,整个流程结束

dubbo的优点 :

  1. 高性能的rpc调用
  2. 服务的自动注册与发现(适配多种注册中心)
  3. 自动负载容错(容错机制)
  4. 动态流量调(管理控制台实现)
  5. 依赖分析与调用设计(接入第三方分布式链路追踪与性能分析)

  6. dubbo架构图
       dubbo的总体分为业务层(Biz),RPC层,Remote三层

    分层描述 :
        红色: 总体层
        蓝色: 细分层(API层)
        灰色: 细分层(SPI层)
        绿色: 对应层级中重要接口
        API :提供给API使用者,无需关心底层实现,只需完成配置,业务代码即可
        SPI :能力扩展,可基于dubbo做二次开发,拓展功能
    Dubbo核心组件
    Service :
            业务层,包括业务代码的接口与实现
    Config :
            配置层 主要围绕ServiceConfig(暴露的服务配置)和ReferenceConfig(引用的服务配置)两个实现类展开初始化配置信息.可以理解为改成管理了整个Dubbo的配置
    Proxy :
            服务代理层,无论是生产者还是消费者,框架都会生成一个代理类,整个远程调用过程上层是无感知的
    Registry :
    注册层,负责服务的注册与发现,当服务变更时,会推送订阅给所有订阅方
    Cluster :
            集群容错层,主要负责远程调用时的容错策略(失败重试,快速失败等);调用某节点时的负载均衡策略(随机,一致性hash等);特殊路径的路由策略
    Monitor :
            监控层;负责监控统计的调用次数,时间,路径等
    Protocol :
            远程调用层,可以说是dubbo的核心层,封装RPC调用,以Invocation, Result为中心
    Exchange :
            信息交换层,封装了请求响应模式
    Transport :
            网络传输层;将网络传输抽象为统一的接口,可根据拓展接口添加更多的网络传输方式
    Seralize :
            序列化层;数据要通过网络进行传送,需要先进行序列化,转化为二进制流;该层负责管理整个框架网络传输时的序列化/反序列化
    Dubbo的调用过程 :
    服务的暴露过程 :
            服务提供者在框架启动时,初始化服务实例.通过Proxy组件调用具体协议(Protocol),将服务端暴露的接口封装成Invoker,然后转换成Exporter,
            此时框架会打开服务端口等并记录服务实例到内存中,最后通过Registry把服务元数据注册到注册中心;
            以上就是服务暴露的过程,消费方会在启动时通过Registry在注册中心订阅服务提供者的信息,获取到暴露的服务
    远程调用流程 :

            1. 调用过程从Proxy开始,Proxy持有了一个invoker对象,触发invoke调用.
            2. 在invoke调用中,需要cluster负责容错.cluster调用之前会通过directory获取所有远程服务的Invoker列表(一个接口可能存在多个节点提供服务),由于可调用的服务较多,此时如果用户配置路由规则,会根据配置的路由规则将Invoker列表过滤一遍.
            3. 剩下的invoker可能仍不止一个,这时就会通过LoadBalance方法做负载均衡,最终选出一个可调用的invoker;在这个invoker调用之前,会经过一个过滤器链(通常用来处理上下文,限流,计数等)
            4. 使用client做数据传输(Netty Client等), 在传输之前会做一些私有协议的构造,此时会用到codec接口,构造完成后,对数据包做序列化(Seralizetion),然后传输到服务提供者端
            5. 服务提供者端收到数据包后,也会使用codec处理协议头以及一些半包,粘包等.处理完成后对数据报文做反序列化处理
            6. 这个Request会被分配到线程池ThrealPool中进行处理.
    server会处理这些request,根据请求查找对应的Export(内部持有invoker)invoker是被装饰器模式一层一层套了很多filter
            7. 在调用最终的实现类之前,又会经过一个服务提供者端的过滤器链;
            8.最终,得到接口具体实现并调用,再将结果原路返回,流程结束