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 中,唤醒等待的线程,最后消费者得到响应,一个流程完毕。
下一篇:
Java面试题之分布式事务篇