构建 Zookeeper + Dubbo + Spring Boot 的分布式调用项目

今天给大家介绍一下如何在SpringBoot中搭建Dubbo+Zookeeper来实现不同系统的RPC调用
这里先和大家说一下什么是RPC框架,简单的来说就是远程接口调用框架。像这类的框架有很多,例如:新浪研发的Motan,还有阿里研发的Dubbo等等之类的。如果大家想要了解更多可以看这篇博客介绍,里面对于框架的对比写的特别不错。
经过考虑,我决定采用Dubbo+Zookeeper来实现RPC调用框架的实现。
一:首先确定一下工具的版本和运行的环境:
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+
其中 SpringBoot ,Dubbo 只要在Maven中配置就可以自动下载jar了,ZooKeeper 需要独立加载软件并运行才可以。
二:接下来先介绍的一下Zookeeper的安装和使用步骤:
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
第一步:需要到官网下载ZooKeeper 3.3+的软件
第二步:下载完毕之后就需要做一些简单的配置了,配置过程如下:
在 conf 目录新建 zoo.cfg ,照着该目录的 zoo_sample.cfg 配置如下。
[html] view plain copy
  1. # The number of milliseconds of each tick  
  2. tickTime=2000  
  3. # The number of ticks that the initial   
  4. # synchronization phase can take  
  5. initLimit=10  
  6. # The number of ticks that can pass between   
  7. # sending a request and getting an acknowledgement  
  8. syncLimit=5  
  9. # the directory where the snapshot is stored.  
  10. dataDir=/tmp/zookeeper  
  11. # the port at which the clients will connect  
  12. clientPort=2181  
第三步: 在 bin 目录下,启动 ZooKeeper
这样关于ZooKeeper安装和使用就基本结束了,接下来是SpringBoot如何配置Dubbo和Zookeeper了。
四:SpringBoot项目构建模块
首先新建一个SpringBoot项目,来作为Dubbo的客户端请求服务。
首先需要在pom.xml加入相应的jar关联:
[html] view plain copy
  1. <!-- Spring Boot Dubbo 依赖 -->  
  2. <dependency>  
  3.     <groupId>io.dubbo.springboot</groupId>  
  4.     <artifactId>spring-boot-starter-dubbo</artifactId>  
  5.     <version>${dubbo-spring-boot}</version>  
  6. </dependency>  
这里还需要额外的添加log4j关联,否则项目会启动报错(具体的原因我也不知道)
[html] view plain copy
  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->  
  2.     <dependency>  
  3.         <groupId>log4j</groupId>  
  4.         <artifactId>log4j</artifactId>  
  5.         <version>1.2.14</version>  
  6.     </dependency>  
接下来就是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:
[html] view plain copy
  1. ## tomcat端口号配置  
  2. server.port=8001  
  3. ## 项目访问路径配置  
  4. server.context-path=/bootTest  
  5. ## Dubbo 应用名称  
  6. spring.dubbo.application.name=consumer  
  7. ##Dubbo 注册中心地址  
  8. spring.dubbo.registry.address=zookeeper://127.0.0.1:2181  
  9. ## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)  
  10. spring.dubbo.scan=lzq.boot.test.service  
接下来就是写功能代码主要有:接口,接口实现类,实体类,控制类,项目启动类
1实体类:
[java] view plain copy
  1. package lzq.boot.test.entity;  
  2. import java.io.Serializable;  
  3. /** 
  4.  * 返回结果实体类 
  5.  * @author linzhiqiang 
  6.  * 
  7.  */  
  8. public class ResultInfo implements Serializable{  
  9.     private static final long serialVersionUID = -1L;  
  10.     private String resultInfo;  
  11.       
  12.     public ResultInfo(String resultInfo) {  
  13.         super();  
  14.         this.resultInfo = resultInfo;  
  15.     }  
  16.   
  17.     public ResultInfo() {  
  18.         super();  
  19.     }  
  20.   
  21.     public String getResultInfo() {  
  22.         return resultInfo;  
  23.     }  
  24.   
  25.     public void setResultInfo(String resultInfo) {  
  26.         this.resultInfo = resultInfo;  
  27.     };  
  28.       
  29. }  
2.接口:
[java] view plain copy
  1. package lzq.boot.test.service;  
  2. /** 
  3.  * RPC调用接口 
  4.  * @author linzhiqiang 
  5.  * 
  6.  */  
  7.   
  8. import lzq.boot.test.entity.ResultInfo;  
  9.   
  10. public interface RPCInterface {  
  11.     /** 
  12.      * 通过Dubbo实现远程RPC调用接口信息 
  13.      * @return 
  14.      */  
  15.     public ResultInfo getRPCInfo();  
  16. }  
3.接口实现类:
[java] view plain copy
  1. package lzq.boot.test.service.impl;  
  2. import org.springframework.stereotype.Component;  
  3. import com.alibaba.dubbo.config.annotation.Reference;  
  4. import lzq.boot.test.entity.ResultInfo;  
  5. import lzq.boot.test.service.RPCInterface;  
  6. /** 
  7.  * RPC调用业务逻辑处理 
  8.  * @author linzhiqiang 
  9.  */  
  10. @Component  
  11. public class RPCInterfaceImpl implements RPCInterface {  
  12.     @Reference(version = "1.0.0")  
  13.     RPCInterface rpcInterface;//调用远程接口的实现类  
  14.       
  15.     @Override  
  16.     public ResultInfo getRPCInfo() {  
  17.         ResultInfo resultInfo=rpcInterface.getRPCInfo();  
  18.         return resultInfo;  
  19.     }  
  20.   
  21. }  
