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

一.项目结构

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<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# 配置端口 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# 配置端口 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 * 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 * 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 * 优点: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@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 * 生产者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@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 * @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

下一篇:dubbo服务暴露

代码交流 2021