Dubbo实践(十五)消费者引用服务
Refer取得invoker的过程
<!-- 指定了哪种的注册中心,是基于zookeeper协议的,指定了注册中心的地址以及端口号 -->
<dubbo:registry protocol="zookeeper" client="zkclient" address="localhost:2181"/>
<!-- 引用远程DemoService服务 -->
<dubbo:reference id="demoService"interface="com.alibaba.d ubbo.demo.DemoService"/>
Spring加载每个<dubbo:reference/>标签的时候都会生成一个ReferenceBean。
如上图,ReferenceBean实现了Spring的FactoryBean接口,实现了此接口的Bean通过Spring的BeanFactory.getBean(“beanName”)获取的对象不是配置的Bean本身,而是通过FactoryBean.getObject()方法返回的对象,此接口在Spring内部被广泛使用,用来获取代理对象等等。这里getObject方法用来生成对远程服务调用的代理。
1. loadRegistries()获取配置的注册中心的registryUrls;
2. 遍历registryUrls集合,给registryUrl加上refer key,该key就是要引用的远程服务;
[registry://localhost:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.6.1&pid=2484&refer=application%3ddemo-consumer%26dubbo%3d2.6.1%26interface%3dcom.alibaba.dubbo.demo.DemoService%26methods%3dsayHello%26pid%3d2484%26side%3dconsumer%26timestamp%3d1415879965901®istry=dubbo×tamp=1415879990670]
3. 遍历registryUrls集合,使用Protocol.refer(interface,regist ryUrl)方法refer到可执行对象invoker;
4. 如果注册中心有多个的话,通过集群策略Cluser.join()将多个invoker伪装成一个可执行invoker,这里默认使用available策略;
5. 利用代理工厂生成代理对象proxyFactory.getProxy(invoker)。
这里实际上跟export过程类似,通过RegistryProtocol.refer获得invoker。
RegistryProtocol. Refer过程
1. 根据传入的registryUrl来选择RegistryProcol,它的协议属性是registry,下面要选择使用哪种注册中心,所以要根据REGISTRY_KEY属性重新设置registrUrl;
dubbo://localhost:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.6.1&pid=4524&refer=application%3Ddemo-consumer%26dubbo%3D2.6.1%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26methods%3DsayHello%26pid%3D4524%26side%3Dconsumer%26timestamp%3D1415881461048×tamp=1415881461113
2. 根据registrUrl利用RegistryFactory获取注册器(过程跟暴露服务那边一样),这里是zookeeper协议,得到的注册器是ZookeeperRegistry;
3.构建引用服务的subscribeUrl
consumer://192.168.56.1/com.alibaba.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.6.1&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=8536&side=consumer×tamp=1415945205031
并通过注册器向注册中心注册消费方,这里的category是consumers;
4. 构建目录服务RegistryDirectory
构建消费者订阅url,category=providers表示去注册中心寻找注册的服务提供者。
consumer://192.158.56.1/com.alibaba.dubbo.demo.DemoService?application=demo-consumer&category=providers,configurators,routers&dubbo=2.6.1&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=9692&side=consumer×tamp=1415967547508
向注册中心订阅服务提供方,注册中心根据消费者传入的url找到匹配的服务提供者url (注意:这里服务提供者没有设置category,注册中心对于没有设置的默认取providers值)
dubbo://192.168.56.1:20882/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.6.1&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=9828&side=provider×tamp=1415968955329
然后注册中心回调服务消费者暴露的回调接口来对服务提供者的服务进行引用refer,生成对应的可执行对象invoker。服务提供者与服务的消费建立连接。
5. 通过Cluster合并directory中的invokers, 返回可执行对象invoker。
6. ProxyFactory.getProxy(invoker) 创建代理对象返回给业务方使用。
顺便说一下,若注册中心的协议是dubbo协议,注册者调注册中心的服务采用的默认集群调用策略是FailOver,选择一台注册中心,只有当失败的时候才重试其他服务器,注册中心实现也比较简单不具备集群功能, 如果想要初步的集群功能可以选用BroadcastCluster,它至少向每个注册中心遍历调用注册一遍。
Dubbo实践(十五)消费者引用服务的更多相关文章
- Dubbo实践(五)扩展Spring Schema
先回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml version="1.0" encoding="UTF-8"?> ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)
缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
- Linux系统学习 十五、VSFTP服务—匿名用户访问(不推荐使用,不安全)
匿名用户访问 基本配置: anonymous_enable #允许匿名用户访问 anon_upload_enable #允许匿名用户上传 anon_mkdir_write ...
- 二十五、SSH服务企业级应用场景
一.需求分析: 要求所有服务器在同一个用户oldboy1系统用户下,实现A机器从本地分发数据到B\C机器上,在分发过程中不需要B\C的提示系统密码验证,除了分发功能,还需要可以批量查看客户上的cpu. ...
- Dubbo实践(十四)生产者发布服务
Export发布服务流程 Dubbo协议向注册中心发布服务:当服务提供方,向dubbo协议的注册中心发布服务的时候,是如何获取,创建注册中心的,如何注册以及订阅服务的,下面我们来分析其流程. 看如下配 ...
- Spring Boot 2.x (十五):Dubbo + Zookeeper + 新版Dubbo Admin
Dubbo 简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. 它提供了三大核心能力: 面向接口的远程 ...
- 吴太银:华为消费者云服务Cassandra使用场景与最佳实践
大家好,我是华为消费者云的吴太银. 我今天分享的主要是华为消费者云服务使用Cassandra的应用场景和最佳实践.我这个可能跟其他嘉宾分享的不太一样,因为前几个嘉宾讲的实际上对Cassandra原生的 ...
- 【Dubbo 源码解析】05_Dubbo 服务发现&引用
Dubbo 服务发现&引用 Dubbo 引用的服务消费者最终会构造成一个 Spring 的 Bean,具体是通过 ReferenceBean 来实现的.它是一个 FactoryBean,所有的 ...
随机推荐
- python中单下划线和双下滑线
使用单下划线(_one_underline)开头表示方法不是API的一部分,不要直接访问(虽然语法上访问也没有什么问题). 使用双下划线开头(__two_underlines)开头表示子类不能覆写该方 ...
- javascript中函数的写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Postman-Tests模块测试方法记录
用Postman的时候大多数测试结果是可以用Tests模块的测试方法来代替人工检查的,测试方法本质上是JavaScript代码,我们可以通过运行测试用例(测试脚本是在发送请求之后并且从服务器接收到响应 ...
- mybatis大框架
MyBatis 开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...
- IEC62304开发过程框架
软件开发计划的任务 制定整体软件开发计划 制定设计和开发计划 规划软件开发的工具.标准和方法(Class C) 制定软件集成和集成计划 制定软件验证计划 制定软件风险管理计划 制定配置管理计划 软件需 ...
- maven(11)-聚合多模块
聚合项目 一些开源项目,都会把自己的源代码公开到github之类的网站上,我们通过下载其代码,在本地执行maven install,可以把代码编译成jar包安装到本地仓库.而一个项目通常有 ...
- C# 装箱和拆箱[整理](转)
//1. // 装箱和拆箱是一个抽象的概念 //2. // 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 // 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互 ...
- Sqlserver函数基础使用
函数基本功能: 转换工厂日期,将8点20之前的时间转化为前一天的时间. if exists (select * from sysobjects where xtype='fn' and name='F ...
- 进制转换excel版
- Android启动外部应用的方法
1.根据package的名称获取应用的Launch Intent Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage ...