spring boot 2+dubbo+zookeeper搭建指南
0.写在前边
- 关于spring boot、dubbo、zookeeper的基础知识就不在此普及了,大家自行百度。之前项目一直用的是比较笨重的springMVC,最近想转路线,于是调研了几个方向。并基于分布式的潮流,试着搭建了spring boot2+dubbo的环境。结合网上搜的一些教程,将搭建过程写下来。
1.版本
- spring boot 2.1.1
- dubbo 2.6.2
- dubbo starter 0.2.0
- zookeeper 3.4.12
2.搭建环境
- window开发机(jdk+tomcat+maven+eclipse):eclipse 运行dubbo-consumer、dubbo-provider,tomcat运行 dubbo-admin
- linux开发机(jdk):运行zookeeper(单机版)
3.zookeeper安装
- 先安装jdk
- https://www.apache.org/dyn/closer.cgi/zookeeper 网址下有下载链接,选择了http://mirrors.hust.edu.cn/apache/zookeeper/镜像下资源下载。
- linux下运行
curl http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz -O
,将文件下载到本地(也可内网直接下载) - 解压缩
tar zxf zookeeper-3.4.12.tar.gz
- 在zookeeper-3.4.12目录下,创建data、log文件夹
mkdir data
,mkdir log
- 在conf目录下,
cp zoo_sample.cfg zoo.cfg
- 修改zoo.cfg,指定data及log目录(log目录不指定默认和data一致)
dataDir=/zookeeper-3.4.12/data
dataLogDir=/zookeeper-3.4.12/log
端口为默认的2181 - 进入bin目录,启动zookeeper
./zkServer.sh start
,会显示启动信息,如使用的配置文件等 - 可执行
bash bin/zkServer.sh status
查看状态
dubbo-admin安装
-
https://github.com/apache/incubator-dubbo/releases为dubbo发布地址,查看日志可知,在dubbo-2.6.1版本进行了重构,dubbo-admin已剥离为单独项目ops。新项目采用前后分离,前端使用vue.js。在部署时,需要安装maven、node才可。可能由于windows问题,mvn clean package时有报错,导致部署失败。对新版感兴趣可参考https://github.com/apache/incubator-dubbo-ops部署。我选择了下载2.5.10版本。
-
进入dubbo-admin目录下,修改配置文件的zookeeper地址为安装好的zookeeper地址,配置文件目录
incubator-dubbo-dubbo-2.5.10\dubbo-admin\src\main\webapp\WEB-INF\dubbo.properties
-
运行mvn clean package,之后在target目录下找到war包放在tomcat的webapps中启动,访问http://localhost:8080/dubbo-admin-2.5.10/。查看系统状态可知我们已连接到注册中心zookeeper
dubbo-provider
- 在https://start.spring.io/中选择web依赖,生成项目,导入eclipse
- 修改provider的pom文件,只需加入dubbo-spring-boot-starter,完整pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dubbo</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>2.6</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 修改配置文件application.properties
server.port=8081
# Service version
demo.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages = com.dubbo.provider.service
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = provider1
dubbo.application.name = provider-1
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## RegistryConfig Bean
dubbo.registry.id = my-registry1
dubbo.registry.address = zookeeper://192.168.1.143:2181
- 实现服务提供接口,分别定义**接口类(必需?不定义会报错)**及接口实现类,接口实现类如下:
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.provider.service.TestService;
@Service(version = "${demo.service.version}", protocol = { "dubbo" }, registry = "${dubbo.registry.id}")
public class TestServiceImpl implements TestService {
@Override
public String sayHello(String name) {
return "Hello, " + name + " (from Spring Boot)";
}
}
- 启动spring boot,在dubbo-admin中可见服务已经注册
dubbo-consumer
- 在https://start.spring.io/中选择web依赖,生成项目,导入eclipse
- pom文件与provider类似,需新增对provider项目的依赖(?):
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- properties文件配置
spring.application.name = dubbo-consumer
server.port = 9091
dubbo.application.name = dubbo-consumer
demo.service.version = 1.0.0
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
dubbo.registry.address = zookeeper://192.168.1.143:2181
dubbo.consumer.timeout = 5000
- controller中调用服务接口,代码如下
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.provider.service.TestService;
@RestController
public class TestController {
@Reference(version = "${demo.service.version}")
private TestService testService;
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name) {
return testService.sayHello(name);
}
}
-
启动spring boot,在dubbo-admin中可见消费者已经注册