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

今天给大家介绍一下如何在SpringBoot中搭建Dubbo+Zookeeper来实现不同系统的RPC调用

这里先和大家说一下什么是RPC框架,简单的来说就是远程接口调用框架。像这类的框架有很多,例如:新浪研发的Motan,还有阿里研发的Dubbo等等之类的。如果大家想要了解更多可以看这篇博客介绍,里面对于框架的对比写的特别不错。

博客地址:http://blog.csdn.net/liubenlong007/article/details/54692241

经过考虑,我决定采用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+的软件

ZooKeeper下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper

第二步:下载完毕之后就需要做一些简单的配置了,配置过程如下:

在 conf 目录新建 zoo.cfg ,照着该目录的 zoo_sample.cfg 配置如下。

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181

第三步:在 bin 目录下,启动 ZooKeeper

这样关于ZooKeeper安装和使用就基本结束了,接下来是SpringBoot如何配置Dubbo和Zookeeper了。

四:SpringBoot项目构建模块

首先新建一个SpringBoot项目,来作为Dubbo的客户端请求服务。

首先需要在pom.xml加入相应的jar关联:

		<!-- Spring Boot Dubbo 依赖 -->
		<dependency>
			<groupId>io.dubbo.springboot</groupId>
			<artifactId>spring-boot-starter-dubbo</artifactId>
			<version>${dubbo-spring-boot}</version>
		</dependency>

这里还需要额外的添加log4j关联,否则项目会启动报错(具体的原因我也不知道)

	<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>

接下来就是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:

## tomcat端口号配置
server.port=8001
## 项目访问路径配置
server.context-path=/bootTest
## Dubbo 应用名称
spring.dubbo.application.name=consumer
##Dubbo 注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)
spring.dubbo.scan=lzq.boot.test.service

接下来就是写功能代码主要有:接口,接口实现类,实体类,控制类,项目启动类

1实体类:

package lzq.boot.test.entity;
import java.io.Serializable;
/**
 * 返回结果实体类
 * @author linzhiqiang
 *
 */
public class ResultInfo implements Serializable{
    private static final long serialVersionUID = -1L;
	private String resultInfo;
	
	public ResultInfo(String resultInfo) {
		super();
		this.resultInfo = resultInfo;
	}

	public ResultInfo() {
		super();
	}

	public String getResultInfo() {
		return resultInfo;
	}

	public void setResultInfo(String resultInfo) {
		this.resultInfo = resultInfo;
	};
	
}

2.接口:

package lzq.boot.test.service;
/**
 * RPC调用接口
 * @author linzhiqiang
 *
 */

import lzq.boot.test.entity.ResultInfo;

public interface RPCInterface {
	/**
	 * 通过Dubbo实现远程RPC调用接口信息
	 * @return
	 */
	public ResultInfo getRPCInfo();
}

3.接口实现类:

package lzq.boot.test.service.impl;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;
import lzq.boot.test.entity.ResultInfo;
import lzq.boot.test.service.RPCInterface;
/**
 * RPC调用业务逻辑处理
 * @author linzhiqiang
 */
@Component
public class RPCInterfaceImpl implements RPCInterface {
    @Reference(version = "1.0.0")
    RPCInterface rpcInterface;//调用远程接口的实现类
    
	@Override
	public ResultInfo getRPCInfo() {
		ResultInfo resultInfo=rpcInterface.getRPCInfo();
		return resultInfo;
	}

}

4.控制类:

package lzq.boot.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import lzq.boot.test.entity.ResultInfo;
import lzq.boot.test.service.RPCInterface;
/**
 * Dubbo测试
 * @author linzhiqiang
 *
 */
@Controller
public class DubboController {
	@Autowired
	private RPCInterface rpcInterface;
	@RequestMapping("/dubbo")
	@ResponseBody
	public String errorNginxTest(){
		ResultInfo resultInfo=rpcInterface.getRPCInfo();
		return "result:"+resultInfo.getResultInfo();
	}
}

5.项目启动类:

package lzq.boot.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootTest1Application {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootTest1Application.class, args);
	}
}

最后就是新建一个SpringBoot项目,来作为Dubbo的服务端用来返回请求信息

该项目和客户端项目基本差不多也是先在pom.xml 进行maven的配置

在pom.xml加入相应的jar关联:

		<!-- Spring Boot Dubbo 依赖 -->
		<dependency>
			<groupId>io.dubbo.springboot</groupId>
			<artifactId>spring-boot-starter-dubbo</artifactId>
			<version>${dubbo-spring-boot}</version>
		</dependency>

这里还是需要额外的添加log4j关联,否则项目会启动报错(具体的原因我也不知道)

	<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>

接下来还是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:

## tomcat端口号配置
server.port=8002
## 项目访问路径配置
server.context-path=/bootTest
## Dubbo 应用名称
spring.dubbo.application.name=provider
##Dubbo 注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
##Dubbo 协议名称
spring.dubbo.protocol.name=dubbo
##Dubbo 协议端口
spring.dubbo.protocol.port=20880
## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)
spring.dubbo.scan=lzq.boot.test.service

接下来还是写功能代码主要有:接口,接口实现类,实体类,项目启动类

1实体类:

package lzq.boot.test.entity;
import java.io.Serializable;
/**
 * 返回结果实体类
 * @author linzhiqiang
 *
 */
public class ResultInfo implements Serializable{
    private static final long serialVersionUID = -1L;
	private String resultInfo;
	
	public ResultInfo(String resultInfo) {
		super();
		this.resultInfo = resultInfo;
	}

	public ResultInfo() {
		super();
	}

	public String getResultInfo() {
		return resultInfo;
	}

	public void setResultInfo(String resultInfo) {
		this.resultInfo = resultInfo;
	};
	
}

2.接口:

package lzq.boot.test.service;
/**
 * RPC调用接口
 * @author linzhiqiang
 *
 */

import lzq.boot.test.entity.ResultInfo;

public interface RPCInterface {
	/**
	 * 通过Dubbo实现远程RPC调用接口信息
	 * @return
	 */
	public ResultInfo getRPCInfo();
}

3.接口实现类:

package lzq.boot.test.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import lzq.boot.test.entity.ResultInfo;
import lzq.boot.test.service.RPCInterface;
/**
 * RPC接口的实现类
 * @author linzhiqiang
 */
//注册为 Dubbo 服务
@Service(version = "1.0.0")
public class RPCInterfaceImpl implements RPCInterface {
	@Override
	public ResultInfo getRPCInfo() {
		ResultInfo resultInfo=new ResultInfo("我是RPC的返回信息,来自其它系统的实现方法");
		return resultInfo;
	}
}

4.项目启动类:

package lzq.boot.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootTest2Application {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootTest2Application.class, args);
	}
}

启动dubbo的服务端的SpringBoot项目时候,显示以下信息就代表注册成功了。

之后就可以启动dubbo客户端的SpringBoot项目了,在浏览器中访问控制器校验接口是否正确。

下面是校验结果显示截图:

到这里关于构建 Zookeeper + Dubbo + Spring Boot 的分布式调用项目就基本结束了

如果对上面的内容还有什么疑义或者问题都可以加我QQ:208017534咨询。

想要源代码的童鞋也可以加我QQ找我要!!!

参考文献 http://www.cnblogs.com/Alandre/p/6490142.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

CentOS 7如何设置uWSGI和Nginx提供Python应用服务

在本指南中,我们将设置一个由uWSGI提供服务的简单WSGI应用程序。我们将使用Nginx Web服务器作为应用程序服务器的反向代理,以提供强大的连接处理。我们...

1334
来自专栏逸鹏说道

使用OAuth打造webapi认证服务供自己的客户端使用

一、什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不...

3526
来自专栏岑玉海

Hbase 学习(一) hbase配置文件同步

最近在狂啃hadoop的书籍,这部《hbase:权威指南》就进入我的视野里面了,啃吧,因为是英文的书籍,有些个人理解不对的地方,欢迎各位拍砖。 HDFS和H...

3836
来自专栏北京马哥教育

20步打造最安全的Nginx Web服务器(下)

八、控制缓冲区溢出攻击 编辑nginx.conf,为所有客户端设置缓冲区的大小限制。 vi /usr/local/nginx/conf/nginx.conf ...

40312
来自专栏我是攻城师

Spark SQL+Hive历险记

2965
来自专栏小樱的经验随笔

linux bash Shell脚本经典 Fork炸弹演示及命令详解

Jaromil 在 2002 年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在 shell 中运行后几秒后系统就会宕机: :(){:|...

2915
来自专栏静默虚空的博客

Elastic 技术栈之 Filebeat

Elastic 技术栈之 Filebeat 简介 Beats 是安装在服务器上的数据中转代理。 Beats 可以将数据直接传输到 Elasticsearch 或...

4007
来自专栏腾讯云TStack专栏

《大话 Ceph 》之 CephX 那点事儿

这篇文章主要介绍了 Ceph 中的一个重要系统 -- CephX 认证系统。简要介绍了 CephX 的命名格式。并介绍了从集群启动到用户连接集群这一系列流程中 ...

1.7K0
来自专栏闻道于事

JFinal项目发送邮件——jfinal-mail-plugin

JFianl框架: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩...

4324
来自专栏菩提树下的杨过

spring cloud:Edgware.RELEASE版本hystrix超时新坑

升级到Edgware.RELEASE发现,zuul中不管如何设置hystrix的超时时间均不起作用,仍然是默认的1000ms.  降回低版本后正常,但是低版本的...

23810

扫码关注云+社区