分布式服务框架DUBBO--源自技术

DUBBO 简单介绍

  • Dubbo是[1] 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC(远程过程调用协议) 实现服务的输出和输入功能,能够和Spring框架无缝集成。
  • 阿里的DUBBO(http://dubbo.io/)团队解散了,如今由当当团队维护了一个叫DUBBOX(https://github.com/dangdangdotcom/dubbox)的项目。

Zookeeper 安装配置

  1. 下载Zookeeper
  2. 解压到安装文件夹
  3. 将文件zookeeper-3.3.6\conf\zoo_sample.cfg改名称zoo.cfg
  4. 运行zookeeper-3.3.6\bin\zkServer.cmd启动服务

配置文件

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # 这个时间是作为 Zookeeper server之间或client与server之间维持心跳的时间间隔,也就是每一个 tickTime 时间就会发送一个心跳。

      

  2. tickTime=2000  
  3. # 初始化时连接到server端的间隔次数  
  4. initLimit=10  
  5. # ZK Leader 和follower之间通讯的次数。总时间5*2=10秒     
  6. syncLimit=5  
  7. # 保存数据的文件夹。默认情况下将写数据的日志文件也保存在这个文件夹里。  
  8. dataDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_001\\tmp\\zookeeper  
  9. # 日志文件夹  
  10. dataLogDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_001\\logs   
  11. # 这个port就是client连接Zookeeperserver的port。Zookeeper 会监听这个port。接受client的訪问请求。  
  12. clientPort=2181  

Zookeeperclient命令(zkCli.cmd)

  • [zk: localhost:2181(CONNECTED) 4] ls /
    • 查看当前Zookeeper所包括内容
  • [zk: localhost:2181(CONNECTED) 4] ls2 /
    • 查看当前Zookeeper所包括内容并能看到更新次数等数据
  • [zk: localhost:2181(CONNECTED) 4] creater /zk myData
    • 创建一个新的znode节点“zk”以及它关联的字符串
  • [zk: localhost:2181(CONNECTED) 4] get /zk
    • 查看znode节点“zk”的关联字符串等信息
  • [zk: localhost:2181(CONNECTED) 4] set /zk shenlan211314
    • 对znode节点“zk”所关联的字符串进行设置
  • [zk: localhost:2181(CONNECTED) 4] delete /zk
    • 删除znode节点“zk”
  • [zk: localhost:2181(CONNECTED) 4] connect host:port
    • 连接Zookeeper

zookeeper 集群(单机模拟)

  • 将Zookeeper复制成3份
  • 改动每份Zookeeper的配置文件zoo.cfg
  • 在dataDir文件夹下创建一个myid文件中面写1~255的数字(表示自身的id)
  • 启动全部Zookeeper

第一份Zookeeper的配置文件

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # 这个时间是作为 Zookeeper server之间或client与server之间维持心跳的时间间隔,也就是每一个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到server端的间隔次数  
  4. initLimit=10  
  5. # ZK Leader 和follower之间通讯的次数。总时间5*2=10秒     
  6. syncLimit=5  
  7. # 保存数据的文件夹,默认情况下将写数据的日志文件也保存在这个文件夹里。  
  8. dataDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_001\\tmp\\zookeeper  
  9. # 日志文件夹  
  10. dataLogDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_001\\logs   
  11. # 这个port就是client连接Zookeeperserver的port。Zookeeper 会监听这个port。接受client的訪问请求。

      

  12. clientPort=2181  
  13.   
  14. server.1=localhost:2887:3887   
  15. server.2=localhost:2888:3888  
  16. server.3=localhost:2889:3889  

第二份Zookeeper的配置文件

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # 这个时间是作为 Zookeeper server之间或client与server之间维持心跳的时间间隔,也就是每一个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到server端的间隔次数  
  4. initLimit=10  
  5. # ZK Leader 和follower之间通讯的次数。总时间5*2=10秒     
  6. syncLimit=5  
  7. # 保存数据的文件夹,默认情况下将写数据的日志文件也保存在这个文件夹里。

      

  8. dataDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_002\\tmp\\zookeeper  
  9. # 日志文件夹  
  10. dataLogDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_002\\logs   
  11. # 这个port就是client连接Zookeeperserver的port。Zookeeper 会监听这个port,接受client的訪问请求。  
  12. clientPort=2182  
  13.   
  14. server.1=localhost:2887:3887   
  15. server.2=localhost:2888:3888  
  16. server.3=localhost:2889:3889  

第三份Zookeeper的配置文件

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # 这个时间是作为 Zookeeper server之间或client与server之间维持心跳的时间间隔,也就是每一个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到server端的间隔次数  
  4. initLimit=10  
  5. # ZK Leader 和follower之间通讯的次数,总时间5*2=10秒     
  6. syncLimit=5  
  7. # 保存数据的文件夹,默认情况下将写数据的日志文件也保存在这个文件夹里。  
  8. dataDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_003\\tmp\\zookeeper  
  9. # 日志文件夹  
  10. dataLogDir=D:\\apps\\zookeeper-3.3.6\\zookeeper_test_003\\logs   
  11. # 这个port就是client连接Zookeeperserver的port,Zookeeper 会监听这个port,接受client的訪问请求。

      

  12. clientPort=2183  
  13.   
  14. server.1=localhost:2887:3887   
  15. server.2=localhost:2888:3888  
  16. server.3=localhost:2889:3889  

配置文件server.N=YYY:A:B

  • N:serverid(myid文件里的id)
  • YYY:server的IP地址
  • A:LF通信port,表示该server与集群中的leader交换的信息的port
  • B:选举port,表示选举新leader时server间相互通信的port
    • 集群中每一个server的Aport都是一样,每一个server的Bport也是一样。可是当所採用的为伪集群时。IP地址都一样。仅仅能时Aport和Bport不一样。

JAVA 操作Zookeeper

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 注冊回调 */  
  2. Watcher watcher =  new Watcher() {  
  3.     public void process(WatchedEvent event) {  
  4.     }  
  5. };  
  6.   
  7. try {  
  8.     ZooKeeper zk = new ZooKeeper("127.0.0.1:2181"500000, watcher);  
  9.     //创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即clientshutdown了也不会消失)  
  10.     zk.create("/root""mydata".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
  11.   
  12.     //在root以下创建一个childone znode,数据为childone,不进行ACL权限控制。节点为永久性的  
  13.     zk.create("/root/childone","childone".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);  
  14.   
  15.     //取得/root节点下的子节点名称,返回List<string>  
  16.     zk.getChildren("/root",true);  
  17.   
  18.     //取得/root/childone节点下的数据,返回byte[]  
  19.     zk.getData("/root/childone"truenull);  
  20.   
  21.     //改动节点/root/childone下的数据,第三个參数为版本号,假设是-1。那会无视被改动的数据版本号,直接改掉  
  22.     zk.setData("/root/childone","childonemodify".getBytes(), -1);  
  23.   
  24.     //删除/root/childone这个节点。第二个參数为版本号。-1的话直接删除,无视版本号  
  25.     zk.delete("/root/childone", -1);  
  26.             
  27.     //关闭session  
  28.     zk.close();  
  29. catch (IOException e) {  
  30.     e.printStackTrace();  
  31. catch (KeeperException e) {  
  32.     e.printStackTrace();  
  33. catch (InterruptedException e) {  
  34.     e.printStackTrace();  
  35. }  

编译DUBBO

  • 从GitHub下载源代码(建议下载DUBBOX的最新版本号)
  • 进入源代码project文件夹
  • mvn install -Dmaven.test.skip=true
  • 假设报包依赖错误就加入几个maven镜像
    [html] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. <mirror>  
    2.     <id>kafeitu</id>  
    3.     <mirrorOf>central</mirrorOf>  
    4.     <name>Human Readable Name for this Mirror.</name>  
    5.     <url>http://maven.kafeitu.me/nexus/content/repositories/public</url>  
    6. </mirror>  
    7. <mirror>  
    8.     <id>ibiblio.org</id>  
    9.     <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>  
    10.     <url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>  
    11.     <mirrorOf>*</mirrorOf>  
    12. </mirror>  
    13. <mirror>  
    14.     <id>lvu.cn</id>  
    15.     <name>lvu.cn</name>  
    16.     <url>http://lvu.cn/nexus/content/groups/public</url>  
    17.     <mirrorOf>*</mirrorOf>  
    18. </mirror>  


DUBBO演示样例

创建MavenprojectUser-Server-Api(实体Bean和接口)

  • Bean
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class User implements java.io.Serializable{  
  2.   
  3.     private static final long serialVersionUID = -1591493796674994627L;  
  4.       
  5.     private String name;  
  6.   
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public User(String n){  
  14.         this.name = n;  
  15.     }  
  16. }  
  • 提供的服务
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public interface UserService {  
  2.       
  3.     public List<user> getUser();  
  4. }  
  5. lt;/user>  

创建MavenprojectUser-Server-Provider(服务提供者)

  • 加入第三方依赖
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <!--- 接口依赖  -->  
  2. <dependency>  
  3.  <groupId>dubbo-test</groupId>  
  4.  <artifactId>User-Server-Api</artifactId>  
  5.  <version>0.0.1-SNAPSHOT</version>  
  6. </dependency>  
  7.   
  8. <!--- 第三方依赖  -->  
  9. <dependency>  
  10.  <groupId>com.alibaba</groupId>  
  11.  <artifactId>dubbo</artifactId>  
  12.  <version>2.5.3</version>  
  13. </dependency>  
  14. <dependency>  
  15.  <groupId>org.apache.zookeeper</groupId>  
  16.  <artifactId>zookeeper</artifactId>  
  17.  <version>3.4.6</version>  
  18. </dependency>  
  19. <dependency>  
  20.  <groupId>com.github.sgroschupf</groupId>  
  21.  <artifactId>zkclient</artifactId>  
  22.  <version>0.1</version>  
  23. </dependency>  
  24. <dependency>  
  25.  <groupId>io.netty</groupId>  
  26.  <artifactId>netty</artifactId>  
  27.  <version>4.0.0.Alpha8</version>  
  28. </dependency>  
  29. <dependency>  
  30.  <groupId>org.slf4j</groupId>  
  31.  <artifactId>slf4j-api</artifactId>  
  32.  <version>1.7.14</version>  
  33. </dependency>  
  34. <dependency>  
  35.  <groupId>org.slf4j</groupId>  
  36.  <artifactId>slf4j-log4j12</artifactId>  
  37.  <version>1.7.14</version>  
  38. </dependency>  
  • 提供服务的实现
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class UserServiceImpl implements UserService{  
  2.   
  3.     public List<user> getUser(){  
  4.         List<user> users = new ArrayList<user>();  
  5.         users.add(new User("李连杰"));  
  6.         users.add(new User("成龙"));  
  7.         users.add(new User("吴京"));  
  8.         return users;  
  9.     }  
  10. }  
  11. lt;/user></user></user>  
  • 加入dubbo-provider.xml(文件名称任意)配置提供的服务
    • XML默认存放路径"META-INF/spring/dubbo-provider.xml"
    • 加入dubbo.properties文件能够改动XML的默认路径
      • dubbo.spring.config=classpath*:dubbo-provider.xml
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  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"    
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans            
  6.     http://www.springframework.org/schema/beans/spring-beans.xsd            
  7.     http://code.alibabatech.com/schema/dubbo            
  8.     http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    
  9.      
  10.     <!-- 提供方应用信息。用于计算依赖关系 -->    
  11.     <dubbo:application name="User-Server"  />  
  12.      
  13.     <!-- 使用zookeeper注冊中心暴露服务地址 -->    
  14.     <dubbo:registry address="zookeeper://127.0.0.1:2181" />    
  15.      
  16.     <!-- 用dubbo协议在20880端口暴露服务 -->    
  17.     <dubbo:protocol name="dubbo" port="20880" />    
  18.   
  19.     <!-- 和本地bean一样实现服务 -->    
  20.     <bean id="userService" class="com.wwq.test.UserServiceImpl" />    
  21.      
  22.     <!-- 声明须要暴露的服务接口 -->    
  23.     <dubbo:service interface="com.wwq.test.UserService" ref="userService" />  
  24.      
  25. </beans>    
  • DUBBO服务启动入口
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Main {  
  2.      public static void main(String[] args) throws Exception {  
  3.             /* 启动DUBBO服务 */  
  4.             com.alibaba.dubbo.container.Main.main(args);  
  5.      }  
  6. }  

创建MavenprojectUser-Consumption(消费者)

  • 加入第三方依赖
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <!--- 接口依赖  -->  
  2. <dependency>  
  3.  <groupId>dubbo-test</groupId>  
  4.  <artifactId>User-Server-Api</artifactId>  
  5.  <version>0.0.1-SNAPSHOT</version>  
  6. </dependency>  
  7.   
  8. <!--- 第三方依赖  -->  
  9. <dependency>  
  10.  <groupId>com.alibaba</groupId>  
  11.  <artifactId>dubbo</artifactId>  
  12.  <version>2.5.3</version>  
  13. </dependency>  
  14. <dependency>  
  15.  <groupId>org.apache.zookeeper</groupId>  
  16.  <artifactId>zookeeper</artifactId>  
  17.  <version>3.4.6</version>  
  18. </dependency>  
  19. <dependency>  
  20.  <groupId>com.github.sgroschupf</groupId>  
  21.  <artifactId>zkclient</artifactId>  
  22.  <version>0.1</version>  
  23. </dependency>  
  24. <dependency>  
  25.  <groupId>io.netty</groupId>  
  26.  <artifactId>netty</artifactId>  
  27.  <version>4.0.0.Alpha8</version>  
  28. </dependency>  
  29. <dependency>  
  30.  <groupId>org.slf4j</groupId>  
  31.  <artifactId>slf4j-api</artifactId>  
  32.  <version>1.7.14</version>  
  33. </dependency>  
  34. <dependency>  
  35.  <groupId>org.slf4j</groupId>  
  36.  <artifactId>slf4j-log4j12</artifactId>  
  37.  <version>1.7.14</version>  
  38. </dependency>  
  • 加入配置文件spring-dubbo.xml
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  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"    
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans            
  6.     http://www.springframework.org/schema/beans/spring-beans.xsd            
  7.     http://code.alibabatech.com/schema/dubbo            
  8.     http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  9.        
  10.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件。不要与提供方一样 -->    
  11.     <dubbo:application name="User-consumer"/>  
  12.       
  13.     <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
  14.       
  15.     <!-- 生成远程服务代理,能够和本地bean一样使用demoService -->    
  16.     <dubbo:reference id="userService" interface="com.wwq.test.UserService" />    
  17. </beans>   
  • 获取提供的服务进行业务操作
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class UserAction {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String connFile = "spring-dubbo.xml";  
  5.         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(connFile);  
  6.         UserService userService = (UserService)applicationContext.getBean("userService");  
  7.         System.out.println(userService.getUser());  
  8.     }  
  9. }  

測试我们编写的DUBOO

  • 启动注冊中心Zookeeper
  • 启动服务管理中心dubbo-admin
  • 执行服务提供项目的Main.java启动Dubbo服务
  • 执行服务消费项目的UserAction.java进行測试

posted @ 2017-07-08 21:31  jzdwajue  阅读(270)  评论(0编辑  收藏  举报