前言
今天咱们聊聊RPC框架,RPC框架包括哪些呢,下面列举了一些主要的开源框架包括
名称 | 开源公司 | 特点 |
dubbo | 阿里巴巴公司 | 仅支持java |
SpringCloud | 国外Pivotal | 仅支持java |
Motan | 微博 | 仅支持java |
Tars | 腾讯 | 仅支持C++ |
gRPC | 支持多种语言 | |
Thrift | 支持多种语言 |
下面简单的看看这些框架的架构图,当然这些架构主要从官网照搬过来,大家随便看看
dubbo
Motan
Tars
SpringCloud
gRPC
Thrift
还有很多RPC框架是没有开源,例如京东的jsf等,一般大厂都有自己的rpc框架,但是中小企业没有实力来自研这类软件,而且开源的框架已经很稳定,所以这类企业一般会选择某个开源框架,在国内使用比较多是dubbo和springcloud,二者有各自的特点,我们就不比较了。今天我们来聊聊这些框架中dubbo,一篇文章无法全面来了解他,这里我们聊他比较重要的一块内容,导出功能。
正文
Dubbo 服务导出过程开始于Spring容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。
整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务。
ServiceBean类继承ServiceConfig类,实现了ApplicationListener接口,实现了该接口的onApplicationEvent方法,onApplicationEvent 是一个事件响应方法,该方法会在收到 Spring 上下文刷新事件后执行服务导出操作。
导出功能入口是在ServiceBean#onApplicationEvent方法里:
1、ServiceBean#onApplicationEvent
在onApplicationEvent 的构造方法中,判断是否有延迟导出、是否已经导出、是否已经取消导出,如果是则执行导出服务export方法。
2、export()方法
主要逻辑是获取导出参数,判断是否需要延迟导出等,如下图所示
3、doExport()方法主要逻辑是
1)检测 <dubbo:service> 标签的 interface 属性合法性,不合法则抛出异常。
2)检测 ProviderConfig、ApplicationConfig 等核心配置类对象是否为空,若为空,则尝试从其他配置类对象中获取相应的实例。
3)检测并处理泛化服务和普通服务类。
4)检测本地存根配置,并进行相应的处理。
5)对 ApplicationConfig、RegistryConfig 等配置类进行检测,为空则尝试创建,若无法创建则抛出异常。
具体逻辑如下图所示:
4、urldoExportUrls()方法
5、加载注册中心链接loadRegistries(true)逻辑
1)检测是否存在注册中心配置类,不存在则抛出异常
2)构建参数映射集合,也就是
3)构建注册中心链接列表
4)遍历链接列表,并根据条件决定是否将其添加到 registryList 中
详细逻辑如下: