springboot 结合zookeeper,dubbo,支持dubbo,rest协议
- 写在前面:
本篇文章主要介绍了springboot怎么样结合dubbo服务,网上类似的文章也很多,但是不自己实战一下,很多坑还是不知道怎么解决。写这篇文章一是记录下期间遇到的坑,还有就是也记录下开发过程,供各位网友参考,写得不好之处,还请各位看官见谅。文章最后会给出源码地址,这里只介绍下核心代码和大概步骤。
- zookeeper安装
zookeeper在其中的作用是提供服务注册,具体安装步骤如下:
1.获取文件
cd /usr/local/
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar -zxvf zookeeper-3.4.10.tar.gz
cd zookeeper-3.4.10
cp zoo_sample.cfg zoo.cfg
2.编辑配置文件
vim zoo.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.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper-3.4.10/data
dataLogDir/usr/local/zookeeper-3.4.10/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=192.168.20.121:2888:3888
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
3.导入环境变量
vim /etc/profile
# zookeeper env export
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
4.启动zk以及查看状态
cd /usr/local/zookeeper-3.4.10/bin/
启动zk
./zkServer.sh start
#查看状态
./zkServer.sh status
- dubbo-admin的安装
dubbo-admin主要是用来管理dubbo服务的注册下线和查看dubbo服务的provider和consumer信息,这里有两种方法,需要看源码的,直接去dubbo官网下载,然后打成war包放到tomcat的webapps目录下就可以了。网盘分享里给出了war包,如果你还觉得不方便,那就直接下载网盘中的tomcat,直接启动就可以访问了。直接下载tomcat的访问地址,用户名密码如下:
http://ip:8088/dubbo-admin-2.6.0/ 用户名:root 密码:root
链接:https://pan.baidu.com/s/1N25BPxBbUGiCxQEH5zph3A 提取码:b3p6
访问后,看到如下画面,即部署成功
- 服务搭建
这里用的是alibaba提供的dubbo依赖,之前用的是apache的dubbo依赖,但是不知道为什么在调用rest服务时,就是发现不了,改成alibaba的就行了,这个原因还没搞清楚,可能后续会更新说明下原因和处理方法,下面给出依赖:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
dubbo服务分为两部分,一部分是provider,服务提供者,也叫生产者,另一部分是consumer,也叫消费者。基本原理就是provider通过发布服务供consumer远程调用消费。对于consumer调用端,只要导入provider端接口就可以了。下面介绍provider端基本代码编写:
1.接口编写
@Path是为了下面支持rest请求,如果只是dubbo协议可以不用,可以理解为@RequestMapping这个注解差不多
@GET就是限制了访问的方法给http->get请求
@Produces是指返回给消费者的时候,是以json格式返回。有的人可能会说,看接口的返回值是UserDto。的确是这样,接口返回的时候,会自动把UserDto转化为json格式返回
@Path("/say")
public interface IRestFileService {
@Path("/hello/{id:\\d+}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public UserDto sayHello(@PathParam("id") String id);
}
2.UserDto编写
package com.weLink.ds.dto;
/**
* @author ex_wanghaiyang
*
* @since 2019年5月14日 上午10:47:38
*/
public class UserDto {
private String id;
private String name;
public UserDto() {
}
public UserDto(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.实现类编写
这里要格外注意,@Service导入的包不是springframe的包,而是com.alibaba.dubbo.config.annotation.Service这个包
protocol = {"rest", "dubbo"}代表这个服务支持dubbo,rest两种协议的请求
@Service(protocol = {"rest", "dubbo"})
public class RestFileServiceImpl implements IRestFileService {
@Override
public UserDto sayHello(String id) {
return new UserDto(id, id + " hello dubbo rest");
}
}
4.配置文件
dubbo.application.id=dubbo-provider-demo
dubbo.application.name=dubbo-provider-demo
dubbo.scan.basePackages=com.weLink.ds.provider.service //接口实现package名
dubbo.registry.address=zookeeper://192.168.20.121:2181 //zk地址
dubbo.registry.id=registry
到这里,基本上provider就告一段落了。
下面介绍consumer的写法
1.consumer编写
/**
* @author ex_wanghaiyang
*
* @since 2019年5月7日 下午1:43:12
*/
@RestController
public class FileConsumerController {
@Reference
private IRestFileService iRestFileService;
@RequestMapping(value = "/hello")
public UserDto hello(HttpServletRequest request, HttpServletResponse respone) {
return iRestFileService.sayHello(request.getParameter("id"));
}
}
2.配置文件
server.port=8090
spring.application.name=provider02
dubbo.registry.address=zookeeper://192.168.20.121:2181
spring.main.allow-bean-definition-overriding=true
访问地址:http://127.0.0.1:8090/hello?id=123
或者通过rest调用http://127.0.0.1:8091/say/hello?id=123(注意,这里8091端口是配置provider配置dubbo时配置的rest协议的端口,具体怎么配置的,可以看我下面给出源码中配置文件和DubboConfig.java中的写法)
基本上dubbo服务基本核心内容就是这样的,下面给出源码地址:
github地址:
provider:https://github.com/joker-hywang/dubbo-provider-api.git
interface:https://github.com/joker-hywang/dubbo-interface-api.git
consumer:https://github.com/joker-hywang/dubbo-consumer-api.git
记住要三个项目一起下载导入到编码工具中才可以。interface下载后要 执行下
mvn clean install -Dmaven.test.skip=true 把依赖打进本地仓库中,有什么问题,可以评论私我,看看能不能帮你们解决,多谢各位观看。