Springboot+Dubbo+Nacos 注解方式實現(xiàn)微服務調(diào)用

一.項目結構

項目結構:
|-- spring-boot-dubbo-demo (父級工程)
    |-- spring-boot-dubbo-base (基礎工程)
    |-- spring-boot-dubbo-consumer (消費者)
    |-- spring-boot-dubbo-provider (生產(chǎn)者)

SpringBoot版本:2.2.0

Dubbo版本:2.7.0

Nacos版本:1.1.4

二.啟動Nacos注冊中心

Nacos官方文檔:nacos.io/zh-cn/docs/…

默認賬號密碼是nacos

image.png

<figcaption></figcaption>

image.png

<figcaption></figcaption>

三.搭建項目

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: 8862
dubbo:
  # 配置服務信息
  application:
    name: dubbo-consumer
    # 禁用QOS同一臺機器可能會有端口沖突現(xiàn)象
    qos-enable: false
    qos-accept-foreign-ip: false
  # 配置注冊中心
  registry:
    address: nacos://127.0.0.1:8848
  # 設置超時時間
  consumer:
    timeout: 4000
spring:
  main:
    # 解決Bean重復定義問題
    allow-bean-definition-overriding: true

Provider配置如下:

# 配置端口
server:
  port: 8861
dubbo:
  # 配置服務信息
  application:
    name: dubbo-provider
    # 禁用QOS同一臺機器可能會有端口沖突現(xiàn)象
    qos-enable: false
    qos-accept-foreign-ip: false
  # 配置注冊中心
  registry:
    address: nacos://127.0.0.1:8848
  # 設置協(xié)議-協(xié)議由提供方指定消費方被動接受
  protocol:
    name: dubbo
    port: 20880
spring:
  main:
    # 解決Bean重復定義問題
    allow-bean-definition-overriding: true

四.Base工程編寫

編寫DTO

/**
 * RPC接口DTO
 * 注意這里要實現(xiàn)序列化接口
 * @Author Sans
 * @CreateTime 2019/11/6 23:04
 */
@Data
public class ProviderTestDTO implements Serializable {
    // ID
    private int id;
    // 名字
    private String name;
    // 序號
    private Integer number;
}

編寫Serivce

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

編寫返回結果類

/**
 * 返回結果類
 * 這里采用構建者模式構建
 * 優(yōu)點:1.私有化構造器訪問范圍小 2.參數(shù)可靈活設置便于管理
 * @Author Sans
 * @CreateTime 2019/11/7 18:59
 */
@Getter
public class ResultVO<T> implements Serializable {

    /**
     * 返回碼
     */
    private int code;
    /**
     * 返回信息
     */
    private String message;
    /**
     * 返回數(shù)據(jù)
     */
    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);
        }
    }
}

五.Provider工程編寫

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

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

實現(xiàn)IProviderService接口,注意這里的Serivce引用的是dubbo的包

/**
 * 生產(chǎn)者Dubbo接口實現(xiàn)
 * @Author Sans
 * @CreateTime 2019/11/6 23:01
 */
@Service
public class ProviderServiceImpl implements IProviderService {
    @Override
    public List<ProviderTestDTO> queryList() {
        // 初始化數(shù)據(jù)
        ProviderTestDTO testDTO1 = new ProviderTestDTO();
        testDTO1.setId(1);
        testDTO1.setName("學生");
        testDTO1.setNumber(100);
        ProviderTestDTO testDTO2 = new ProviderTestDTO();
        testDTO2.setId(2);
        testDTO2.setName("教師");
        testDTO2.setNumber(101);
        // 組裝數(shù)據(jù)
        List<ProviderTestDTO> list = new ArrayList<>();
        list.add(testDTO1);
        list.add(testDTO2);
        return list;
    }
}

六.Consumer工程編寫

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

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

編寫測試接口

/**
 * 消費測試接口
 * @Author Sans
 * @CreateTime 2019/11/6 23:09
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    // Dubbo遠程調(diào)用注解
    @Reference
    private IProviderService providerService;
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public ResultVO getList(){
        // 遠程調(diào)用
        List<ProviderTestDTO> providerTestDTOList = providerService.queryList();
        return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build();
    }
}

七.測試

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

image.png

<figcaption></figcaption>

使用Postman訪問Consumer測試接口


image.png

<figcaption></figcaption>

八.項目源碼

碼云:gitee.com/liselotte/s…

GitHub:github.com/xuyulong201…

謝謝大家閱讀,如果喜歡,請收藏點贊,多給些star,文章不足之處,也請給出寶貴意見.

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帮非,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讹蘑,更是在濱河造成了極大的恐慌末盔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座慰,死亡現(xiàn)場離奇詭異陨舱,居然都是意外死亡游盲,警方通過查閱死者的電腦和手機益缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門熙卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颓鲜,“玉大人衣摩,你說我怎么就攤上這事泡嘴■眨” “怎么了广凸?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵蝌诡,是天一觀的道長。 經(jīng)常有香客問我,道長鹿响,這世上最難降的妖魔是什么毅哗? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮翅睛,結果婚禮上捕发,老公的妹妹穿的比我還像新娘。我一直安慰自己陵叽,他們只是感情好巩掺,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豫缨,像睡著了一般独令。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上好芭,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天燃箭,我揣著相機與錄音,去河邊找鬼舍败。 笑死招狸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的邻薯。 我是一名探鬼主播裙戏,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厕诡!你這毒婦竟也來了累榜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤木人,失蹤者是張志新(化名)和其女友劉穎信柿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醒第,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡渔嚷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稠曼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片形病。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漠吻,到底是詐尸還是另有隱情量瓜,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布途乃,位于F島的核電站绍傲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耍共。R本人自食惡果不足惜烫饼,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望试读。 院中可真熱鬧杠纵,春花似錦、人聲如沸钩骇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倘屹。三九已至银亲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纽匙,已是汗流浹背群凶。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哄辣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓赠尾,卻偏偏與公主長得像力穗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子气嫁,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容