Dubbo 服务的导出和引入

现在我根据周末学习的内容做的一个大概的笔记,后面再完善吧!

资源

1. 注册中心
2. dubbo服务
3. 协议
4. 监控中心
5. 配置中心

服务注册过程中主要围绕URL进行的 --- 方便扩展,URL 可以动态扩展拼接

Registry.registry(URL url, URL url)

Dubbo 服务导出

这儿有几个关键的步骤:

1. 读取配置
2. 启动Netty / Tomcat
3. 服务注册 ---》 服务相关信息 ---》注册中心
4. 服务提供者,配置动态监听

服务注册过程中做了哪些事情?

ServiceBean.export() --> 刷新ServiceBean的参数 --> 得到注册中心URL 和 协议URL --> 遍历每个协议URL --> 组成服务URL --> 生成可执行服务Invoker --> 导出服务

// spi 机制,采用该种模式进行实际导出
RegistryProtocol.export()

// netty或者tomcat服务启动
doLocalExport()

// 注册服务,把简化后的服务提供者url注册到registryUrl中去
往注册中心,往zookeeper中存东西
registry()

服务提供者需要监听哪些东西?

1. 动态配置;
2. 配置中心几个要监听的配置目录;

加载配置先后顺序?

动态配置 > 以下配置,根据不同配置,下面的配置先后顺序略有不同,一般而言,配置中心优先级 > @Service中参数配置的优先级

SystemConfiguration, EnvironmentConfiguration, InmemoryConfiguration(appExternalConfigurationMap), InMemoryConfiguration(ExternalConfigurationMap), ServiceConfig, PropertiesConfiguration.

SystemConfiguration, EnvironmentConfiguration,  ServiceConfig,InmemoryConfiguration(appExternalConfigurationMap), InMemoryConfiguration(ExternalConfigurationMap), PropertiesConfiguration.

Dubbo 服务引入

一个DubboInvoker表示一个具体的服务提供者.

消费者@Reference 端核心的一个类就是ReferenceBean,ReferenceBean.get()获取对应的代理对象。

项目初始化时,服务引入主要做了以下的事情:

1. 构造Invoker
2. DemoService:服务目录

1. 构造一个服务目录的时候,就要去注册中心上面去查
2. 多少个提供者 List<Invoker> 服务提供者URL --->配置优先级 --->动态配置 ---> List<DubboInvoker>
3. 监听
4. 路由链 TagRouter ---> AppRouter ---> ServiceRouter(监听)

代理对象的内部其实包含了一个Invoker 类型的属性,真正去执行调用provider端的方法也是通过这一个封装的对象去调用的,即内部的代理对象结构如下:

代理对象 {
  Invoker invoker;
}

说到源码的时候初始化加载配置,并且生成Invoker对象,并生成代理对象,其核心就是ReferenceBean的父类ReferenceConfig,ReferenceConfig.createProxy(Map)该方法的调用流程,Map即为对应配置封装的Map参数。其核心源码可以大致表示为以下内容:

ReferenceConfig.createProxy(Map)
MockClusterWrapper.join(Directory)
    1. 获取要执行的invoker
    new MockClusterInvoker(directory)
            invoke(Invocation)
                RegistryAwareClusterInvoker.doInvoke(Invocation)
                获取Invoker对象
        
        ProtocolListenerWrapper
        ProtocolFilterWrapper
    2. RegistryProtocol.refer(Class<T> type, URL url)
        doRefer(Cluster, Registry, Class<T> type, URL)
            2.1 构造服务目录:RegistryDirectory
            2.2 路由链是动态服务目录的一个属性,通过路由链可以过滤某些服务提供者: directory.buildRouterChain
            2.3 服务目录订阅几个路径:(注册中心,配置中心要监控的几个动态配置项) directory.subscribe
                获取服务提供者url: registry.subscribe:
                    toInvokers(): 讲服务提供者url转换为Invokers
            2.4 利用传进来的cluster, join得到invoker, MockClusterWrapper:    cluster.join(directory)

 

当代理对象调用具体的方法时,表象上主要执行了以下内容:

代理对象.a() {
    生成一个Invocation;
    invoker.invoke(Invocation);
}

再具体点说就是执行了以下的一些内容:

代理对象.a(){
    0. 生成一个Invocation
    
    1. 获取服务提供列表
    2. Mock----------------------------MockClusterInvoker.invoke(Invocation);
    3. 路由 M-->N
    4. 负载均衡    N-->1
    5. 集群容错---------------------------failoverCluster.invoke(Invocation);
    6. 构造NettyClient
    7. 发送数据 (Invocation)
}

说到源码成都其实可以大概表示为以下内容:

MockClusterInvoker.invoke()
    FailoverClusterInvoker.invoke()
        1. List<Invoker> invokers = RegistryDirectory.list();
        2. 路由
        3. 负载均衡
        DubboInvoker.invoke();

 

End!

 

posted @ 2022-09-19 00:30  君莫笑我十年游  阅读(174)  评论(0编辑  收藏  举报