Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)

Dubbo与Zookeeper、Spring整合使用

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

一:单机模式安装zookeeper

1,下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ (zookeeper 3.4.5 安装包 windows、linux下安装是一样的)下载后解压即可,进入E:\zookeeper-3.3.6\zookeeper-3.3.6\bin,

双击zkServer.cmd启动注册中心服务。

zkServer.sh【Linux】或zkServer.cmd【Windows】

启动会报错。因为没有修改配置文件。

2,在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper在启动时会找这个文件作为默认配置文件。dataDir修改为D:/deployment/zookeeper-3.4.5/data。下面详细介绍一下,这个配置文件中各个配置项的意义。

 

 

 

initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒

syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个    

•tickTime:这个时间是作为Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

   •dataDir:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

   •dataLogDir:顾名思义就是Zookeeper 保存日志文件的目录

   •clientPort:这个端口就是客户端连接Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求

 

 

可选配置: 

1.在zoo.conf中添加

server.1=192.168.1.113:2888:3888

server.2=192.168.1.111:2888:3888

 

2.解释:

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

3.

D:/deployment/zookeeper-3.4.5/data下创myid文件 myid的文件内容分别为:1、2 上边下边配置文件中192.168.1.113servier.X中的X值,如ip113的电脑,myid为1)

4.分别启动两个zookeeper,在一台机器上创建节点,另一个机器能同步过去证明成功

5.zookeeper服务器推荐用奇数个,半数以上服务正常,整个服务就正常,本人条件有限只配置两个

 

配置好后,zookeeper会监听本机的2181端口。

当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。

 dos命令为:netstat -ano|findstr "2181"  ,输入后,回车就好。如果dos打印出了带有2181端口的字串,就说明成功了。

 

 

 

附:Dubbo的管理页面

dubbo-admin-2.5.3下载地址<自带jetty>:http://download.csdn.net/detail/u013286716/7041185    

Dubbo-admin-2.5.4.war下载地址为:http://download.csdn.net/detail/liweifengwf/7784901

1.部署dubbo

 1)首先可以通过tomcat解压Dubbo-admin-2.5.4.war,即把该war包放在tomcat的webapps下,然后启动tomcat即可。

 2)清空webapps\ROOT 下的所有文件,把1)步运行dubbo-admin-2.5.4的文件放在ROOT下,一定要注意的是:不要把解压后的顶层文件夹也放在ROOT下,只保留顶层文件夹下的文件。如下图

3)修改webapps\ROOT\WEB-INF\dubbo.properties文件。我的路径是:D:\apache-tomcat-7.0.42\webapps\ROOT\WEB-INF\dubbo.properties

如下图,其中IP地址为你本地电脑的IP地址:

dubbo.registry.address=zookeeper://192.168.23.29:2181

dubbo.admin.root.password=root

dubbo.admin.guest.password=root

启动tomcat:

 

说明:确定zookeeper启动后再去启动tomcat

 

4)保存成功后,启动tomcat,在浏览器中直接输入:localhost:8080(这个是tomcat的默认端口号,如果你自己有修改,就换成你修改后的端口号即可),点接回车键,页面弹出让你登录的对话框,输入用户名root,密码:root即可登录成功。

如下图登录成功后的页面:

 

 

 

 

 

 

 

整体说明:

    Zookeeper(注册中心)部署到29的机子上,服务提供者和服务消费者均在29的机子上运行,当然我们也可以分别将服务提供者和服务消费者部署到不同的两台机子上。

优点:

    服务提供者和服务消费者只需要知道注册中心即可,它们之间打交道需通过注册中心这个第三方,只要是注册中心中已经注册的服务,我们均可以使用,实现了服务提供者和服务消费者间的解耦。

 spring整合:

注意:整合的时候加入tomcat下的dubbo的lib的相关jar......

1:服务提供者

 

定义服务接口:(该接口需单独打包,在服务提供方和消费方共享)

 

[java]  view plain  copy
 
  print ?
  1. package com.unj.dubbotest.provider;  
  2.   
  3. import java.util.List;  
  4.   
  5. public interface DemoService {  
  6.   
  7.     String sayHello(String name);  
  8.   
  9.     public List getUsers();  
  10.   
  11. }  

 

 

