1. 前言
在 Dubbo 框架中,服务提供者通过 XML 配置发布服务时,涉及多个模块之间的协作,包括 ServiceConfig
、Protocol
、Exporter
、Registry
、Exchange
和 Transport
等。
1、官网代码设计图
这是官网代码架构设计图,主要体现各个模块之间的调用关系。
不仅包含服务提供者调用关系,也包含服务消费者的,具体解释看官网介绍。
为了便于理解,在自己阅读源码后,我又画了张专门提醒服务提供者的设计图,后面的介绍也是围绕这张图来的。
2. 服务提供者设计图
以下是这些模块之间的源码方法调用关系以及服务提供者发布服务的全过程详细说明。
2. 简述过程
在 dubbo-config-spring
项目模块中,dubbo 框架定义了 dubbo.xsd
。业务使用时,可以基于 定义好的标签(<dubbo:service>
等),在 xml 中配置要发布的服务。
这部分内容可以查看前面写的 《Spring XML自定义命名空间》。
服务提供者在启动时,DubboNamespaceHandler
中会根据 XML 配置中的 <dubbo:service>
标签发布服务,整个过程大致如下:
解析 XML 配置:
- 解析
<dubbo:service>
标签,创建ServiceConfig
对象。
- 解析
服务导出:
- 调用
ServiceConfig.export()
方法,开始服务导出过程。
- 调用
协议导出:
ServiceConfig.export()
方法内部调用Protocol.export()
方法,通过具体的协议实现服务的导出。
注册服务:
- 将服务注册到注册中心。
3. ServiceConfig 模块
- 作用:负责服务配置的解析和管理,是服务导出的入口。
- 关键方法:
ServiceConfig.export()
public class ServiceConfig<T> {
public synchronized void export() {
// 检查配置并准备导出
if (!shouldExport()) {
return;
}
// 导出服务
doExport();
}
private void doExport() {
// 调用 Protocol.export()
Invoker<?> invoker = createInvoker();
Exporter<?> exporter = protocol.export(invoker);
exporters.add(exporter);
}
}
3. Protocol 模块
- 作用:负责服务的导出和引用。不同的协议(如 Dubbo、HTTP 等)有不同的实现。
- 关键方法:
Protocol.export()
public interface Protocol {
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
}
5. RegistryProtocol.export()
- 作用:处理服务注册相关的逻辑,将服务注册到注册中心。
调用关系:
- 实际服务导出:调用内部协议(如
DubboProtocol
)进行服务的实际导出。 - 服务注册:通过
Registry
将服务注册到注册中心。 - 返回 Exporter:创建并返回一个
Exporter
对象,用于管理服务的生命周期。
- 实际服务导出:调用内部协议(如
public class RegistryProtocol implements Protocol {
@Override
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
// 1. 实际服务导出
Exporter<T> exporter = protocol.export(invoker);
// 2. 注册服务到注册中心
Registry registry = registryFactory.getRegistry(invoker.getUrl());
registry.register(invoker.getUrl());
// 3. 返回 Exporter
return exporter;
}
}
6. DubboProtocol.export()
- 作用:通过 Dubbo 协议导出服务。
调用关系:
- 创建一个
DubboExporter
实例。 - 启动服务器,监听服务请求。
- 创建一个
public class DubboProtocol implements Protocol {
@Override
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
// 创建 DubboExporter 实例
DubboExporter<T> exporter = new DubboExporter<>(invoker, ...);
// 启动服务器,监听端口
openServer(invoker.getUrl());
return exporter;
}
}
7. Transport 和 Exchange 模块
Transport 模块:
- 作用:负责底层的网络传输,绑定服务端口。
- 关键方法:
Transporter.bind()
用于绑定服务器。
Exchange 模块:
- 作用:提供请求-响应模型,负责信息交换。
- 关键方法:
ExchangeServer
用于处理请求。
8. 总结
在 Dubbo 服务提供者的发布过程中,多个模块协同工作:
- ServiceConfig:负责服务配置和导出的入口。
- Protocol 和 Exporter:负责服务的导出和生命周期管理。
- Registry:负责服务的注册和发现。
- Transport 和 Exchange:负责底层的网络通信和信息交换。
图示化流程
ServiceConfig.export()
└── RegistryProtocol.export()
└── DubboProtocol.export()
└── Transporter.bind() (绑定端口)
└── ExchangeServer (启动并监听)
└── Registry.register() (注册服务)
ServiceConfig.export():
- 解析服务配置,准备服务导出。
- 调用
Protocol.export()
进行服务导出。
RegistryProtocol.export():
- 调用
DubboProtocol.export()
进行服务的实际导出。 - 将服务注册到注册中心。
- 调用
DubboProtocol.export():
- 创建
Exporter
实例。 - 启动服务器,监听服务请求。
- 创建
Transport 和 Exchange:
- 通过
Transporter.bind()
和ExchangeServer
启动网络服务。
- 通过
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。