现在我根据周末学习的内容做的一个大概的笔记,后面再完善吧!
资源
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!
标签:Dubbo,服务,URL,配置,导出,Invocation,服务提供者,引入,-- From: https://www.cnblogs.com/zhf123/p/16706386.html