在服务提供方实现接口:(对服务消费方隐藏实现)

[java]  view plain  copy
 
  print ?
  1. 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. public class DemoServiceImpl implements DemoService {  
  9.   
  10.     public String sayHello(String name) {  
  11.         return "Hello " + name;  
  12.     }  
  13.   
  14.     public List getUsers() {  
  15.         List list = new ArrayList();  
  16.         User u1 = new User();  
  17.         u1.setName("hejingyuan");  
  18.         u1.setAge(20);  
  19.         u1.setSex("f");  
  20.   
  21.         User u2 = new User();  
  22.         u2.setName("xvshu");  
  23.         u2.setAge(21);  
  24.         u2.setSex("m");  
  25.   
  26.           
  27.         list.add(u1);  
  28.         list.add(u2);  
  29.           
  30.         return list;  
  31.     }  
  32. }  

 

用Spring配置声明暴露服务:

 

[html]  view plain  copy
 
  print ?
  1. <?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.     <!-- 具体的实现bean -->  
  11.     <bean id="demoService" class="com.unj.dubbotest.provider.impl.DemoServiceImpl" />  
  12.   
  13.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  14.     <dubbo:application name="xs_provider" />  
  15.   
  16.     <!-- 使用multicast广播注册中心暴露服务地址 -->  
  17.     <!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
  18.       
  19.     <!-- 使用zookeeper注册中心暴露服务地址 --即zookeeper的所在服务器ip地址和端口号 -->  
  20.     <dubbo:registry address="zookeeper://192.168.24.213:2181" />  
  21.   
  22.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  23.     <dubbo:protocol name="dubbo" port="20880" />  
  24.   
  25.     <!-- 声明需要暴露的服务接口 -->  
  26.     <dubbo:service interface="com.unj.dubbotest.provider.DemoService"  
  27.         ref="demoService" />  
  28.   
  29. </beans>  

 

加载Spring配置,启动服务(或者将项目建为web项目,然后在web.xml中配置好spring的启动,然后扔到tomcat中即可提供服务):

 

[java]  view plain  copy
 
  print ?
  1. package com.unj.dubbotest.provider.impl;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4.   
  5. public class Provider {  
  6.   
  7.     public static void main(String[] args) throws Exception {  
  8.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  9.                 new String[] { "applicationContext.xml" });  
  10.         context.start();  
  11.         System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟  
  12.     }  
  13. }  

 

 

2:服务消费者

 

通过Spring配置引用远程服务:

 

[html]  view plain  copy
 
  print ?
  1. <?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="hjy_consumer" />  
  12.   
  13.     <!-- 使用zookeeper注册中心暴露服务地址 -->  
  14.     <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
  15.     <dubbo:registry address="zookeeper://192.168.24.213:2181" />  
  16.   
  17.     <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
  18.     <dubbo:reference id="demoService"  
  19.         interface="com.unj.dubbotest.provider.DemoService" />  
  20.   
  21. </beans>  

 

调用服务测试:

[java]  view plain  copy
 
  print ?
  1. 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. public class Consumer {  
  10.   
  11.     public static void main(String[] args) throws Exception {  
  12.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  13.                 new String[] { "applicationContext.xml" });  
  14.         context.start();  
  15.   
  16.         DemoService demoService = (DemoService) context.getBean("demoService");  
  17.         String hello = demoService.sayHello("hejingyuan");  
  18.         System.out.println(hello);  
  19.   
  20.         List list = demoService.getUsers();  
  21.         if (list != null && list.size() > 0) {  
  22.             for (int i = 0; i < list.size(); i++) {  
  23.                 System.out.println(list.get(i));  
  24.             }  
  25.         }  
  26.         System.in.read();  
  27.     }  
  28.   
  29. }  

zookeeper启动,tomcat启动dubbo,然后运行2个main。

测试结果:

 

 

附:

1.在消费端, 配置需要调用的服务接口的包名必须和服务端暴露的服务接口包名一致,否则出错。找不到服务 

2.如果想修改dubbo的暴露端口号。还没找到。

 

猜你喜欢

转载自starbhhc.iteye.com/blog/2311430