Spring Boot(五)之集成Dubbo部署RPC服务

本篇博文的主要内容是基于Spring Boot,集成阿里开源的Dubbo,实现一个RPC服务。为了实现该RPC,主要依赖以下运行环境:

环境 版本
jdk 1.8+
Maven 2.0+或者3.0+
ZooKeeper 3.4+
Spring Boot 1.5+
Dubbo 2.5+

RPC的内容:远程过程调用,简单实现对User根据ID进行查询服务。

1. 关于ZooKeeper

ZooKeeper 是Apache基金会的独立顶级项目,用来为大型的分布式计算提供分布式配置、分布式一致性、同步、注册等服务。ZooKeeper提供的服务介绍基本如下:

  • 命名注册:按照名称标记分布式集群中的节点。
  • 配置管理:分布式节点可加载最新的系统配置信息。
  • 集群管理:节点状态管理、节点的加入和删除等。
  • 选举:选举一个分布式应用中的leader节点。
  • 数据共享:用于分布式应用各个节点之间的数据共享。
  • 同步服务:提供数据同步,若有数据修改,可加锁,其他节点也可同步更新数据。

使用Dubbo构建RPC要依赖于ZooKeeper的命名、数据同步、共享等服务,因此,在启动一个Dubbo服务之前,要确保你的ZooKeeper集群处于可用的状态。

2. 关于Dubbo

Dubbo 是阿里开源的一款高性能服务框架,致力于提供高性能的RPC服务、SOA服务治理。使得你的应用可以通过集成RPC提高系统性能,还支持与Spring框架的无缝集成。Dubbo主要包括远程过程调用、集群容错、服务自动发现等核心内容。

Dubbo提供了透明化的远程方法调用,可以像调用本地方法一样调用远程方法。它具备负载均衡及容错机制,也可以实现服务自动注册与发现,不再需要写死服务提供者的地址,并且能够平滑添加或删除服务提供者。

官方提供的Dubbo服务治理流程可如下图所示:

image

  • Registry:服务注册中心,目前依赖于ZooKeeper提供的服务。
  • Monitor:服务监控,比较好理解。
  • Provider:服务端、生产者、服务提供者等,需要先向注册中心注册自己后,才能被消费者发现。
  • Consumer:客户端、消费者等,需要先向注册中心订阅自己需要的服务,然后再向生产者调用该服务。

3. 实现RPC服务端

demo地址: https://code.aliyun.com/zhaoyh_code/springcloud-dubbo-server.git
代码是托管在阿里云上,用任意阿里账号即可访问。

服务端demo的工程目录结构如下:
image

3.1 添加依赖并配置

pom.xml文件中添加如下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-spring-boot}</version>
</dependency>

在application.properties文件中加入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#server
server.port=8090
#log
logging.config=classpath:logConfig.xml
#dubbo配置
#应用名称
spring.dubbo.application.name=provider
#注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.port=20880
spring.dubbo.protocol.name=dubbo
#服务类包目录
spring.dubbo.scan=com.zhaoyh.storage

3.2 实现User接口

在UserServiceImpl.java类中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zhaoyh.storage.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.zhaoyh.model.User;
import com.zhaoyh.storage.IUserService;
/**
* Created by zhaoyh on 2018/3/20
* @author zhaoyh
*/
@Service(version = "1.0")
public class UserServiceImpl implements IUserService {
@Override
public User getUserById(long id) {
return new User(1, "zhaoyh", 26);
}
}

本例子只是实现了简单假查询的过程,在实际的项目中,getUserById方法中是你的DAO层需要实现的。
@Service注解标识为Dubbo的服务,version记录了版本信息。

另外User.java实体类通过Dubbo的RPC服务调用,需要实现序列化的接口。

4. 实现RPC客户端

demo地址: https://code.aliyun.com/zhaoyh_code/springcloud-dubbo-client.git

客户端demo的工程目录结构如下:
image

pom.xml文件与RPC服务端的相同,但是application.properties会略有不同:

1
2
3
4
5
6
7
8
9
10
#server
server.port=8091
#log
logging.config=classpath:logConfig.xml
#dubbo server
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.zhaoyh.storage

只需要指定应用名称和注册中心地址即可。

为了测试RPC服务,本文实现了简单的定时任务用户查询User,参考TestTask.java中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.zhaoyh.storage;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zhaoyh.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* Created by zhaoyh on 2018/3/20
* @author zhaoyh
*/
@Component
public class TestTask {
private static final Logger LOG = LoggerFactory.getLogger(TestTask.class);
@Reference(version = "1.0")
IUserService userService;
@Scheduled(fixedRate = 30000L)
private void test() {
User user = userService.getUserById(1);
LOG.info("Name: " + user.getName());
}
}

通过@Reference注解,订阅Dubbo服务端中对应版本号的服务。

5. 测试

启动环境的顺序为:ZooKeeper->Dubbo Server->Dubbo Client

所有的环境启动成功后,Dubbo Client端会每隔30秒,查询一次IUserService中的服务。

以上内容就是关于Spring Boot(五)之集成Dubbo部署RPC服务的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh