基於Springboot+Dubbo+Nacos 註解方式實現微服務呼叫

spring_root發表於2020-02-25

1 專案結構

 

|-- spring-boot-dubbo-demo (父級工程)    |-- spring-boot-dubbo-base (基礎工程)    |-- spring-boot-dubbo-consumer (消費者)    |-- spring-boot-dubbo-provider (生產者)

SpringBoot版本:2.2.0

Dubbo版本:2.7.0

Nacos版本:1.1.4

2 啟動Nacos註冊中心

Nacos官方文件:

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

預設賬號密碼是nacos

3 搭建專案

Consumer和Provider的Maven依賴如下:

 

<dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- Base依賴 -->        <dependency>            <groupId>com.sans</groupId>            <artifactId>spring-boot-dubbo-base</artifactId>            <version>0.0.1-SNAPSHOT</version>        </dependency>        <!-- Dubbo依賴 -->        <dependency>            <groupId>org.apache.dubbo</groupId>            <artifactId>dubbo-spring-boot-starter</artifactId>            <version>2.7.0</version>        </dependency>        <dependency>            <groupId>org.apache.dubbo</groupId>            <artifactId>dubbo</artifactId>            <version>2.7.0</version>        </dependency>        <!-- Nacos依賴 -->        <dependency>            <groupId>org.apache.dubbo</groupId>            <artifactId>dubbo-registry-nacos</artifactId>            <version>2.7.1</version>        </dependency>        <dependency>            <groupId>com.alibaba.nacos</groupId>            <artifactId>nacos-client</artifactId>            <version>1.0.0</version>        </dependency></dependencies>

Consumer配置如下:

 

# 配置埠server:  port: 8862dubbo:  # 配置服務資訊  application:    name: dubbo-consumer    # 禁用QOS同一臺機器可能會有埠衝突現象    qos-enable: false    qos-accept-foreign-ip: false  # 配置註冊中心  registry:    address: nacos://127.0.0.1:8848  # 設定超時時間  consumer:    timeout: 4000spring:  main:    # 解決Bean重複定義問題    allow-bean-definition-overriding: true

Provider配置如下:

 

# 配置埠server:  port: 8861dubbo:  # 配置服務資訊  application:    name: dubbo-provider    # 禁用QOS同一臺機器可能會有埠衝突現象    qos-enable: false    qos-accept-foreign-ip: false  # 配置註冊中心  registry:    address: nacos://127.0.0.1:8848  # 設定協議-協議由提供方指定消費方被動接受  protocol:    name: dubbo    port: 20880spring:  main:    # 解決Bean重複定義問題    allow-bean-definition-overriding: true

4 Base工程編寫

編寫DTO

 

/** * RPC介面DTO * 注意這裡要實現序列化介面 * @Author springRoot * @CreateTime 2019/11/6 23:04 */@Datapublic class ProviderTestDTO implements Serializable {    // ID    private int id;    // 名字    private String name;    // 序號    private Integer number;}

編寫Serivce

 

/** * RPC介面 * @Author springRoot * @CreateTime 2019/11/6 23:03 */public interface IProviderService {    List<ProviderTestDTO> queryList();}

編寫返回結果類

 

/** * 返回結果類 * 這裡採用構建者模式構建 * 優點:1.私有化構造器訪問範圍小 2.引數可靈活設定便於管理 * @Author springRoot * @CreateTime 2019/11/7 18:59 */@Getterpublic class ResultVO<T> implements Serializable {
    /**     * 返回碼     */    private int code;    /**     * 返回資訊     */    private String message;    /**     * 返回資料     */    private T data;
    /** 私有化構造器  **/    private ResultVO() {}    private ResultVO(ResultVO<T> resultVO) {        this.code = resultVO.code;        this.message = resultVO.message;        this.data = resultVO.data;    }
    /**     * Build     */    public static class Builder<T>{        private ResultVO<T> resultVO;        public Builder() {            resultVO = new ResultVO<>();        }        public Builder code(int code){            resultVO.code = code;            return this;        }        public Builder message(String message){            resultVO.message = message;            return this;        }        public Builder data(T data){            resultVO.data = data;            return this;        }        public ResultVO<T> build(){            return new ResultVO<>(resultVO);        }    }}

5 Provider工程編寫

在啟動類上面不要忘記加上@EnableDubbo註解

 

@EnableDubbo //開啟Dubbo的註解支援@SpringBootApplicationpublic class ProviderApplication {    public static void main(String[] args) {        SpringApplication.run(ProviderApplication.class, args);    }}

實現IProviderService介面,注意這裡的Serivce引用的是dubbo的包

 

/** * 生產者Dubbo介面實現 * @Author springRoot * @CreateTime 2019/11/6 23:01 */@Servicepublic class ProviderServiceImpl implements IProviderService {    @Override    public List<ProviderTestDTO> queryList() {        // 初始化資料        ProviderTestDTO testDTO1 = new ProviderTestDTO();        testDTO1.setId(1);        testDTO1.setName("學生");        testDTO1.setNumber(100);        ProviderTestDTO testDTO2 = new ProviderTestDTO();        testDTO2.setId(2);        testDTO2.setName("教師");        testDTO2.setNumber(101);        // 組裝資料        List<ProviderTestDTO> list = new ArrayList<>();        list.add(testDTO1);        list.add(testDTO2);        return list;    }}

6 Consumer工程編寫

和Provider工程的啟動類一樣,加上@EnableDubbo註解

 

@EnableDubbo //開啟dubbo的註解支援@SpringBootApplicationpublic class ConsumerApplication {    public static void main(String[] args) {        SpringApplication.run(ConsumerApplication.class, args);    }}

編寫測試介面

 

/** * 消費測試介面 * @Author springRoot * @CreateTime 2019/11/6 23:09 */@RestController@RequestMapping("/consumer")public class ConsumerController {    // Dubbo遠端呼叫註解    @Reference    private IProviderService providerService;    @RequestMapping(value = "/list",method = RequestMethod.GET)    public ResultVO getList(){        // 遠端呼叫        List<ProviderTestDTO> providerTestDTOList = providerService.queryList();        return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build();    }}

7 測試

啟動Provider工程和Consumer工程,這個時候Nacos會有對應的服務

使用Postman訪問Consumer測試介面

相關文章