Dubbo+ZooKeeper搭建的简单示例

一、简介

  基于Dubbo + ZooKeeper实现的分布式架构,调用接口方法就像调用本地方法一样调用远程服务。

  来自Dubbo官网的架构图:

            

  节点角色说明
节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器
  调用关系说明
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

  Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性

二、搭建Zookeeper注册中心详细步骤参考:

  https://www.cnblogs.com/sun-flower1314/p/11341499.html

三、创建三个maven工程:接口工程;服务端工程;客户端工程。服务端和客户端去依赖接口工程。

  接口工程的作用:定义服务接口,供消服务消费者和提供者使用

  1. 创建接口工程的步骤:

    1)创建一个maven项目,在创建后生成jar包的方式

      

             

     2)创建完工程后,定义服务接口

package com.hxc.dubbo.demo;public interface DemoService {String sayHello(String name);
}

 

   2. 创建服务端工程的步骤:

     1)和创建接口工程相同,packaging项选择war包的形式

                

     2)以war包形式创建后,项目的pom.xml文件会报错:

      web.xml is missing and <failOnMissingWebXml> is set to true,原因是没有web.xml文件。

      解决错误的方法:

      ①右击项目,选择Properties ——> Project Facets ——> 将Dynamic Web Module选项去掉,然后选择Apply:

         

      ② 再次选中Dynamic Web Module,点击下方的Futher configuration available...进行配置web.xml,在弹出的界面中,在Content directory项填入:src/main/webapp,依次点击ok-> Apply -> Apply and close

                  

     

     3) 项目创建完成后,在pom.xml中依赖接口工程(即依赖由1创建的接口工程)

    

    或者直接自己手动敲:

    <dependency><groupId>com.hxc.dubboInterfaceDemo</groupId><artifactId>dubboInterfaceDemo</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

   4)添加相应的其他依赖jar包

   <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.5</version></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency>

  5)创建服务的接口实现类

package com.hxc.dubbo.demo.provider;import com.hxc.dubbo.demo.DemoService;public class DemoServiceImpl implements DemoService {public String sayHello(String name) {return " Hello " + name;}
}

   6)增加配置文件 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:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="hello-world-app"  /><!-- 使用multicast广播注册中心暴露服务地址 方式为: <dubbo:registry address="multicast://224.5.6.7:1234" />--><!-- 采用zookeeper的方式 --><dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.hxc.dubbo.demo.DemoService" ref="demoService" /><!-- 和本地bean一样实现服务 --><bean id="demoService" class="com.hxc.dubbo.demo.provider.DemoServiceImpl" />
</beans>

  7) 测试提供服务的是否能连接通

  测试方式一:写测试代码

package com.hxc.demo.test;import java.io.IOException;import org.springframework.context.support.ClassPathXmlApplicationContext;public class ProviderTest {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");context.start();System.in.read(); // 按任意键退出
    }
}

  测试方式二:在web.xml中增加 加载配置文件的 provider.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册

  在web.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><!-- needed for ContextLoaderListener --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:provider.xml</param-value></context-param><!-- Bootstraps the root web application context before servlet initialization --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

  测试通过后,在zookeeper端可以查看服务注册是否成功,若看到下图对应的值,则说明联接成功:

       

 3. 创建客户端工程的步骤:

    1)创建客户端工程和创建服务端工程的步骤相同(1-3步骤)

  2)创建完成后,添加依赖jar包

      <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.5</version></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.10.RELEASE</version><scope>compile</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency>

  3)增加配置文件,consumer.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:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="consumer-of-helloworld-app"  /><!-- 使用multicast广播注册中心暴露发现服务地址 <dubbo:registry address="multicast://224.5.6.7:1234" /> --><!-- 采用zookeeper的方式 --><dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" /><!-- 生成远程服务代理,可以和本地bean一样使用demoService --><dubbo:reference id="demoService" interface="com.hxc.dubbo.demo.DemoService" />
</beans>

 

  4) 测试客户端

  测试时,一定要先启动服务端在zookeeper上注册完接口,然后再测试客户端

  测试方式一:直接写测试代码,运行后在控制台能够看到   Hello world

