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"/>

每个<dubbo:reference/>标签spring加载的时候都会生成一个ReferenceBean。

如上图ReferenceBean实现了Spring的FactoryBean接口, 实现了此接口的Bean通过Spring的BeanFactory.getBean(“beanName”)获取的对象不是配置的Bean本身而是通过FactoryBean.getObject()方法返回的对象,此接口在Spring内部被广泛使用,用来获取代理对象等等。这里getObjec t方法用来生成对远程服务调用的代理。

1. loadRegistries()获取配置的注册中心的registryUrls;

2. 遍历registryUrls集合,给registryUrl加上refer 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&registry=dubbo&timestamp=1415879990670]

3. 遍历registryUrls集合,使用Protocol.refer(interface,regist ryUrl)的到可执行对象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&timestamp=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&timestamp=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&timestamp=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&timestamp=1415968955329

然后注册中心回调服务消费者暴露的回调接口来对服务提供者的服务进行引用refer生成对应的可执行对象invoker。服务提供者与服务的消费建立连接。

5. 通过Cluster合并directory中的invokers, 返回可执行对象invoker。

6. ProxyFactory.getProxy(invoker) 创建代理对象返回给业务方使用。

这里dubbo协议的注册中心调注册中心的服务采用的默认集群调用策略是FailOver,选择一台注册中心,只有当失败的时候才重试其他服务器,注册中心实现也比较简单不具备集群功能, 如果想要初步的集群功能可以选用BroadcastCluster它至少向每个注册中心遍历调用注册一遍。

原文地址:https://www.cnblogs.com/wuxiaofeng/p/9348910.html

时间: 2024-10-28 00:15:52

Dubbo实践(十五)消费者引用服务的相关文章

Dubbo实践(五)扩展Spring Schema

先回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context=&qu

第十五章 FTP服务搭建与配置

15.1 FTP介绍FTP是File Transfer Protocol(文件传输协议,简称文传协议)的英文简称,用于在Internet上控制文件的双向传输.FTP的主要作用就是让用户连接一个远程计算机(这些计算机上运行着FTP服务器程序),并查看远程计算机中的文件,然后把文件从远程计算机复制到本地计算机,或把本地计算机的文件传送到远程计算机.?小公司用的多,大企业不用FTP,因为不安全 15.2 使用vsftpd搭建 FTP(上)centos上自带vsftpdyum install -y vs

二十五、客户端/服务端架构,网络基础

一.软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq,微信.网盘,优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯,而这两个分类又对应两个软件开发的构架 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的. 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用

微软云计算介绍与实践(实践之十五)

-- 接上回,继续动态扩展负载的存储. 26.关闭向导前选中创建卷选项,然后点击关闭. 27.随后会打开新建卷向导,点击下一步. 28.查阅设置并点击下一步. 29.确认磁盘容量为 21.9GB 然后点击下一步. 30.选择驱动器盘符 E: 并点击下一步. 31.更改卷标为 Data 然后点击下一步. 32.点击创建. 33.随后将创建一个新卷.点击关闭. 34.在服务器管理器中点击文件与存储服务,然后点击卷.确认新卷已经显示在这里,并且可用空间符合实际情况.如果给新建的卷分配的盘符不是 E:,

微软云计算介绍与实践(实践之二十五)

3.4.创建Runbook自动化活动模板 下面,小张需要在System Center 2012 Service Manager中提供自动化活动模板. 1.在System Center 2012 Service Manager控制台中,选中库工作区,展开导航树中选择运行手册 2.从已经创建的私有云,运行手册窗格中选择Runbook 3.任务窗格中的内容将会更新,现在选择创建Runbook自动化活动模板 4.在创建模板页面上填写以下数据.完成后,选择确定以打开模板编辑器 5.现在你可以改变Runbo

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v

centos NFS/FTP服务配置 第二十五节课

centos  NFS/FTP服务配置   第二十五节课 上半节课 下半节课 f

api-gateway实践(14)新服务网关 - 业务场景验证(五)api-gateway-engine携带有效token访问SvcApp (未完!!!!!!!!!!)

api-gateway实践(14)新服务网关 - 业务场景验证(五)api-gateway-engine携带有效token访问SvcApp (未完!!!!!!!!!!) 环境信息 1.Security-Filter拦截(web.xml) 2.Zuul-Filter拦截(web.xml) 3.zuul servlet(web.xml) 4.spring的DispatcherServlet(web.xml) 准备工作 1.api-gateway-engine2向SvcApp申请access_toke

关于dubbo创建服务和引用服务时,会报错:cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 问题的解决

在跟着做淘淘商城项目时,用到了dubbo,作为一个SOA架构的项目,分为表现层与服务层,自然地,为了各个层之间解耦合(或者最大限度地松耦合),我们使用了dubbo这样一个alibaba开源的分布式服务框架,该框架最大的特点就是利用分层的方式来架构,从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色. 但是在appplicationContext-se