休息了一个月终于又要上班了,下家公司的项目用的是Dubbo+Zookeeper,由于之前只用过Spring Cloud,所以提前了解一下Dubbo的使用,搭了个简单的 demo 感受 Dubbo 和 Spring Cloud 的区别。
大概流程如下:
Dubbo 是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节。同时 Dubbo 也是一款服务治理框架,它为分布式部署的微服务提供了服务发现、流量调度等服务治理解决方案。
下图是 Dubbo 的基本工作原理图(在官网找的),服务提供者与服务消费者之间通过注册中心协调地址,通过约定的协议实现数据交换。
接下来就搭建一个 demo ,感受一下 Dubbo 的使用和 Spring Cloud 有什么区别。
Dubbo 使用 Zookeeper 作为注册中心,提供服务注册和发现,跟Spring Cloud的 eureka 或 nacos 类似。
所以第一步当然是去官网下载 Zookeeper 啦,我下载的版本是3.6.3。
下载解压后,进入 conf 文件夹可以看到有个 zoo_sample.cfg 文件,这个是配置文件示例,现在复制并更名为 zoo.cfg ,根据自己的需要对配置进行更改,我改了一下数据路径。
Zookeeper 的端口号默认是2181,可以根据自己的需要对 clientPort 的值进行更改。
dataDir=E:/zookeeper/data
clientPort=2181
进入bin文件夹可以看到里面有很多脚本,zkServer.cmd 和 zkServer.sh 就是启动脚本,我的电脑系统是 windows ,所以直接双击 zkServer.cmd 即可启动。
Zookeeper 启动完成之后,我们需要一个可视化界面方便对服务进行观察和管理。
Dubbo-admin的Github地址是 https://github.com/apache/dubbo-admin ,直接 git clone 下来。项目里有 readme.md 介绍启动流程,参考 readme.md 启动项目。
打开 dubbo-admin\dubbo-admin-server\src\main\resources\application.properties 可以修改配置,指定 Zookeeper 地址,我的 Zookeeper 是默认配置,所以不用修改。
进入到项目里编译并打包项目。
mvn clean package -Dmaven.test.skip=true
可以直接在项目根目录运行 mvn --projects dubbo-admin-server spring-boot:run 启动项目,也可以进入 dubbo-admin-distribution\target 运行里面的jar包。
** 启动失败 **
我刚开始启动失败了,这个 dubbo-admin 的启动端口是 8080,但是我发现 8080 端口已经被占用了,最后发现是 Zookeeper 占用的,原来是 Zookeeper 内嵌了一个管理控制台,通过 jetty 启动,这个 jetty 的端口就是 8080,于是我去改了以下 Zookeeper 的 zoo.cfg ,新增了一行配置把 Zookeeper 的管理控制台端口改为 8081。
admin.serverPort=8081
启动成功后就可以访问 http://127.0.0.1:8080 了,默认的账号密码都是root。
接下来就要创建工程了,先创建个 maven 多模块工程,里面需要包含三个模块,一个是 api 模块,一个是服务提供者模块,一个是服务消费者模块。
假设我这个服务是一个用户查询的服务,那我就需要先创建一个 dto 和一个接口。
创建一个用户信息类,需要注意的是,dto 要实现 Serializable 接口进行序列化。当然,也可以使用其它的序列化方式,hessian2、json等。
public class UserInfo implements Serializable {
private static final long serialVersionUID = 2908612893636115165L;
private String userName;
private Long userId;
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
}
简单定义一个接口。
public interface UserService {
public List getUserInfoList();
}
现在创建一个服务提供者模块。
这个模块需要 Dubbo 和 Zookeeper 相关依赖,再加上这个模块是要实现 UserService 接口,所以也需要刚才创建的 api 模块依赖。
1.8
2.7.5
2.12.0
org.springframework.boot
spring-boot-starter
org.apache.dubbo
dubbo-spring-boot-starter
${dubbo.version}
org.apache.dubbo
dubbo-dependencies-zookeeper
${dubbo.version}
pom
org.slf4j
slf4j-log4j12
org.apache.curator
curator-framework
${curator.version}
org.apache.curator
curator-recipes
${curator.version}
com.handsomedong
dubbo-api
0.0.1-SNAPSHOT
根据上图的配置,修改 application.yml,我的配置如下:
server:
port: 9000
debug: true
dubbo:
application:
name: user-service-provider
registry:
address: 127.0.0.1:2181
protocol: zookeeper
protocol:
name: dubbo
port: 19000
monitor:
protocol: registry
实现用户服务接口,注意这里的 @Service 注解,不是 Spring 的注解,而是 Dubbo 的注解!包的全路径是 org.apache.dubbo.config.annotation.Service。
并且需要注意的是,它必须要实现 UserService 接口。
@Service
@Component
public class UserServiceImpl implements UserService {
@Override
public List getUserInfoList() {
List userInfoList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
UserInfo userInfo = new UserInfo();
userInfo.setUserId(Integer.valueOf(i).longValue());
userInfo.setUserName("七里翔" + i);
userInfoList.add(userInfo);
}
return userInfoList;
}
}
最后在启动类要加上 @EnableDubbo 注解。
@EnableDubbo
@SpringBootApplication
public class UserProviderApplication {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication.class, args);
}
}
现在再去 Dubbo Admin 上面就可以看到这个服务注册成功了!点击详情也可以看到服务的具体信息。
最后就是创建服务消费者模块了,在该模块下进行服务调用。
依赖基本和服务提供者相同,这个就不多BB了。
1.8
2.7.5
2.12.0
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.apache.dubbo
dubbo-spring-boot-starter
${dubbo.version}
org.apache.dubbo
dubbo-dependencies-zookeeper
${dubbo.version}
pom
org.slf4j
slf4j-log4j12
org.apache.curator
curator-framework
${curator.version}
org.apache.curator
curator-recipes
${curator.version}
com.handsomedong
dubbo-api
0.0.1-SNAPSHOT
application.yml
server:
port: 10000
debug: true
dubbo:
application:
name: user-service-consumer
registry:
address: zookeeper://127.0.0.1:2181
monitor:
protocol: registr
我这里直接创建个 Controller 来测试。
@RestController
@RequestMapping("test")
public class TestController {
@Reference //dubbo
UserService userService;
@GetMapping("test")
public List test() {
List userInfoList = userService.getUserInfoList();
return userInfoList;
}
}
这个启动类同样要加上 @EnableDubbo 注解。
@EnableDubbo
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}