package com.hxc.dubbo.demo.test;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hxc.dubbo.demo.DemoService;public class ConsumerTest {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");context.start();DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理String hello = demoService.sayHello("world"); // 执行远程方法System.out.println( hello ); // 显示调用结果
    }
}

 

  测试方式二:在web.xml中增加 加载配置文件的 consumer.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册

  在web.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5" ><servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:demo-service-consumer.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

 

   5)再zookeeper服务中心查看结果:

             

 

到此就基本完成了整个服务的搭建,至于dubbo更加详细的API,请参考dubbo官方文档。

关于Dubbo的官方API:https://dubbo.gitbooks.io/dubbo-user-book/  非常全面详细的教程

 

记得点个赞哦 谢谢

 

转载于:https://www.cnblogs.com/sun-flower1314/p/11344896.html

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

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

相关文章

uni-calendar更改打点颜色实现签到和缺勤不同打点颜色效果

1.公司要实现打卡功能&#xff0c;发现uni-calendar插件不支持不同打点颜色的效果&#xff0c;所以就自己改一下源码 下图是公司ui设计师给的图 2.我们打开调试&#xff0c;可以看到红色打点的样式是.uni-calendar-item__weeks-box-circle 3.我们复制下来这个class名&#xff…

分布式 dynamips+dyangen (更新于07.3.30)

更新内容&#xff1a;很多网友都反映用此文方法行不通&#xff0c;现象为&#xff1a;分布在各计算机上的路由器能起来&#xff0c;但互联的端口是Down的&#xff0c;以至于ping 不通。在此特别感谢 flyxj 网友QQ联系到我才引起我的高度注视使问题得到解决&#xff0c;不会再给…

换了坐骑

公司本来发了个DELL D400。好大好沉啊。&#xff08;虽然加了配置&#xff09;所以一直在使用自己的lenovo。今天总算给换了一个别的本本。当然不是新本本啦。不过也不错。毕竟才来还没一年。淘汰给我的那哥们跟我关系不错。他换了新的联想的天逸系列。 也是挺高配的。双核啊。…

C++_练习—继承_构造析构

构造析构 继承与构造析构&#xff1a; 在子类对象构造时&#xff0c;需要调用父类构造函数对其继承得来的成员进行初始化 在子类对象析构时&#xff0c;需要调用父类析构函数对其继承得来的成员进行清理 1 #include <iostream>2 3 using namespace std;4 5 class info1 {…

Vista修改默认字体

装了Vista之后&#xff0c;发现访问很多网站时字体都不好看。根据网上找到的方法&#xff0c;用Windows XP中的宋体替换Vista中的宋体。1.用 Total Commander (或 WinRAR) 进入 Vista 的 Windows\Fonts 文件夹&#xff0c;simsun.ttc 文件重命名。(我在重命名时&#xff0c;遇到…

在 CCR 环境中使用 Exchange 命令行管理程序移动存储组和数据库

作为Exchange管理员或许会遇到需要对Exchange Server存储组和数据库更改存储路径的情况&#xff0c;在常规情况下&#xff0c;更改Exchange Server存储组和数据库的路径一项比较简单的操作&#xff0c;通常在图形界面下经过简单的几步操作即可&#xff0c;路径更改过程数据库会…

C++_练习—多态_证明vptr指针的存在

证明vptr指针的存在 1 // 证明vptr指针的存在2 3 #include <iostream>4 5 using namespace std;6 7 class parent {8 public:9 parent(int a) { 10 this->a a; 11 } 12 13 virtual void pri(void) { 14 cout << "parent &…

NetCore的配置管理(1)

学习NetCore的配置管理&#xff1b; 目录 命令行配置Json文件配置配置文件文本至C#对象实例的映射配置文件热更新总结命令行配置&#xff1a; 打开VS2017,新建NetCore控制台项目&#xff1b; 打开nuget包管理&#xff1b;添加Microsoft.Asp.NetCore.all&#xff0c;或者使用命令…

buffer busy waits

buffer busy waitshttp://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_idNOT&p_id34405.1当会话想要访问缓冲存储器中的数据块&#xff0c;而该数据块正在被其它会话使用时产生buffer busywaits事件。其它会话可能正在从数据文件向缓冲区存…

