Motan service export 处理流程

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 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  Exporter export(Class interfaceClass, T ref, List 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 provider = new DefaultProvider(ref, serviceUrl, interfaceClass);
        // 通过protocol暴露服务
        Exporter 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(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包装了一层,可以加自己的处理
  • 服务暴露成功后,才注册服务
Motan service export 处理流程_第1张图片
server.png

你可能感兴趣的:(Motan service export 处理流程)