Dubbo 服务暴露、服务引用、服务调用

前言

这几天简单的看了一下dubbo的一些源码,说实话没怎么看懂,最后看看博客,有一些心得写下来

dubbo架构

这个图很重要!

    Provider(提供者)绑定指定端口并启动服务 指供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储 Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心 注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。 Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。 Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer

服务暴露

    dubbo服务暴露会在spring对bean实例化完,ioc进行容器刷新完之后开始的 他会将配置文件中的配置解析到ServiceConfig,进行调用doExportUrlsFor1Protocol
private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {
          
   
       //省略。。。
        if (!Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) {
          
   
            if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
          
    
             // 本地服务暴露 
                exportLocal(url);
            }
            if (!Constants.SCOPE_LOCAL.toString().equalsIgnoreCase(scope)) {
          
     
              // 远程服务暴露  
              //...
                if (registryURLs != null && !registryURLs.isEmpty()) {
          
   
                    //遍历注册中心
                    for (URL registryURL : registryURLs) {
          
   
                        //...
                        // invoker  使用ProxyFactory 生成 invoker对象,这里这个invoker其实是一个代理对象
                        Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
                        // 创建  DelegateProvoderMetaInvoker 对象,wrapper包装对象
                        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
                        //暴露对象
                        Exporter<?> exporter = protocol.export(wrapperInvoker);
                        // 添加exporter
                        exporters.add(exporter);
                    }
                } else {
          
    
                //....
                }
            }
        }
//省略。。。
}
    根据配置信息进行选择本地调用还是远程调用 proxyFactory.getInvoker 利用java(javassist)动态代理生成invoker 对象 然后再通过 URL 参数选择对应的协议来进行 protocol.export,默认是 Dubbo 协议 最后添加到exporters 中存起来

服务引用

    首先服务会根据url等配置信息进行组装 然后在RegistryProtocol doRefer方法中创建了RegistryDirectory,接着又向注册中心订阅了并且订阅提供者、配置、路由等节点 得知提供者的信息之后会进入 Dubbo 协议的引入,会创建 Invoker ,期间会包含 NettyClient,来进行远程通信 最后通过 Cluster (默认是FailoverCluster)来包装 Invoker ,最终返回代理类

服务调用

    调用某个接口的方法会调用之前(服务引用)生成的代理类, 然后会从 cluster 中经过路由的过滤、负载均衡机制选择一个 invoker 发起远程调用,此时会记录此请求和请求的 ID 等待服务端的响应 服务端(服务提供者)接受请求之后会通过参数找到之前(服务暴露)暴露存储的 map,得到相应的 exporter ,然后最终调用真正的实现类,再组装好结果返回,这个响应会带上之前请求的 ID。 消费者收到这个响应之后会通过 ID 去找之前记录的请求,然后找到请求之后将响应塞到对应的 Future 中,唤醒等待的线程,最后消费者得到响应,一个流程完毕。
经验分享 程序员 微信小程序 职场和发展