Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例

入门实例解析

第一:provider-提供服务和相应的接口


创建DemoService接口

[java] view plaincopyprint?
  1. <span style="font-size:18px;">package com.unj.dubbotest.provider;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 定义服务接口,该接口需要单独打包,在服务提供方和消费方共享 
  7.  *  
  8.  * @author lishehe-2015年6月22日 
  9.  * 
  10.  */  
  11. public interface DemoService {  
  12.     /* 
  13.      * sayHello方法 
  14.      */  
  15.     String sayHello(String name);  
  16.   
  17.     /* 
  18.      * 获取用户信息方法 
  19.      */  
  20.     public List getUsers();  
  21.   
  22. }</span>  


创建本接口的实现类

[java] view plaincopyprint?
  1. <span style="font-size:18px;">package com.unj.dubbotest.provider.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.unj.dubbotest.provider.DemoService;  
  7. /* 
  8.  * 实现类DemoServiceImpl-李社河-2015年6月22日 
  9.  */  
  10. public class DemoServiceImpl implements DemoService {  
  11.     //声明sayHello方法  
  12.     public String sayHello(String name) {  
  13.         return "Hello " + name;  
  14.     }  
  15. /** 
  16.  * 获取用户信息getUsers-李社河-2015年6月22日 
  17.  */  
  18.     public List getUsers() {  
  19.         List list = new ArrayList();  
  20.         User u1 = new User();  
  21.         //jack信息  
  22.         u1.setName("jack");  
  23.         u1.setAge(20);  
  24.         u1.setSex("m");  
  25.           
  26.         //tom信息  
  27.         User u2 = new User();  
  28.         u2.setName("tom");  
  29.         u2.setAge(21);  
  30.         u2.setSex("m");  
  31.   
  32.         //rose信息  
  33.         User u3 = new User();  
  34.         u3.setName("rose");  
  35.         u3.setAge(19);  
  36.         u3.setSex("w");  
  37.   
  38.         list.add(u1);  
  39.         list.add(u2);  
  40.         list.add(u3);  
  41.         return list;//返回数据集合  
  42.     }  
  43. }  
  44. </span>  

创建provider.xml文件
[html] view plaincopyprint?
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.         http://code.alibabatech.com/schema/dubbo  
  7.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
  8.         ">  
  9.     <!-- 具体的实现bean,李社河 -->  
  10.     <bean id="demoService" class="com.unj.dubbotest.provider.impl.DemoServiceImpl" />  
  11.   
  12.     <!-- 提供方应用信息,用于计算依赖关系,李社河  -->  
  13.     <dubbo:application name="xixi_provider" />  
  14.   
  15.     <!-- 使用multicast广播注册中心暴露服务地址 <dubbo:registry address="multicast://224.5.6.7:1234"   
  16.         /> -->  
  17.   
  18.     <!-- 使用zookeeper注册中心暴露服务地址 -->  
  19.     <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
  20.   
  21.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  22.     <dubbo:protocol name="dubbo" port="20880" />  
  23.   
  24.     <!-- 声明需要暴露的服务接口 -->  
  25.     <dubbo:service interface="com.unj.dubbotest.provider.DemoService"  
  26.         ref="demoService" />  
  27.   
  28. </beans></span>  


创建启动类

[java] view plaincopyprint?
  1. <span style="font-size:18px;">public class Provider {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.         //启动spring容器,把服务器启动之后注册到Zookeeper  
  5.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  6.                 new String[] { "applicationContext.xml" });  
  7.         context.start();  
  8.         System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟  
  9.     }  
  10. }</span>  



创建dubboconsumer(消费者)

 注意 provider项目中的DemoService接口打包demo-service-api.jar放在class path中


创建consumer.xml配置文件


applicationContext.xml

[html] view plaincopyprint?
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.         http://code.alibabatech.com/schema/dubbo  
  7.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
  8.         ">  
  9.   
  10.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
  11.     <dubbo:application name="hehe_consumer" />  
  12.   
  13.     <!-- 使用zookeeper注册中心暴露服务地址 -->  
  14.     <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
  15.     <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
  16.   
  17.     <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
  18.     <dubbo:reference id="demoService"  
  19.         interface="com.unj.dubbotest.provider.DemoService" />  
  20.   
  21. </beans></span>  


创建consumer启动类

[java] view plaincopyprint?
  1. <span style="font-size:18px;">package com.alibaba.dubbo.demo.pp;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.unj.dubbotest.provider.DemoService;  
  8. /** 
  9.  * Consumer执行起始类 
  10.  * @author 李社河-2015年6月22日 
  11.  * 
  12.  */  
  13. public class Consumer {  
  14.   
  15.     public static void main(String[] args) throws Exception {  
  16.         //初始化Consumer中的spring容器  
  17.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  18.                 new String[] { "applicationContext.xml" });  
  19.         context.start();  
  20.         // 获取远程服务代理  
  21.         DemoService demoService = (DemoService) context.getBean("demoService");  
  22.         //执行远程方法  
  23.         String hello = demoService.sayHello("tom");  
  24.         //打印信息  
  25.         System.out.println(hello);  
  26.   
  27.         //同样执行远程方法,打印相关信息  
  28.         List list = demoService.getUsers();  
  29.         if (list != null && list.size() > 0) {  
  30.             for (int i = 0; i < list.size(); i++) {  
  31.                 System.out.println(list.get(i));  
  32.             }  
  33.         }  
  34.         System.in.read();// 为保证服务一直开着,利用输入流的阻塞来模拟  
  35.     }  
  36.   
  37. }</span>  

启动好zookeeper、tomcat之后我们执行运行Provider.class、Consumer.class

成功调到远程服务-----执行Consumer之后结果



我们在看管理后台的信息

提供者


消费者



实例升级--Dubbo服务集群容错实践

       手机应用是以聊天室为基础的,我们需要收集用户的操作行为,然后计算聊天室中在线人数,并实时在手机应用端显示人数,整个系统的架构如图所示:


   上图中,主要包括了两大主要流程:日志收集并实时处理流程、调用读取实时计算结果流程,我们使用基于Dubbo框架开发的服务来提供实时计算结果读取聊天人数的功能。上图中,实际上业务接口服务器集群也可以基于Dubbo框架构建服务,就看我们想要构建什么样的系统来满足我们的需要。

   如果不使用注册中心,服务消费方也能够直接调用服务提供方发布的服务,这样需要服务提供方将服务地址暴露给服务消费方,而且也无法使用监控中心的功能,这种方式成为直连。

   如果我们使用注册中心,服务提供方将服务发布到注册中心,而服务消费方可以通过注册中心订阅服务,接收服务提供方服务变更通知,这种方式可以隐藏服务提供方的细节,包括服务器地址等敏感信息,而服务消费方只能通过注册中心来获取到已注册的提供方服务,而不能直接跨过注册中心与服务提供方直接连接。这种方式的好处是还可以使用监控中心服务,能够对服务的调用情况进行监控分析,还能使用Dubbo服务管理中心,方便管理服务,我们在这里使用的是这种方式,也推荐使用这种方式。使用注册中心的Dubbo分布式服务相关组件结构,如下图所示:



转载于:https://www.cnblogs.com/zhanghaiyang/p/7213278.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]PhotoShop性能优化

现在随着Photoshop版本越来越高功能也越来越强大&#xff0c;而往往强大的功能需要电脑有好的配置运行&#xff0c;比如HDR、图像合成或者3D和视频等类似的功能&#xff0c;还有处理比较大尺寸的图像时&#xff0c;如果电脑配置不够强往往非常卡&#xff0c;这时我们就要好好设…

0.1uf与47uf并联_UF是什么形式?

0.1uf与47uf并联UF&#xff1a;超滤 (UF: Ultrafiltration) UF is an abbreviation of Ultrafiltration. It is a kind of membrane filtration which is used in UF water purifiers. Through a hollow fiber threaded semi-permeable membrane, the water is made to proceed…

机器学习相关——协同过滤

在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF)&#x…

InfoQ中文站2015年度优秀社区编辑评选揭晓

\又到了年终岁末&#xff0c;在过去的一年里&#xff0c;InfoQ网站的月独立UV接近130万&#xff0c;月PV突破200万&#xff0c;每周独立访问用户接近30万&#xff0c;网站访问量过万的文章超过60篇。每月活跃的数十位社区编辑为InfoQ的内容生产贡献着力量。正是这点点汇聚的星光…

【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象&#xff0c;不同的访问者&#xff0c;产生的结果不同&#xff0c;执行操作也不同。此时&#xff0c;就是访问者模式的典型应用了。 应用场景 1 不同的子类&#xff0c;依赖于不同的其他对象 2 需要对一组对象&#xff0c;进行许多不相关的操作&#x…

ruby宝石区块链最新消息_Ruby宝石| Ruby工具

ruby宝石区块链最新消息Ruby宝石 (Ruby Gems) Every language has its package manager which helps it by providing libraries and a standard format to distribute Ruby program. It is a type of tool which is developed to easily facilitate the installation of Gems.…

