一.项目结构
1
2
3
4
5
6 1|-- spring-boot-dubbo-demo (父级工程)
2 |-- spring-boot-dubbo-base (基础工程)
3 |-- spring-boot-dubbo-consumer (消费者)
4 |-- spring-boot-dubbo-provider (生产者)
5
6
SpringBoot版本:2.2.0
Dubbo版本:2.7.0
Nacos版本:1.1.4
二.启动Nacos注册中心
Nacos官方文档:
默认账号密码是nacos
三.搭建项目
Consumer和Provider的Maven依赖如下:
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
27
28
29
30
31
32
33
34
35
36 1<dependencies>
2 <dependency>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-web</artifactId>
5 </dependency>
6 <!-- Base依赖 -->
7 <dependency>
8 <groupId>com.sans</groupId>
9 <artifactId>spring-boot-dubbo-base</artifactId>
10 <version>0.0.1-SNAPSHOT</version>
11 </dependency>
12 <!-- Dubbo依赖 -->
13 <dependency>
14 <groupId>org.apache.dubbo</groupId>
15 <artifactId>dubbo-spring-boot-starter</artifactId>
16 <version>2.7.0</version>
17 </dependency>
18 <dependency>
19 <groupId>org.apache.dubbo</groupId>
20 <artifactId>dubbo</artifactId>
21 <version>2.7.0</version>
22 </dependency>
23 <!-- Nacos依赖 -->
24 <dependency>
25 <groupId>org.apache.dubbo</groupId>
26 <artifactId>dubbo-registry-nacos</artifactId>
27 <version>2.7.1</version>
28 </dependency>
29 <dependency>
30 <groupId>com.alibaba.nacos</groupId>
31 <artifactId>nacos-client</artifactId>
32 <version>1.0.0</version>
33 </dependency>
34</dependencies>
35
36
Consumer配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1# 配置端口
2server:
3 port: 8862
4dubbo:
5 # 配置服务信息
6 application:
7 name: dubbo-consumer
8 # 禁用QOS同一台机器可能会有端口冲突现象
9 qos-enable: false
10 qos-accept-foreign-ip: false
11 # 配置注册中心
12 registry:
13 address: nacos://127.0.0.1:8848
14 # 设置超时时间
15 consumer:
16 timeout: 4000
17spring:
18 main:
19 # 解决Bean重复定义问题
20 allow-bean-definition-overriding: true
21
22
Provider配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 1# 配置端口
2server:
3 port: 8861
4dubbo:
5 # 配置服务信息
6 application:
7 name: dubbo-provider
8 # 禁用QOS同一台机器可能会有端口冲突现象
9 qos-enable: false
10 qos-accept-foreign-ip: false
11 # 配置注册中心
12 registry:
13 address: nacos://127.0.0.1:8848
14 # 设置协议-协议由提供方指定消费方被动接受
15 protocol:
16 name: dubbo
17 port: 20880
18spring:
19 main:
20 # 解决Bean重复定义问题
21 allow-bean-definition-overriding: true
22
23
四.Base工程编写
编写DTO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1/**
2 * RPC接口DTO
3 * 注意这里要实现序列化接口
4 * @Author Sans
5 * @CreateTime 2019/11/6 23:04
6 */
7@Data
8public class ProviderTestDTO implements Serializable {
9 // ID
10 private int id;
11 // 名字
12 private String name;
13 // 序号
14 private Integer number;
15}
16
17
编写Serivce
1
2
3
4
5
6
7
8
9
10 1/**
2 * RPC接口
3 * @Author Sans
4 * @CreateTime 2019/11/6 23:03
5 */
6public interface IProviderService {
7 List<ProviderTestDTO> queryList();
8}
9
10
编写返回结果类
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 1/**
2 * 返回结果类
3 * 这里采用构建者模式构建
4 * 优点:1.私有化构造器访问范围小 2.参数可灵活设置便于管理
5 * @Author Sans
6 * @CreateTime 2019/11/7 18:59
7 */
8@Getter
9public class ResultVO<T> implements Serializable {
10
11 /**
12 * 返回码
13 */
14 private int code;
15 /**
16 * 返回信息
17 */
18 private String message;
19 /**
20 * 返回数据
21 */
22 private T data;
23
24 /** 私有化构造器 **/
25 private ResultVO() {}
26 private ResultVO(ResultVO<T> resultVO) {
27 this.code = resultVO.code;
28 this.message = resultVO.message;
29 this.data = resultVO.data;
30 }
31
32 /**
33 * Build
34 */
35 public static class Builder<T>{
36 private ResultVO<T> resultVO;
37 public Builder() {
38 resultVO = new ResultVO<>();
39 }
40 public Builder code(int code){
41 resultVO.code = code;
42 return this;
43 }
44 public Builder message(String message){
45 resultVO.message = message;
46 return this;
47 }
48 public Builder data(T data){
49 resultVO.data = data;
50 return this;
51 }
52 public ResultVO<T> build(){
53 return new ResultVO<>(resultVO);
54 }
55 }
56}
57
58
五.Provider工程编写
在启动类上面不要忘记加上@EnableDubbo注解
1
2
3
4
5
6
7
8
9 1@EnableDubbo //开启Dubbo的注解支持
2@SpringBootApplication
3public class ProviderApplication {
4 public static void main(String[] args) {
5 SpringApplication.run(ProviderApplication.class, args);
6 }
7}
8
9
实现IProviderService接口,注意这里的Serivce引用的是dubbo的包
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
27 1/**
2 * 生产者Dubbo接口实现
3 * @Author Sans
4 * @CreateTime 2019/11/6 23:01
5 */
6@Service
7public class ProviderServiceImpl implements IProviderService {
8 @Override
9 public List<ProviderTestDTO> queryList() {
10 // 初始化数据
11 ProviderTestDTO testDTO1 = new ProviderTestDTO();
12 testDTO1.setId(1);
13 testDTO1.setName("学生");
14 testDTO1.setNumber(100);
15 ProviderTestDTO testDTO2 = new ProviderTestDTO();
16 testDTO2.setId(2);
17 testDTO2.setName("教师");
18 testDTO2.setNumber(101);
19 // 组装数据
20 List<ProviderTestDTO> list = new ArrayList<>();
21 list.add(testDTO1);
22 list.add(testDTO2);
23 return list;
24 }
25}
26
27
六.Consumer工程编写
和Provider工程的启动类一样,加上@EnableDubbo注解
1
2
3
4
5
6
7
8
9 1@EnableDubbo //开启dubbo的注解支持
2@SpringBootApplication
3public class ConsumerApplication {
4 public static void main(String[] args) {
5 SpringApplication.run(ConsumerApplication.class, args);
6 }
7}
8
9
编写测试接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1/**
2 * 消费测试接口
3 * @Author Sans
4 * @CreateTime 2019/11/6 23:09
5 */
6@RestController
7@RequestMapping("/consumer")
8public class ConsumerController {
9 // Dubbo远程调用注解
10 @Reference
11 private IProviderService providerService;
12 @RequestMapping(value = "/list",method = RequestMethod.GET)
13 public ResultVO getList(){
14 // 远程调用
15 List<ProviderTestDTO> providerTestDTOList = providerService.queryList();
16 return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build();
17 }
18}
19
20
七.测试
启动Provider工程和Consumer工程,这个时候Nacos会有对应的服务
使用Postman访问Consumer测试接口
八.项目源码
码云:
GitHub: