Motan service export 简要处理流程
- 由AnnotationBean的postProcessAfterInitialization方法开始
// 调用serviceConfig的export
serviceConfig.export();
// export方法中处理
// 获取注册地址:zookeeper://127.0.0.1:2181/com.weibo.api.motan.registry.RegistryService?group=default_rpc
List<URL> registryUrls = loadRegistryUrls();
// 开始doExport
doExport(protocolConfig, port, registryUrls);
// doExport
// 获取configHandler,SimpleConfigHandler
ConfigHandler configHandler = ExtensionLoader.getExtensionLoader(ConfigHandler.class).getExtension(MotanConstants.DEFAULT_VALUE);
// 由configHandler来做export处理, 这的处理与refer处理一样,都由configHandler处理
configHandler.export(interfaceClass, ref, urls)
- SimpleConfigHandler类继续处理,核心处理都在这
public <T> Exporter<T> export(Class<T> interfaceClass, T ref, List<URL> registryUrls) {
String serviceStr = StringTools.urlDecode(registryUrls.get(0).getParameter(URLParamType.embed.getName()));
URL serviceUrl = URL.valueOf(serviceStr);
// export service
// 利用protocol decorator来增加filter特性
String protocolName = serviceUrl.getParameter(URLParamType.protocol.getName(), URLParamType.protocol.getValue());
// 这里获取的是DefaultRpcProtocol,然后再包装
Protocol protocol = new ProtocolFilterDecorator(ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(protocolName));
Provider<T> provider = new DefaultProvider<T>(ref, serviceUrl, interfaceClass);
// 通过protocol暴露服务
Exporter<T> exporter = protocol.export(provider, serviceUrl);
// 服务暴露完之后,再注册服务
register(registryUrls, serviceUrl);
return exporter;
}
- 继续看protocol.export处理,在DefaultRpcProtocol的父类AbstractProtocol中
// 主要处理两行
// 创建Exporter(DefaultRpcProtocol下的DefaultRpcExporter)
exporter = createExporter(provider, url);
// 初始化Exporter
exporter.init();
// createExporter处理
return new DefaultRpcExporter<T>(provider, url);
// DefaultRpcExporter构造函数处理
ProviderMessageRouter requestRouter = initRequestRouter(url);
// 获取endpointFactory (NettyEndpointFactory)
endpointFactory =
ExtensionLoader.getExtensionLoader(EndpointFactory.class).getExtension(
url.getParameter(URLParamType.endpointFactory.getName(), URLParamType.endpointFactory.getValue()));
// createServer(NettyServer)
server = endpointFactory.createServer(url, requestRouter);
// createServer 处理
// 调用NettyEndpointFactory中的innerCreateServer,创建NettyServer对象
server = innerCreateServer(url, messageHandler);
// 初始化处理,最后调用DefaultRpcProtocol的doInit()方法,然后里面执行下面处理
server.open();
// server.open()处理基本上都是初始化NettyServer的东西,属于传输层的东东
initServerBootstrap();
serverChannel = bootstrap.bind(new InetSocketAddress(url.getPort()));
- 注册服务处理
// 获取注册工厂,ZookeeperRegistryFactory
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension(url.getProtocol());
// 获取注册中心,ZookeeperRegistry
Registry registry = registryFactory.getRegistry(url);
// 将服务url注册到注册中心
registry.register(serviceUrl);
// registry.register最终调用ZookeeperRegistry的doRegister来做最后处理
// motan://192.168.3.13:8002/com.weibo.motan.demo.service.MotanDemoService?group=testgroup
protected void doRegister(URL url) {
try {
serverLock.lock();
// 防止旧节点未正常注销
removeNode(url, ZkNodeType.AVAILABLE_SERVER);
removeNode(url, ZkNodeType.UNAVAILABLE_SERVER);
createNode(url, ZkNodeType.UNAVAILABLE_SERVER);
} catch (Throwable e) {
} finally {
serverLock.unlock();
}
}
// createNode,建的是临时节点,断开连接该节点会自动删除,客户端会收到通知
zkClient.createEphemeral(ZkUtils.toNodePath(url, nodeType), url.toFullStr());
大概的示意图:
- Filter 这里对Protocol包装了一层,可以加自己的处理
- 服务暴露成功后,才注册服务
![](https://img.haomeiwen.com/i2738800/b8c11970c52f9927.png)
网友评论