dubbo(一)dubbo+zookeeper 之 Hello World

来源:互联网 发布:mac版本photoshop破解 编辑:程序博客网 时间:2024/05/18 00:46

转载自:http://blog.csdn.net/qq315737546/article/details/52005123

以前2个项目交互,一直用的httpclient,繁琐的很. 用dubbo来做RPC确实好太多啦. 先把这个demo记录下来.

操作步骤:

1.安装zookeeper,下载dubbo-admin的war包.

2.写代码. 分为 接口,提供者,消费者 3个模块

3.测试+后台管理查看


源码地址:

https://code.csdn.net/qq315737546/dt1-api/tree/master

https://code.csdn.net/qq315737546/dt1-provider/tree/master

https://code.csdn.net/qq315737546/dt1-consumer/tree/master


1.安装zookeeper,下载dubbo-admin的war包.

1) zookeeper下载地址http://www.apache.org/dyn/closer.cgi/zookeeper/, 最新版已经是3.5.2了, 我下载的3.4.8

下载完成后,解压,然后找到配置文件  D:\zookeeper-3.4.8\conf\zoo_sample.cfg ,将文件改名为zoo.cfg, 把里面的dataDir地址也改一下. dataDir=D:/zookeeper-3.4.8/tmp

启动zookeeper.

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. d:  
  2. cd zookeeper-3.4.8\bin  
  3. zkServer.cmd  



如果不报错,则说明安装成功. 可以看到上面默认读取了 zoo.cfg文件.


2) 下载 dubbo-admin.war

dubbo官网上的下载链接都不能用,只好去网上下载了. 我也上传了一份到CSDN.http://download.csdn.net/detail/qq315737546/9584233

下载后,找到 tomcat的\webapps\ROOT 目录, 将下面内容删除,然后换上这个war包就可以了.

启动tomcat,访问 http://localhost:8080 , 会让输入用户名密码. 在 WEB-INF\dubbo.properties 里面有 root和guest 2个用户,密码默认和用户名一样.



2.写代码. 分为 接口,提供者,消费者 3个模块

dubbo提供者需要 向外发布接口, 消费者需要调用接口, 所以这2个模块都需要引用接口, 这时候将接口单独出来维护, 供提供者和消费者使用.

我们来建立3个项目.分别是 

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. dt1-api  
  2. dt1-provider  
  3. dt1-consumer  


1) 首先建立接口项目, dt1-api

这个项目最后会当做jar被使用,所以在pom.xml中配置为jar

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <modelVersion>4.0.0</modelVersion>  
  2. <groupId>com.dingcheng</groupId>  
  3. <artifactId>dt1-api</artifactId>  
  4. <version>0.0.1-SNAPSHOT</version>  
  5. <packaging>jar</packaging>  
  6. <name>dt1-api</name>  



这个项目很简单,只有一个interface

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.dingcheng.user.service;  
  2.   
  3. public interface UserService {  
  4.     public String hello(String name);  
  5.     public String test(String name);  
  6. }  


2)建立提供者项目, dt1-provider

首先pom.xml中需要引入 api.jar 以及 dubbo的jar

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1.     <modelVersion>4.0.0</modelVersion>  
  2. <groupId>com.dingcheng</groupId>  
  3. <artifactId>dt1-provider</artifactId>  
  4. <packaging>war</packaging>  
  5. <version>0.0.1-SNAPSHOT</version>  
  6. <name>dt-consumer Maven Webapp</name>  
  7. <url>http://maven.apache.org</url>  

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.     <groupId>com.dingcheng</groupId>  
  3.     <artifactId>dt1-api</artifactId>  
  4.     <version>0.0.1-SNAPSHOT</version>  
  5. </dependency>  
  6.   
  7. <dependency>  
  8.     <groupId>com.alibaba</groupId>  
  9.     <artifactId>dubbo</artifactId>  
  10.     <version>2.5.3</version>  
  11.     <exclusions>  
  12.         <exclusion>  
  13.             <groupId>org.springframework</groupId>  
  14.             <artifactId>spring</artifactId>  
  15.         </exclusion>  
  16.     </exclusions>  
  17. </dependency>  
  18.   
  19. <dependency>  
  20.     <groupId>org.apache.zookeeper</groupId>  
  21.     <artifactId>zookeeper</artifactId>  
  22.     <version>3.4.8</version>  
  23. </dependency>  
  24.   
  25. <dependency>  
  26.     <groupId>com.github.sgroschupf</groupId>  
  27.     <artifactId>zkclient</artifactId>  
  28.     <version>0.1</version>  
  29. </dependency>  

