微服務(wù)架構(gòu) | 12.1 使用 Apache Dubbo 實(shí)現(xiàn)遠(yuǎn)程通信

前言

參考資料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務(wù)原理與實(shí)戰(zhàn)》
《B站 尚硅谷 SpringCloud 框架開發(fā)教程 周陽》

Apache Dubbo 是一個(gè)分布式服務(wù)框架址否,主要實(shí)現(xiàn)多個(gè)系統(tǒng)之間的高性能餐蔬、透明化調(diào)用;
Dubbo 相關(guān)內(nèi)容筆者之前寫過一篇入門筆記:Dubbo快速上手筆記 - 環(huán)境與配置佑附。入門筆記強(qiáng)調(diào)的是 Dubbo 的一些基本特性樊诺,以與 Zookeeper 的整合。因此這里將重點(diǎn)放在 Dubbo 與 Spring Cloud 的聯(lián)系音同、區(qū)別以及整合词爬;


1. Dubbo 基礎(chǔ)知識(shí)

1.1 Dubbo 是什么

  • Apache Dubbo 是一個(gè)分布式服務(wù)框架,主要實(shí)現(xiàn)多個(gè)系統(tǒng)之間的高性能瘟斜、透明化調(diào)用缸夹;
  • 簡(jiǎn)單來說它就是一個(gè) RPC 框架,但是和普通的 RPC 框架不同的是螺句,它提供了服務(wù)治理功能虽惭,比如服務(wù)注冊(cè)、監(jiān)控蛇尚、路由芽唇、容錯(cuò)等;

1.2 Dubbo 的架構(gòu)圖

Dubbo 基于消費(fèi)端的自動(dòng)服務(wù)發(fā)現(xiàn)能力

1.3 Spring Cloud 與 Dubbo 的區(qū)別

比較項(xiàng) Dubbo Spring Cloud
通信協(xié)議 基于 TCP 協(xié)議傳輸,使用 Netty 配合以Hession序列化完成RPC通信 基于 HTTP 協(xié)議 + REST 接口調(diào)用遠(yuǎn)程過程的通信
服務(wù)調(diào)用方式 RPC REST API
定位 SOA 時(shí)代的產(chǎn)物 微服務(wù)架構(gòu)時(shí)代
關(guān)注點(diǎn) 服務(wù)的重用性及解決信息孤島問題匆笤;服務(wù)治理 解耦研侣,降低業(yè)務(wù)之間的耦合度;微服務(wù)治理整套方案
模塊 服務(wù)注冊(cè)中心炮捧、服務(wù)提供者庶诡、服務(wù)消費(fèi)者、管控中心 分布式一站式框架
  • HTTP 請(qǐng)求會(huì)有更大的報(bào)文咆课,占的帶寬也會(huì)更多末誓。但是 REST 相比 RPC 更為靈活,服務(wù)提供方和調(diào)用方的依賴只依靠一紙契約书蚪,不存在代碼級(jí)別的強(qiáng)依賴喇澡,這在強(qiáng)調(diào)快速演化的微服務(wù)環(huán)境下,顯得更為合適殊校;
  • 模塊組件的具體比較如下:
組件 Dubbo Spring Cloud (Netflix)
注冊(cè)中心 以前是 Zookeeper晴玖,現(xiàn)在推廣 Nacos Spring Cloud Eureka
服務(wù)監(jiān)控 Dubbo-monitor Spring Boot Admin
熔斷器 6種容錯(cuò)模式 Spring Cloud Hystrix
負(fù)載均衡 4 種負(fù)載均衡策略 Spring Cloud Ribbon
服務(wù)降級(jí) Mock 機(jī)制 Hystrix 的 @HystrixCommand 注解
網(wǎng)關(guān) Spring Cloud Zuul
配置 Spring Cloud Config
服務(wù)跟蹤 Spring Cloud Sleuth
數(shù)據(jù)流 Spring Cloud Stream
批量任務(wù) Spring Cloud Task
消息總線 Spring Cloud Bus

