Springboot+Dubbo+Nacos 注解方式实现微服务调用

释放双眼,带上耳机,听听看~!

一.项目结构


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官方文档:

https://nacos.io/zh-cn/docs/quick-start.html

默认账号密码是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测试接口

八.项目源码

码云:

https://gitee.com/liselotte/spring-boot-dubbo-demo

GitHub:

https://github.com/xuyulong2017/my-java-demo

给TA打赏
共{{data.count}}人
人已打赏
安全网络

CDN安全市场到2022年价值76.3亿美元

2018-2-1 18:02:50

安全漏洞

英特尔修复 Linux CPU 漏洞:19 年前的奔腾3也支持

2018-1-11 11:12:22

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索