分布式服务框架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
 
  1. # 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到服务器端的间隔次数  
  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. # 这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。  
  12. clientPort=2181  

  • zoo.cfg配置详情
  • Zookeeper原理
  • Paxos算法与Zookeeper分析
  • Paxos 算法百科

Zookeeper客户端命令(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
 
  1. # 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到服务器端的间隔次数  
  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. # 这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。  
  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
 
  1. # 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到服务器端的间隔次数  
  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. # 这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。  
  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
 
  1. # 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。  
  2. tickTime=2000  
  3. # 初始化时连接到服务器端的间隔次数  
  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. # 这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。  
  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:服务器id(myid文件中的id)
  • YYY:服务器的IP地址
  • A:LF通信端口,表示该服务器与集群中的leader交换的信息的端口
  • B:选举端口,表示选举新leader时服务器间相互通信的端口
    • 集群中每个服务器的A端口都是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样。

JAVA 操作Zookeeper

[java]  view plain  copy
 
  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权限控制,节点为永久性的(即客户端shutdown了也不会消失)  
  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的最新版本)
  • 进入源码工程目录
  • mvn install -Dmaven.test.skip=true
  • 如果报包依赖错误就添加几个maven镜像
    [html]  view plain  copy
     
    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示例

创建Maven工程User-Server-Api(实体Bean和接口)

  • Bean
[java]  view plain  copy
 
  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
 
  1. public interface UserService {  
  2.       
  3.     public List<user> getUser();  
  4. }  
  5. lt;/user>  

创建Maven工程User-Server-Provider(服务提供者)

  • 添加第三方依赖
[html]  view plain  copy
 
  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
 
  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
 
  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
 
  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. }  

创建Maven工程User-Consumption(消费者)

  • 添加第三方依赖
[html]  view plain  copy
 
  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
 
  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
 
  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进行测试

你可能感兴趣的:(分布式服务框架DUBBO--源自技术)