SetupFactory安装制作心得

很多年前&#xff0c;因为仰慕Install Shield的鼎鼎大名&#xff0c;所以很是花了些功夫研究了一番&#xff0c;最后&#xff0c;基本上也可以打出很完善的包了&#xff0c;其中也不乏一些很有难度的事情&#xff0c;比如ODBC的打包等。但它实在太难用了&#xff0c;过上一段时…

Timus 1114. Boxes

Timus 1114. Boxes 要求计算出将两种颜色的球放到盒子中的各种组合的数目。1114. Boxes Time Limit: 0.6 second Memory Limit: 16 MB N boxes are lined up in a sequence (1 ≤ N ≤ 20). You have A red balls and B blue balls (0 ≤ A ≤ 15, 0 ≤ B ≤ 15). The red bal…

Speerio Skinergy 'Image' is ambiguous 错误

使用BeyondCSS皮肤时报错&#xff1a;Could Not Load Skin: /Portals/0/Skins/beyondcss/1column_speerio.ascx Error: E:"Development"DotNetNuke"InstallArea"DotNetNuke_04.08.03_Source"Website"controls"Speerio"Skinergy"s…

Sql Server中自动序号的方法

第一种:使用identity函数增加临时表的方法 selectid identity(int,1,1),*into#tmp fromtableselect*from#tmp droptable#tmp 在SQL2005中新增了ROW_NUMBER()函数,给我们带来了很多方便,使用方法如下: SELECTid,ROW_NUMBER() OVER(orderbyid)asRowNumber FROMTable有一个方便,as…

flex白板之图形绘制函数

图形的绘制 Graphics类提供了相关的方法&#xff1a; 1&#xff0c;清空画布 graphics.clear();2&#xff0c;设置画笔 graphics.lineStyle(thickness:Number NaN, color:uint 0, alpha:Number 1.0, pixelHinting:Boolean false, scaleMode:String "normal", ca…

三层体系结构学习总结

三层架构学习总结KeyWords: 三层体系结构,DAL,BLL,USL,学习心得,三层体系结构,软件三层体系结构 By Flouse2008年7月24日三层体系结构的概念 用户界面表示层(USL)业务逻辑层(BLL)数据访问层(DAL) 图一&#xff1a;BLL将USL与DAL隔开了&#xff0c;并且加入了业务规则 各层的作用…

具有全局观的网络拓扑

近年来&#xff0c;IT技术发展迅速&#xff0c;随着各个企业IT系统的建设&#xff0c;网络架构从单一的局域网扩展到广域网&#xff0c;网络设备也是类型多种多样&#xff0c;路由器、交换机、防火墙、IDS、***等等&#xff0c;而且网络设备的供应厂商也是越来越多&#xff0c;…

硬件_WIFIBlue

WIFI 平台&#xff1a;全志 模组&#xff1a;AP6210 &#xff08;WF BT FM&#xff09; 模式&#xff1a;STA  AP  Wi-Fi Direct&#xff08;点对点&#xff09; 接口&#xff1a;SDIO / USB——WF UART PCM——BT PCM数字音频接口&#xff0c;说明接口传输的音频数…

ActiveX控件的另类免费签名法

注意&#xff1a;一直都有人提到一个问题&#xff0c;就是使用支付宝的证书&#xff0c;会不会有安全问题&#xff0c;这一点是肯定的&#xff0c;所以这个证书只能拿来做软件签名用&#xff0c;不能拿来做支付的。 这几天手上在做一个项目&#xff0c;要用到ActiveX控件&#…

web布局最实用的12条css技巧

1&#xff1a;Rounded corners without images 效果图—— Rounded corners without images<div id”container”> <b class”rtop”> <b class”r1″></b> <b class”r2″></b> <b class”r3″></b> <b class”r4″>&l…

运算符(2)

1.三目运算符 /* 三目运算符/ public class demo1 { public static void main(String[] args) { int score 80; String type score<60?"不及格":"及格"; System.out.println(type); } } 2.运算符优先级逻辑非>逻辑与>逻辑或a||b&&c的运…