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 中,唤醒等待的线程,最后消费者得到响应,一个流程完毕。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值