4.控制类:
[java] view plain copy
  1. package lzq.boot.test.controller;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.ResponseBody;  
  6. import lzq.boot.test.entity.ResultInfo;  
  7. import lzq.boot.test.service.RPCInterface;  
  8. /** 
  9.  * Dubbo测试 
  10.  * @author linzhiqiang 
  11.  * 
  12.  */  
  13. @Controller  
  14. public class DubboController {  
  15.     @Autowired  
  16.     private RPCInterface rpcInterface;  
  17.     @RequestMapping("/dubbo")  
  18.     @ResponseBody  
  19.     public String errorNginxTest(){  
  20.         ResultInfo resultInfo=rpcInterface.getRPCInfo();  
  21.         return "result:"+resultInfo.getResultInfo();  
  22.     }  
  23. }  
5.项目启动类:
[java] view plain copy
  1. package lzq.boot.test;  
  2. import org.springframework.boot.SpringApplication;  
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  4. @SpringBootApplication  
  5. public class SpringBootTest1Application {  
  6.     public static void main(String[] args) {  
  7.         SpringApplication.run(SpringBootTest1Application.class, args);  
  8.     }  
  9. }  
最后就是新建一个SpringBoot项目,来作为Dubbo的服务端用来返回请求信息
该项目和客户端项目基本差不多也是先在pom.xml 进行maven的配置
在pom.xml加入相应的jar关联:
[html] view plain copy
  1. <!-- Spring Boot Dubbo 依赖 -->  
  2. <dependency>  
  3.     <groupId>io.dubbo.springboot</groupId>  
  4.     <artifactId>spring-boot-starter-dubbo</artifactId>  
  5.     <version>${dubbo-spring-boot}</version>  
  6. </dependency>  
这里还是需要额外的添加log4j关联,否则项目会启动报错(具体的原因我也不知道)
[html] view plain copy
  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->  
  2.     <dependency>  
  3.         <groupId>log4j</groupId>  
  4.         <artifactId>log4j</artifactId>  
  5.         <version>1.2.14</version>  
  6.     </dependency>  
接下来还是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:
[html] view plain copy
  1. ## tomcat端口号配置  
  2. server.port=8002  
  3. ## 项目访问路径配置  
  4. server.context-path=/bootTest  
  5. ## Dubbo 应用名称  
  6. spring.dubbo.application.name=provider  
  7. ##Dubbo 注册中心地址  
  8. spring.dubbo.registry.address=zookeeper://127.0.0.1:2181  
  9. ##Dubbo 协议名称  
  10. spring.dubbo.protocol.name=dubbo  
  11. ##Dubbo 协议端口  
  12. spring.dubbo.protocol.port=20880  
  13. ## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)  
  14. spring.dubbo.scan=lzq.boot.test.service  
接下来还是写功能代码主要有:接口,接口实现类,实体类,项目启动类
1实体类:
[java] view plain copy
  1. package lzq.boot.test.entity;  
  2. import java.io.Serializable;  
  3. /** 
  4.  * 返回结果实体类 
  5.  * @author linzhiqiang 
  6.  * 
  7.  */  
  8. public class ResultInfo implements Serializable{  
  9.     private static final long serialVersionUID = -1L;  
  10.     private String resultInfo;  
  11.       
  12.     public ResultInfo(String resultInfo) {  
  13.         super();  
  14.         this.resultInfo = resultInfo;  
  15.     }  
  16.   
  17.     public ResultInfo() {  
  18.         super();  
  19.     }  
  20.   
  21.     public String getResultInfo() {  
  22.         return resultInfo;  
  23.     }  
  24.   
  25.     public void setResultInfo(String resultInfo) {  
  26.         this.resultInfo = resultInfo;  
  27.     };  
  28.       
  29. }  
2.接口:
[java] view plain copy
  1. package lzq.boot.test.service;  
  2. /** 
  3.  * RPC调用接口 
  4.  * @author linzhiqiang 
  5.  * 
  6.  */  
  7.   
  8. import lzq.boot.test.entity.ResultInfo;  
  9.   
  10. public interface RPCInterface {  
  11.     /** 
  12.      * 通过Dubbo实现远程RPC调用接口信息 
  13.      * @return 
  14.      */  
  15.     public ResultInfo getRPCInfo();  
  16. }  
3.接口实现类:
[java] view plain copy
  1. package lzq.boot.test.service.impl;  
  2. import com.alibaba.dubbo.config.annotation.Service;  
  3. import lzq.boot.test.entity.ResultInfo;  
  4. import lzq.boot.test.service.RPCInterface;  
  5. /** 
  6.  * RPC接口的实现类 
  7.  * @author linzhiqiang 
  8.  */  
  9. //注册为 Dubbo 服务  
  10. @Service(version = "1.0.0")  
  11. public class RPCInterfaceImpl implements RPCInterface {  
  12.     @Override  
  13.     public ResultInfo getRPCInfo() {  
  14.         ResultInfo resultInfo=new ResultInfo("我是RPC的返回信息,来自其它系统的实现方法");  
  15.         return resultInfo;  
  16.     }  
  17. }  
4.项目启动类:
[java] view plain copy
  1. package lzq.boot.test;  
  2. import org.springframework.boot.SpringApplication;  
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  4. @SpringBootApplication  
  5. public class SpringBootTest2Application {  
  6.     public static void main(String[] args) {  
  7.         SpringApplication.run(SpringBootTest2Application.class, args);  
  8.     }  
  9. }  
启动dubbo的服务端的SpringBoot项目时候,显示以下信息就代表注册成功了。
之后就可以启动dubbo客户端的SpringBoot项目了,在浏览器中访问控制器校验接口是否正确。
下面是校验结果显示截图:

猜你喜欢

转载自blog.csdn.net/qq_30270931/article/details/80476772
今日推荐