最小生成树prim (c++ 已大改)

2019独角兽企业重金招聘Python工程师标准>>> #include <iostream> #include <vector> #include <set> #include <map> #include <initializer_list> #include <memory> template<typename T> class Graph{private:std::m…

前端接入HTTP协议浅析

【摘要】&#xff1a;本文整理并简要分析了HTTP协议的交互过程和内容格式&#xff0c;包括HTTP请求、HTTP应答的头域和实体内容&#xff0c;HTTP 1.0与HTTP 1.1的差异&#xff0c;并举例说明了Chunked编码的工作过程原理。1、HTTP协议简介浏览器和Web服务器之间一问一答的交互过…

互联网传真 传真指令_传真的完整形式是什么?

互联网传真 传真指令传真&#xff1a;传真 (FAX: Facsimile) FAX is an abbreviation of "Facsimile". 传真是“传真”的缩写 。 It is commonly written and spoken as FAX. It is a telephonic transmission of a scanned copy of text and images printed on a p…

C#使用七牛云存储上传下载文件、自定义回调

项目需要将音视频文件上传服务器&#xff0c;考虑并发要求高&#xff0c;通过七牛来实现。 做了一个简易的压力测试&#xff0c;同时上传多个文件&#xff0c;七牛自己应该有队列处理并发请求&#xff0c;我无论同时提交多少个文件&#xff0c;七牛是批量一个个排队处理了。 一…

Linux下DRBD配置

一、什么是DRBD1、简介 Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。数据镜像&#xff1a;实时、透明、同步&#xff08;所有服务器都成功后返回&#xff09;、异步&#xff08;本地服务器成功后返回…

vue3实现本地开发使用的px转换成vw,px转换成rem方法整理

前言&#xff1a; 项目中如果想本地开发使用px&#xff0c;但是界面上线以后界面是自适应的效果,可以有多种方式来实现效果。 一、px转成vw 1、安装&#xff0c;安装成功后&#xff0c;node_modules 会新增这两个插件包 npm i postcss-px-to-viewport-8-plugin 2、新增 post…

airplay2协议是什么_什么是AirPlay?

airplay2协议是什么AirPlay (AirPlay) AirPlay is released by Apple in the year 2004. It allows the easy exchange of audios without the use of any wired technique between the two devices. It was previously termed as AirTunes and later got its name changed to …

微信支付开发(5) 订单查询

本文介绍微信支付中订单查询功能的实现。 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一、订单查询 因为某一方技术的原因&#xff0c;可能导致商户在预期时间内都收不到最终支付通知&#xff0c;此时商户可以通过该…

python饼形图_Python | 饼形图

python饼形图A pie plot or a pie chart is a circular statistical graphic technique, in which a circle is divided into slices with respect to numerical proportion. In a pie chart, the arc length, central angle, and area of each slice, is proportional to the …

appweb ejs_EJS部分

appweb ejsHi! Welcome. Today, we are going to look at EJS partials. EJS Partials help us avoid repetition of the same code on several web pages. 嗨&#xff01; 欢迎。 今天&#xff0c;我们将看EJS局​​部函数 。 EJS Partials帮助我们避免在多个网页上重复相同的…

同事反馈环:如何实现持续改进的文化

“魔镜魔镜告诉我&#xff0c;谁才是最美丽的人&#xff1f;”&#xff0c;邪恶的皇后如此问道。似乎在精益和敏捷企业中也会有很多与《白雪公主》中类似的问题&#xff0c;如果我们没有一面可以看到我们正在做什么的镜子&#xff0c;我们就很难搞清楚我们有多么美丽&#xff0…

经典功率谱估计及Matlab仿真

原文出自&#xff1a;http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用&#xff0c;并且已被成功应用到雷达信号处理、故障诊断等实际工程中。本文给出了经典功率谱估计的几类方法&#xff0c;并通过Matlab的实验仿真…

极验验证码流程-3.图片加密处理 图片移位

终于把图片加密给搞定了&#xff0c;原理是他把图分成了52个部分&#xff0c;然后通过移动来形成新的图片 主要的位置关系看代码 顺便吐槽下ruby,小众语言就是这么不方便&#xff0c;很多库都没有&#xff0c;百度了半天 最后换成了java来写 图片保存到本地的就不详细说了 主要…

html-iframe_HTML iframe

html-iframeiframe (Iframes) In HTML, iframes are used to display a webpage inside another webpage. 在HTML中&#xff0c; iframe用于在另一个网页内显示一个网页。 Syntax: 句法&#xff1a; <iframe src"URL"></iframe>The <iframe> tag…