1、配置解析
- 基于XML配置原理解析:主要解析逻辑入口是在DubboNamespaceHandler类中完成的,其主要把不同的标签关联到解析实现类中;
- 基于注解配置原理解析:注解处理逻辑主要包含3部分内容,第一部分是如果用户使用了配置文件,则框架按需生成对应Bean,第二部分是要将所有使用Dubbo的注解@Service的Class提升为Bean,第三部分要为使用@Reference注解的字段或方法注入代理对象。
@Service服务注解扫描和注册:
1)Dubbo框架首先会提取用户配置的扫描包名称;
2)开始真正的注解扫描;
3)配置扫描@Service注解作为过滤条件;
4)将@Service标注的服务提升为不同的bean;
5)根据注册的普通的Bean生成ServiceBean的占位符,用于Spring启动后的服务暴露。
@Refrence消费注解注入:
1)查找Bean所有标注了@Reference的字段和方法;
2)对字段、方法进行反射绑定;
3)遍历服务类所有的字段,查找Reference注解标注。
2、服务暴露的实现原理
- 配置承载初始化:
1)-D传递给JVM参数优先级最高;
2)代码或XML配置优先级次高;
3)配置文件优先级最低。
- 远程服务的暴露机制:
Dubbo框架做服务暴露分为两大部分:第一步将持有的服务实例通过代理转换成Invoker,第二步会把Invoker通过具体的协议(比如Dubbo)转换成Exporter。这里的Invoker可以简单理解成一个真实的服务对象实例。
1)主要通过反射获取配置对象并放到map中用于后续构造URL参数;
2)主要区分全局配置;
3)主要处理本地内存JVM协议暴露;
4)主要追加监控上报地址,框架会在拦截器中执行数据上报,这部分是可选的;
5)通过动态代理的方式创建Invoker对象,在服务端生成的是AbstractProxyInvoker实例,所有真实的方法调用都会委托给代理,然后代理转发给服务ref调用;
6)主要先触发服务暴露,然后进行服务元数据注册;
7)主要处理没有使用注册中心的场景,直接进行服务暴露,不需要元数据注册。
- 注册中心控制服务暴露:
1)打开端口,把服务实例存储到map;
2)创建注册中心实例;
3)服务暴露之后,注册服务元数据;
4)监听服务接口下configurators节点,用于处理动态配置;
5)Invoker销毁时注销端口和map中服务实例等资源;
6)移除已注册的元数据;
7)去掉订阅配置监听器。
3、服务消费的实现原理
在整体上看,Dubbo框架做服务消费也分为两大部分,第一步通过持有远程服务实例生成Invoker,这个Invoker在客户端是核心的远程代理对象。第二步会把Invoker通过动态代理转换成实现用户接口的动态代理引用。
1)默认检查是否适同一个JVM内部调用;
2)直接使用injvm协议从内存中获取实例;
3)注册中心地址后天添加refer存储服务消费元数据信息;
4)单注册中心消费;
5)逐个获取注册中心的服务,并添加到invokers列表;
6)通过Cluster将多个Invoker转换成一个Invoker;
7)把Invoker转换成接口代理。
-
通过注册中心消费
1)设置具体注册中心协议,比如ZooKeeper;
2)创建具体注册中心实例;
3)根据配置处理多分组结果聚合;
4)处理订阅数据并通过Cluster合并多个Invoker;
5)消费核心关键,持有实际Invoker和接收订阅通知;
6)注册消费信息到注册中心;
7)订阅服务提供者、路由和动态配置;
8)通过Cluster合并Invokers。
4、优雅停机原理解析
1)收到kill9进程推出信号,Spring容器会触发容器销毁事件;
2)provider端会取消注册服务元数据信息;
3)consumer端会收到最新地址列表(不包含准备停机的地址);
4)Dubbo协议会发送readonly事件报文通知consumer服务不可用;
5)服务端等待已经执行的任务结束并拒绝新任务执行。