• Dubbo源码分析2 整体框架解析


    本地环境

    dubbo版本:Dubbo3.0.0

    本地开发工具:IDEA

    操作系统:Windows

    本地zookeeper的安装启动这里我就不具体讲述了:(所有安装步骤都差不多:下载-环境配置-修改启动配置-启动软件)

    下为2篇各操作系统下安装zookeeper单机版的教程:
    (37条消息) windows环境下安装zookeeper教程详解(单机版)_风轩雨墨的博客-CSDN博客_windows zookeeper
    (37条消息) Linux单机安装Zookeeper_2014Team的博客-CSDN博客

    在这里我们先不具体细究zookeeper源码是怎么实现?这个我们留到后面再讲解,我们先简单的记住:它是服务之间远程调用的必备桥梁。

    一、前言

    下面是dubbo整个框架的一个流程图:

    Dubbo官方提供的该架构图很复杂,一开始我们没必要深入细节,如图所示,Dubbo逻辑上分为10层;

    1、service层

    service是围绕Interface展开的,服务的消费者和服务的提供者之间的交互是面向接口的,是直接面向消费者的。例如通过XML配置服务提供者和消费者的例子,具体参考之前的博客

    从0到微服务-9 Dubbo框架中的微服务组件 - chch213 - 博客园 (cnblogs.com)

    服务提供者:<dubbo:service >

    服务消费者:<dubbo:reference>

    2、config配置层

    对外配置接口,以ServiceConfig、ReferenceConfig为中心,可以直接初始化配置类,也可以通过spring解析配置生成配置类。具体配置方式的示例可以参考源码中的dubbo-demo模块

    总结一下:Service和Config层为API,对于服务提供方来说,使用ServiceConfig API来代表一个要发布的服务配置对象,对于服务消费方来说,ReferenceConfig代表了一个要消费的服务的配置对象。可以直接初始化配置类,也可以通过Spring解析配置自动生成配置类。

    其他各层均为SPI层,SPI意味着下面各层都是组件化可以被替换的,这也是Dubbo设计的比较好的一点。Dubbo增强了JDK中提供的标准SPI功能,在Dubbo中除了Service和Config层外,其他各层都是通过实现扩展点接口来提供服务的,Dubbo增强的SPI增加了对扩展点IoC和AOP的支持,一个扩展点可以直接setter注入其他扩展点,并且不会一次性实例化扩展点的所有实现类,这避免了当扩展点实现类初始化很耗时,但当时还没有用上它的功能时仍进行加载,浪费资源的情况;增强的SPI是在具体用某一个实现类的时候才对具体实现类进行实例化。后续会具体介绍Dubbo增强的SPI的实现原理。

     3、proxy服务代理层

    服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory,Dubbo提供的实现主要有JavassistProxyFactory(默认使用)和JdkProxyFactory,用来对服务提供方和服务消费方的服务进行代理。

    4、registry注册中心层

    封装服务地址的注册与发现,以服务URL为中心,扩展接口Registry对应的扩展接口实现为ZookeeperRegistry/RedisRegistry/MulticastRegistry/DubboRegistry等。扩展接口RegistryFactory对应的扩展接口实现为DubboRegistryFactory/DubboRegistryFactory/RedisRegistryFactory/ZookeeperRegistryFactory。扩展接口RegistryService

    5、cluster路由层

    封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,集群容错扩展接口Cluster对应的实现类有FailoverCluster(失败重试)/FailbackCluster(失败自动恢复)/FailfastCluster(快速失败)/FailsafeCluster(失败安全)/ForkingCluster(并行调用)等,负载均衡扩展接口LoadBalance对应的实现类为RandomLoadBalance(随机)/RoundRobinLoadBalance(轮询)/LeastActiveLoadBalance(最小活跃数)/ConsistentHashLoadBalance(一致性hash)等。扩展接口Directory、Router

    6、monitor监控层

    RPC调用次数和调用时间监控,扩展接口为MonitorFactory,对应的实现类为DubboMonitorFactory。扩展接口Monitor、MonitorService

    7、protocol远程调用层

    封装RPC调用,以Invocation、Result为中心,扩展接口为Protocol,对应实现有RegistryProtocol/DubboProtocol/InjvmProtocol等。扩展接口为Invoker、Exporter

    8、exchange信息交换层

    封装请求响应模式,同步转异步,以Request、Response为中心,扩展接口Exchanger,对应扩展实现有HeaderExchanger等。扩展接口为ExchangeChannel、ExchangeClient、ExchangeServer

    9、transport网络传输层

    抽象mina和netty为统一接口,以Message为中心、扩展接口为Channel,对应实现有NettyChannel/MinaChannel等。扩展接口为Transport、Client、Server、Codec

    10、serialize数据序列化层

    可复用的一些工具,扩展接口为Serialization,对应扩展实现有DubboSerialization/FastJsonSerialization/Hessian2Serialization/JavaSerialization等,扩展接口ThreadPool对应扩展实现有FixedThreadPool/CachedThreadPool/LimitedThreadPool等。扩展接口为ObjectInput、ObjectOutput

    上面说了那么多关于扩展点的东西,那么具体什么是扩展点呢,下面看下Dubbo扩展点一个简单例子。以扩展点Protocol为例,如果我们想自己写一个Protocol扩展接口的实现类,那么我们想自己写一个Protocol扩展接口的实现类,那么我们需要在实现类所在的Jar包内的 METAINF/dubbo/ 目录下创建一个名字为 com.alibaba.dubbo.rpc.Protocol 的文本文件,然后配置它的内容为:

    myprotocol=com.alibaba.user.MyProtocol

    假设该实现类MyProtocol的内容如下:

    package com.alibaba.user;
    import com.alibaba.dubbo.rpc.Protocol;
    public class MyProtocol implements Protocol{
        // ...    
    }

    到此,可知我们需要实现Protocol接口。

    那么如何使用我们自定义的扩展实现呢?Dubbo配置模块中,扩展点均有对应配置属性或标签,如下代码通过配置指定使用哪个扩展实现:

    <dubbo:protocol name="myprotocol" />

    注意这里的name必须与jar包内 METAINF/dubbo/ 目录下 com.alibaba.dubbo.rpc.Protocol 文件中的名字一致。

    二、服务消费者消费一个服务的详细过程

    • 首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图的红色部分),这是服务消费的关键。接下来把Invoker转换为客户端需要的接口(如:UserServiceBo)。
    • Dubbo协议的Invoker转换为客户端需要的接口,发生在DubboProtocol的refer方法中,它主要创建一个 netty client链接服务提供者,通讯细节由Dubbo自己实现。

    Dubbo学习(六) dubbo 架构图 以及调用过程 - aspirant - 博客园 (cnblogs.com)

  • 相关阅读:
    shelve模块和xml模块
    time模块,random模块和shutil模块
    包的使用
    目录开发规范
    redis 初步认识四(redis锁,防并发)
    redis 初步认识三(设置登录密码)
    redis 初步认识二(c#调用redis)
    微信小程序 初步认识一(微信运动步数)
    redis 初步认识一(下载安装redis)
    c# 7.0 6.0 新语法
  • 原文地址:https://www.cnblogs.com/chch213/p/16298188.html
Copyright © 2020-2023  润新知