1.4 Dubbo 的特點(diǎn)

  • 支持多種協(xié)議的服務(wù)發(fā)布,默認(rèn)是 dubbo://为流,還可以支持 rest://呕屎、webservice://、thrift:// 等艺谆;
  • 支持多種不同的注冊(cè)中心榨惰,如:Nacos、ZooKeeper静汤、Redis,未來還將會(huì)支持 Consul居凶、Eureka虫给、Etcd 等;
  • 支持多種序列化技術(shù)侠碧,如:avro抹估、fst、fastjson弄兜、hessian2药蜻、kryo 等;
  • 在服務(wù)治理方面的功能非常完善替饿,如:集群容錯(cuò)语泽、服務(wù)路由、負(fù)載均衡视卢、服務(wù)降級(jí)踱卵、服務(wù)限流、服務(wù)監(jiān)控据过、安全驗(yàn)證等惋砂;
  • 中文文檔妒挎;

1.5 Dubbo 的 6 種容錯(cuò)模式

容錯(cuò)模式 模式名稱 說明 適用場(chǎng)景
Failover Cluster 【默認(rèn)】失敗自動(dòng)切換 當(dāng)服務(wù)調(diào)用失敗后喧伞,會(huì)切換到集群中的其他機(jī)器進(jìn)行重試汉嗽,默認(rèn)重試次數(shù)為2,通過屬性 retries=2 可以修改次數(shù) 通常用于讀操作(查)丧叽,因?yàn)槭聞?wù)型操作會(huì)帶來數(shù)據(jù)重復(fù)問題
Failfast Cluster 快速失敗 當(dāng)服務(wù)調(diào)用失敗后眷柔,立即報(bào)錯(cuò)庸队,也就是只發(fā)起一次調(diào)用 通常用于一些冪等的寫操作(增刪改),比如新增數(shù)據(jù)闯割;以避免在結(jié)果不確定的情況下導(dǎo)致數(shù)據(jù)重復(fù)插入的問題
Failsafe Cluster 失敗安全 出現(xiàn)異常時(shí)彻消,直接忽略異常 使用 Failover Cluster(retries="0"),應(yīng)對(duì)(增刪改)操作
Failback Cluster 失敗后自動(dòng)回復(fù) 服務(wù)調(diào)用出現(xiàn)異常時(shí)宙拉,在后臺(tái)記錄這條失敗的請(qǐng)求定時(shí)重發(fā) 適合用于消息通知操作宾尚,保證這個(gè)請(qǐng)求一定發(fā)送成功
Forking Cluster 并行提交 并行調(diào)用集群中的多個(gè)服務(wù),只要其中一個(gè)成功就返回谢澈』吞可以通過forks=2來設(shè)置最大并行數(shù)
Broadcast Cluster 廣播通知 廣播調(diào)用所有的服務(wù)提供者,任意一個(gè)服務(wù)報(bào)錯(cuò)則表示服務(wù)調(diào)用失敗 通常用于通知所有的服務(wù)提供者更新緩存或者本地資源信息
  • 可以自行擴(kuò)展容錯(cuò)模式锥忿;

  • 配置也很簡(jiǎn)單牛郑,在 @Service 接口里添加一個(gè) cluster 參數(shù)即可;

    @Service(cluster = "failfast") //更改容錯(cuò)方式為快速失敗
    public class TestServiceImpl implements TestService {
      @Override
      public String test() {
          ...
      }
    }
    

1.6 Dubbo 的 4 種負(fù)載均衡策略

負(fù)載均衡策略 策略名稱 說明
Random LoadBalance 隨機(jī)算法 可以針對(duì)性能較好的服務(wù)器設(shè)置較大的權(quán)重值敬鬓,權(quán)重值越大淹朋,隨機(jī)的概率也會(huì)越大
RoundRobin LoadBalance 輪詢 按照公約后的權(quán)重設(shè)置輪詢比例
LeastActive LoadBalance 最少活躍調(diào)用 處理較慢的節(jié)點(diǎn)將會(huì)收到更少的請(qǐng)求
ConsistentHash LoadBalance 一致性Hash 相同參數(shù)的請(qǐng)求總是發(fā)送到同一個(gè)服務(wù)提供者
  • 可以基于 Dubbo 中的 SPI 機(jī)制來擴(kuò)展負(fù)載均衡策略;

  • 配置也很簡(jiǎn)單钉答,在 @Service 接口里添加一個(gè) loadbalance 參數(shù)即可础芍;

    @Service(loadbalance = "roundrobin") //更改負(fù)載均衡策略為輪詢
    public class TestServiceImpl implements TestService {
      @Override
      public String test() {
          ...
      }
    }
    

1.7 主機(jī)綁定規(guī)則

  • 主機(jī)綁定表示的是 Dubbo 服務(wù)對(duì)外發(fā)布的 IP 地址,默認(rèn)情況下 Dubbo 會(huì)按照以下順序來查找并綁定主機(jī) IP 地址:
    • 查找環(huán)境變量中 DUBBO_IP_TO_BIND 屬性配置的 IP 地址数尿;
    • 查找 dubbo.protocol.host 屬性配置的 IP 地址仑性,默認(rèn)是空,如果沒有配置或者IP地址不合法右蹦,則繼續(xù)往下查找诊杆;
    • 通過 LocalHost.getHostAddress 獲取本機(jī) IP 地址,如果獲取失敗何陆,則繼續(xù)往下查找晨汹;
    • 如果配置了注冊(cè)中心的地址,則使用 Socket 通信連接到注冊(cè)中心的地址后甲献,使用 for 循環(huán)通過 socket.getLocalAddress().getHostAddress() 掃描各個(gè)網(wǎng)卡獲取網(wǎng)卡 IP 地址宰缤;
  • 獲取的 IP 地址并不是寫入注冊(cè)中心的地址。默認(rèn)情況下,寫入注冊(cè)中心的 IP 地址優(yōu)先選擇環(huán)境變量中 DUBBO_IP_TO_REGISTRY 屬性配置的 IP 地址慨灭。在這個(gè)屬性沒有配置的情況下朦乏,才會(huì)選取前面獲得的 IP 地址并寫入注冊(cè)中心;
  • 問題:使用默認(rèn)的主機(jī)綁定規(guī)則氧骤,可能會(huì)存在獲取的 P 地址不正確的情況呻疹;
    • 原因:Dubbo 檢測(cè)本地 IP 地址的策略是先調(diào)用 LocalHost.getHostAddress,這個(gè)方法的原理是通過獲取本機(jī)的 hostname 映射 IP 地址筹陵,如果它指向的是一個(gè)錯(cuò)誤的 IP 地址刽锤,那么這個(gè)錯(cuò)誤的地址將會(huì)作為服務(wù)發(fā)布的地址注冊(cè)到 ZooKeeper 節(jié)點(diǎn)上;
    • 解決方案
      • /etc/hosts 中配置機(jī)器名對(duì)應(yīng)正確的 IP 地址映射朦佩;
      • 在環(huán)境變量中添加 DUBBO_IP_TO_BIND 或者 DUBBO_IP_TO_REGISTRY 屬性并思,Value 值為綁定的主機(jī)地址;
      • 通過 dubbo.protocolhost 設(shè)置主機(jī)地址语稠;

2. 構(gòu)建 Dubbo 服務(wù)提供方

2.1 構(gòu)建服務(wù)接口模塊

  • Dubbo 官方推薦把服務(wù)接口打成 Jar 包發(fā)布到倉(cāng)庫(kù)上输涕;

  • 這樣服務(wù)消費(fèi)者可以依賴該 Jar 包,通過接口調(diào)用方式完成遠(yuǎn)程通信慨畸。對(duì)于服務(wù)提供者來說莱坎,也需要依賴該 Jar 包完成接口的實(shí)現(xiàn);

  • 做法如下:

  • 新建 spring-cloud-dubbo-sample-api 模塊寸士,添加 pom.xml 依賴文件檐什;

    <!-- Dubbo -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    
  • 在 service 包下新建接口:

    public interface TestService {
      String test(String message);
    }
    
  • 執(zhí)行 mvn install 命令將接口 jar 包安裝到本地倉(cāng)庫(kù);

2.2 添加 pom.xml 依賴文件

<!-- Spring Cloud 核心包-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
</dependency>

<!-- Dubbo Spring Cloud Starter -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<!-- Sample API 接口聲明-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-dubbo-sample-api</artifactId>
</dependency>

<!-- Spring Cloud Nacos Service Discovery -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>

2.3 修改 application.yml 配置文件

spring:
  application:
    name: spring-cloud-dubbo-provider
  cloud:
    zookeeper:
      discovery:
        register: true  #表示該服務(wù)要注冊(cè)進(jìn)注冊(cè)中心
      connect-string: localhost:2181  #zookeeper 服務(wù)器位置
dubbo:     
  protocol:
    name: dubbo
    port: 20880

2.4 在主程序類上添加注解

  • @DubboComponentScan:掃描主程序類所在包及其子包下的所有注解碉京,將 @Servicr 注解下類注冊(cè)進(jìn)容器里厢汹;

2.5 實(shí)現(xiàn) 2.1 定義的接口

@Service
public class TestServiceImpl implements TestService {
    @Value("${dubbo.application.name}")
    private String serviceName;
    
    @Override
    public String test(String message) {
        return serviceName;
    }
}
  • 可以在 @Service 注解里添加兩個(gè)屬性配置 clusterloadbalance,分別用來配置容錯(cuò)模式負(fù)載均衡策略谐宙;
  • 詳情請(qǐng)見本篇《1.5 Dubbo 的 6 種容錯(cuò)模式》和《1.6 Dubbo 的 4 種負(fù)載均衡策略》

3. 構(gòu)建 Dubbo 服務(wù)消費(fèi)方

3.1 添加 pom.xml 依賴文件

  • 同服務(wù)提供方;
<!-- Spring Cloud 核心包-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
</dependency>

<!-- Dubbo Spring Cloud Starter -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<!-- Sample API 接口聲明-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-dubbo-sample-api</artifactId>
</dependency>

<!-- Spring Cloud Nacos Service Discovery -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>

3.2 修改 application.yml 配置文件

spring:
  application:
    name: spring-cloud-dubbo-consumer
  cloud:
    zookeeper:
      discovery:
        register: false #表示該服務(wù)不要注冊(cè)進(jìn)注冊(cè)中心
      connect-string: localhost:2181  
dubbo:     
  cloud:
    subscribed-services: spring-cloud-dubbo-provider  #表示服務(wù)調(diào)用者訂閱的服務(wù)提供方的應(yīng)用名稱列表界弧。默認(rèn)值為“*”凡蜻,不推薦使用默認(rèn)值

3.3 修改業(yè)務(wù)類

  • 在服務(wù)類中使用 @Reference 注解注入 TestService 即可;
@RestController
public class TestController{
    @Reference 
    private TestService testService;
    
    @GetMapping("/message")
    public String testController(){
        return testService.test("message");
}

4. 在消費(fèi)者端使用 Mock 配置實(shí)現(xiàn)服務(wù)降級(jí)

  • 在本示例中將對(duì) 2.1 中定義的 TestService 接口配置服務(wù)降級(jí)策略垢箕;
  • 降級(jí)策略的配置都是在基于服務(wù)消費(fèi)者之上的划栓;

4.1 為接口實(shí)現(xiàn)一種服務(wù)降級(jí)方法

public class MockTestService implements TestService {
    @Override
    public String test(String message) {
        return "當(dāng)前無法訪問";
    }
}

4.2 給 @Reference 注解增加 mock 參數(shù)

@RestController
public class TestController{
    @Reference(mock = "com.dlhjw.springcloud.mock.MockTestService", cluster="failfast")
    private TestService testService;
    
    @GetMapping("/message")
    public String testController(){
        return testService.test("message");
}
  • 在 TestController 類中修改 @Reference 注解增加 mock 參數(shù);
  • 其中設(shè)置了屬性 cluster="failfast"条获,因?yàn)槟J(rèn)的容錯(cuò)策略會(huì)發(fā)起兩次重試忠荞,等待的時(shí)間較長(zhǎng);

5. Dubbo 使用 Zookeeper 作為注冊(cè)中心(Spring Boot)

5.1 下載 Zookeeper 服務(wù)器

5.2 引入 pom.xml 依賴文件

  • 服務(wù)提供者與服務(wù)消費(fèi)者需要引入的依賴相同;
<!-- Zookeeper 相關(guān)依賴 -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.3-beta</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.0.1</version>
</dependency>

<!-- Dubbo 相關(guān)依賴 -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.5</version>
</dependency>

<!-- Spring Boot 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

5.3 服務(wù)提供者

5.3.1 修改 application.yml 配置文件

spring:
  application:
    name: springboot-dubbo-demo 
dubbo:
  #服務(wù)提供方的信息
  application:
    name: springboot-provider      
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://localhost:2181  #zookeeper地址
  #scan:
    #base-packages: com.dlhjw.dubbo.service.impl  #指定 Dubbo 服務(wù)實(shí)現(xiàn)類的掃描基準(zhǔn)包讥邻,作用等同于 主程序類上的 @DubboComponentScan

5.3.2 在主程序類上添加注解

  • @DubboComponentScan:作用同 Spring Boot 的 @ComponentScan迫靖,不過這里要掃描 Dubbo 提供的 @Service 注解;
  • @DubboComponentScan(basePackages = "com.dlhjw.dubbo.service.impl")
  • 如果上面 application 中已經(jīng)做了配置兴使,這里可以不用添加系宜;

5.3.3 編寫業(yè)務(wù)類

  • 創(chuàng)建接口及其實(shí)現(xiàn)類:
public interface TestService {
    void testDubbo();
}
@Service(version = "1.0.0",timeout = 3000)
public class TestServiceImpl implements TestService{
    @Override
    public void testDubbo() {
    }
}
  • 注意:@Service 注解是 com.alibaba.dubbo.config.annotation.Service 包下的;

5.4 服務(wù)消費(fèi)者

5.4.1 修改 application.yml 配置文件

dubbo:
  #服務(wù)消費(fèi)方的信息
  application:
    name: springboot-consumer 
  registry:
    #zookeeper地址
    address: zookeeper://localhost:2181

5.4.2 在主程序類上添加注解

5.4.3 編寫業(yè)務(wù)類

  • 這里直接在 controller 接口里直接調(diào)用服務(wù)提供者提供的 TestService 即可发魄;
@Reference(version = "1.0.0",timeout = 300)
private TestService testService;
  • @Reference 注解可以獲得一個(gè)遠(yuǎn)程代理對(duì)象盹牧;

6. Dubbo 使用 Nacos 作為注冊(cè)中心(Spring Boot)

  • 這里僅使用到了 Spring Boot 的自動(dòng)配置;
  • 這里僅提供服務(wù)提供者的示例欠母,服務(wù)消費(fèi)者類似欢策;

6.1 下載 Nacos 服務(wù)器

6.2 工程結(jié)構(gòu)

  • 新建一個(gè)父工程 spring-cloud-nacos-sample赏淌,包含兩個(gè)模塊:nacos-sample-api 和 nacos-sample-provider踩寇;
  • 在 nacos-sample-api 中聲明接口;
public interface IHelloService{
    String sayHello(String name);
}

6.3 引入 pom.xml 依賴文件

  • 在 nacos-sample-provider 中添加依賴文件:
<!-- 接口定義類 -->
<dependency>
  <groupId>com.gupaoedu.book.nacos</groupId>
  <version>1.0-SNAPSHOT</version>
  <artifactId>nacos-sample-api</artifactId>
</dependency>
<!-- Nacos 的 starter 組件 -->
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>nacos-discovery-spring-boot-starter</artifactId>
  <version>0.2.4</version>
  <exclusions>
    <exclusion>
      <groupId>com.alibaba.spring</groupId>
      <artifactId>spring-context-support</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<!-- Dubbo 的 starter 組件 -->
<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>2.7.5</version>
</dependency>

6.4 修改 application.yml 配置文件

dubbo:
  application:
    name: spring-boot-dubbo-nacos-sample 
  registry:
    address: nacos://127.0.0.1:8848  #基于 Nacos 協(xié)議
  protocol: 
    name: dubbo
    port: 20880

6.5 在主程序類上添加注解

  • @DubboComponentScan:dubbo 的包掃描注解六水;

6.6 編寫業(yè)務(wù)類

  • 實(shí)現(xiàn) 6.2 中定義的接口俺孙;
@Service 
public class HelloServiceImpl implements IHelloService{
    @Override 
    public String sayHello(String name){
        return "He1lo World:"+name;
    }
}        

6.7 啟動(dòng)測(cè)試

  • 啟動(dòng)服務(wù),訪問 Nacos 控制臺(tái)掷贾,進(jìn)入“服務(wù)管理” -> “服務(wù)列表”睛榄,可以看到所有注冊(cè)在 Nacos 上的服務(wù);

7. Dubbo 使用 Nacos 作為注冊(cè)中心(Spring Cloud)

  • 這里僅提供服務(wù)提供者的示例想帅,服務(wù)消費(fèi)者類似场靴;

7.1 下載 Nacos 服務(wù)器

7.2 工程結(jié)構(gòu)

  • 新建一個(gè)父工程 spring-cloud-nacos-sample港准,包含兩個(gè)模塊:spring-cloud-nacos-sample-api 和 spring-cloud-nacos-sample-provider旨剥;
  • 在 nacos-sample-api 中聲明接口;
public interface IHelloService{
    String sayHello(String name);
}

7.3 添加 pom.xml 依賴

  • 在父工程中顯示聲明依賴的指定版本浅缸;
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dependencies</artifactId>
  <version>Greenwich.SR2</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.1.11.RELEASE</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  <version>2.1.1.RELEASE</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
  • 在 spring-cloud-nacos-sample-provider 中添加依賴文件:
<!-- Spring Cloud 核心包 -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-context</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- Spring Cloud 的 Dubbo 依賴 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<!-- api 模塊 -->
<dependency>
  <groupId>com.gupaoedu.book.springcloud</groupId>
  <artifactId>spring-cloud-dubbo-sample-api</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

<!-- 基于 Nacos 的服務(wù)注冊(cè)與發(fā)現(xiàn) -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-context</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-context</artifactId>
  <version>2.1.1.RELEASE</version>
</dependency>

7.4 添加 application.yml 依賴文件

  • 與 Spring Boot 這整合方式的主要區(qū)別就在 pom.xml 配置文件和 application.yml 依賴文件轨帜;
spring: 
  application: 
    name: spring-cloud-nacos-sample 
  cloud: 
    nacos: 
      discovery:
        server-addr: 127.0.0.1:8848  #Nacos 服務(wù)注冊(cè)中心地址

dubbo: 
  scan: 
    base-packages: com.gupaoedu.book.nacos.bootstrap  #功能等同于 @DubboComponentScan   
  protocol: 
    name: dubbo
    port: 20880
  registry:
    address: spring-cloud://localhost  #將服務(wù)掛載到 Spring Cloud 注冊(cè)中心

7.5 主程序類上無需額外注解

7.6 編寫業(yè)務(wù)類

  • 實(shí)現(xiàn) 7.2 中定義的接口即可;
@Service 
public class HelloServiceImpl implements IHelloService{
    @Override 
    public String sayHello(String name){
        return "He1lo World:"+name;
    }
}        

最后

\color{blue}{\rm\small{新人制作衩椒,如有錯(cuò)誤蚌父,歡迎指出哮兰,感激不盡!}}

\color{blue}{\rm\small{歡迎關(guān)注我苟弛,并與我交流喝滞!}}

\color{blue}{\rm\small{如需轉(zhuǎn)載,請(qǐng)標(biāo)注出處嗡午!}}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囤躁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荔睹,更是在濱河造成了極大的恐慌狸演,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻他,死亡現(xiàn)場(chǎng)離奇詭異宵距,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吨拗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門满哪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劝篷,你說我怎么就攤上這事哨鸭。” “怎么了娇妓?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵像鸡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我哈恰,道長(zhǎng)只估,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任着绷,我火速辦了婚禮蛔钙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荠医。我一直安慰自己吁脱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布彬向。 她就那樣靜靜地躺著豫喧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幢泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天讲衫,我揣著相機(jī)與錄音缕棵,去河邊找鬼孵班。 笑死,一個(gè)胖子當(dāng)著我的面吹牛招驴,可吹牛的內(nèi)容都是我干的篙程。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼别厘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虱饿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起触趴,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤氮发,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后冗懦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽冕,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年披蕉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颈畸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡没讲,死狀恐怖眯娱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爬凑,我是刑警寧澤徙缴,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站贰谣,受9級(jí)特大地震影響娜搂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吱抚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一百宇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秘豹,春花似錦携御、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凄贩,卻和暖如春誓军,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疲扎。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工昵时, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捷雕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓壹甥,卻偏偏與公主長(zhǎng)得像救巷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子句柠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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