这里注意引入dubbo的时候,需要把它自带的spring包给过滤掉,因为自带的版本太低,会有冲突.


然后实现刚才api里面的接口.

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.dingcheng.user.service.impl;  
  2.   
  3. import org.springframework.stereotype.Service;  
  4.   
  5. import com.dingcheng.user.service.UserService;  
  6.   
  7. @Service("userService")  
  8. public class UserServiceImpl implements UserService{  
  9.     @Override  
  10.     public String hello(String name){  
  11.         return "hello :"+name;  
  12.     }  
  13.   
  14.     @Override  
  15.     public String test(String name) {  
  16.         return "test :"+name;  
  17.     }  
  18. }  


然后就开始配置dubbo.xml, 向外提供服务.

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- 提供方应用信息,用于计算依赖关系, 名称随便就可以 -->  
  2. <dubbo:application name="dt1_provider" />  
  3.   
  4. <!-- 使用zookeeper注册中心暴露服务地址 -->  
  5. <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
  6.   
  7. <!-- 用dubbo协议在20880端口暴露服务 -->  
  8. <dubbo:protocol name="dubbo" port="20880" />  
  9.   
  10. <!-- 声明需要暴露的服务接口 -->  
  11. <dubbo:service interface="com.dingcheng.user.service.UserService" ref="userService" />      


说明:

  dubbo:registry 标签一些属性的说明:

    1register是否向此注册中心注册服务,如果设为false,将只订阅,不注册

     2check注册中心不存在时,是否报错。

     3subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅

     4timeout注册中心请求超时时间(毫秒)

     5address可以Zookeeper集群配置,地址可以多个以逗号隔开等。

  dubbo:service标签的一些属性说明:

    1interface服务接口的路径

     2ref引用对应的实现类的BeanID

     3registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A

     4register 默认true ,该协议的服务是否注册到注册中心。


至此,提供者已经可以了. 我们放在tomcat下运行. 然后去登录管理后台,可以看到如下图所示.



3)建立提供者项目, dt1-consumer

首先 pom.xml中需要引入 api.jar 以及 dubbo的jar. 可dt1-provider一样.

然后 我们写个action,消费者,用来调用刚才的服务


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.dingcheng.user.controller;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9. import org.springframework.web.bind.annotation.ResponseBody;  
  10.   
  11. import com.dingcheng.user.service.UserService;  
  12.   
  13. @Controller  
  14. @RequestMapping("/user")  
  15. public class UserController {  
  16.     @Autowired  
  17.     private UserService userService;  
  18.   
  19.     @RequestMapping("/hello.action")  
  20.     @ResponseBody  
  21.     public Map<String, Object> hello(String name) {  
  22.         String result = userService.hello(name);  
  23.         Map<String, Object> hm = new HashMap<String, Object>();  
  24.         hm.put("name", result);  
  25.         return hm;  
  26.     }  
  27.       
  28.     @RequestMapping("/test.action")  
  29.     @ResponseBody  
  30.     public Map<String, Object> tet(String name) {  
  31.         String result = userService.test(name);  
  32.         Map<String, Object> hm = new HashMap<String, Object>();  
  33.         hm.put("name", result);  
  34.         return hm;  
  35.     }  
  36.   
  37. }  


然后就配置dubbo.xml, 指定提供者

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- 提供方应用信息,用于计算依赖关系,名称无所谓 -->  
  2. <dubbo:application name="dt1_constumer" />  
  3.   
  4. <!-- 使用zookeeper注册中心暴露服务地址 -->  
  5. <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
  6.   
  7.  <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
  8.    <dubbo:reference id="userService" interface="com.dingcheng.user.service.UserService" check="false"/>  

说明:

   dubbo:reference 的一些属性的说明:

     1interface调用的服务接口

     2check 启动时检查提供者是否存在,true报错,false忽略

     3registry 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>id属性,多个注册中心ID用逗号分隔

     4loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用



至此,消费者已经可以了. 我们放在tomcat下运行. 然后去登录管理后台,可以看到如下图所示.




3.测试+后台管理查看

访问http://localhost:8110/dt1-consumer/user/hello.action?name=123456 (我改了端口号)

后台管理在步骤2中已经看到了不少,剩下的功能就慢慢摸索吧.



源码地址:

https://code.csdn.net/qq315737546/dt1-api/tree/master

https://code.csdn.net/qq315737546/dt1-provider/tree/master

https://code.csdn.net/qq315737546/dt1-consumer/tree/master


0 0