SpringCloud整合Nacos服務(wù)注冊與發(fā)現(xiàn)

?? 《SpringCloud入門實(shí)戰(zhàn)系列》解鎖SpringCloud主流組件入門應(yīng)用及關(guān)鍵特性。帶你了解SpringCloud主流組件,是如何一戰(zhàn)解決微服務(wù)諸多難題的。項(xiàng)目demo:源碼地址
?? 作者:一只IT攻城獅玉凯。關(guān)注我卿捎,不迷路杭措。
?? 再小的收獲x365天都會成就不一樣的自己垂蜗,一起學(xué)習(xí)喘先,一起進(jìn)步钳吟。
??Nacos簡介、安裝窘拯、運(yùn)行參看上一節(jié): SpringCloud入門實(shí)戰(zhàn)-Nacos簡介红且、安裝坝茎、運(yùn)行詳解

一、項(xiàng)目準(zhǔn)備(Nacos+SpringBoot+OpenFeign)

SpringCloud是分布式微服務(wù)架構(gòu)的一站式解決方案直焙,是多種微服務(wù)架構(gòu)落地技術(shù)的集合體景东。而SpringCloud Alibaba是SpringCloud中一個重要項(xiàng)目,Nacos作為SpringCloud Alibaba項(xiàng)目中的一項(xiàng)重要組件奔誓,我們需要重點(diǎn)去了解和學(xué)習(xí)。

我們知道使用 Nacos 是簡化服務(wù)發(fā)現(xiàn)搔涝、配置管理厨喂、服務(wù)治理及管理的解決方案,讓微服務(wù)的發(fā)現(xiàn)庄呈、管理蜕煌、共享、組合更加容易诬留。Nacos = Eureka + Config + bus可以替代Eureka做服務(wù)注冊中心斜纪,可以替代Config做服務(wù)配置中心。

那我們結(jié)合項(xiàng)目具體來學(xué)習(xí)一下優(yōu)秀的Nacos作為注冊中心是如何使用的文兑。

二盒刚、構(gòu)建Nacos之服務(wù)提供者

可以先準(zhǔn)備好nacos環(huán)境:進(jìn)入的nacos的bin目錄,啟動服務(wù)器 : sh startup.sh -m standalone
訪問http://localhost:8848/nacos看到界面即成功啟動绿贞。接下來搭建項(xiàng)目因块。

1、pom中引入依賴

新建父工程cloud-nacos籍铁。

1)父pom中引入spring-cloud-alibaba-dependencies依賴涡上,注意SpringBoot、SpringCloud拒名、Spring Cloud Alibaba及組件間版本問題吩愧。可參看SpringBoot增显、SpringCloud雁佳、Spring Cloud Alibaba版本對照表(詳細(xì)準(zhǔn)確)。我的版本如下:

 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2021.0.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2021.0.4.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.7.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

提示:搭建好項(xiàng)目甸怕,如果后續(xù)啟動測試時(shí)也會報(bào)錯:
Could not initialize class com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient
那也是因?yàn)橐玫膕pring cloud 版本甘穿,alibaba cloud版本,nacos的版本不一致導(dǎo)致的梢杭。

2)新建子module温兼,cloud-payment工程作為服務(wù)提供者,pom引入spring-cloud-starter-alibaba-nacos-discovery依賴:

    <dependency>
    <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

提示:由于Netflix Ribbon 進(jìn)入停更維護(hù)階段武契,因此SpringCloud 2020.0.1 版本之后募判,刪除了eureka中的ribbon, 替代ribbon的是spring cloud自帶的LoadBalancer荡含,默認(rèn)使用的是輪詢的方式,新版本的 Nacos discovery 都已經(jīng)移除了 Ribbon ,因此我們使用Nacos時(shí)也需要引入loadbalancer 才能調(diào)起服務(wù)届垫。

2释液、yml文件增加配置

cloud:
  nacos:
    discovery:
      # 配置 nacos 的服務(wù)地址
      server-addr: localhost:8848
management:
endpoints:
  web:
    exposure:
      include: '*'

3、啟動類

啟動類增加注解:@EnableDiscoveryClient

4装处、測試

編寫簡單的查詢業(yè)務(wù)類误债,并啟動服務(wù),可以看到nacos上實(shí)例數(shù)變成2


三妄迁、構(gòu)建Nacos之服務(wù)消費(fèi)者

1寝蹈、pom中引入依賴

新建module:cloud-order。這里我引入了spring-cloud-starter-openfeign通過openfeign代替Ribbon+RestTemplate方式調(diào)用服務(wù)提供者登淘。

提示:openfeign知識傳送門:SpringCloud入門實(shí)戰(zhàn)-OpenFeign服務(wù)調(diào)用

附上完整pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-nacos</artifactId>
        <groupId>org.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-order</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.test</groupId>
            <artifactId>cloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
        </dependency>
        <!--使用Spring Cloud LoadBalancer 進(jìn)行客戶端負(fù)載均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <!-- devtools熱部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

2箫老、yml文件配置

server:
  port: 80

spring:
    application:
      name: cloud-order #微服務(wù)應(yīng)用的名字
    cloud:
      nacos:
        discovery:
          server-addr: localhost:8848
## 消費(fèi)者將要去訪問的微服務(wù)名稱( 注冊成功進(jìn) nacos 的微服務(wù)提供者)
service-url:
  nacos-user-service: http://cloud-payment

3、啟動類

啟動類增加注解:@EnableDiscoveryClient 以及開啟feign的調(diào)用@EnableFeignClients

/**
 * @author qy
 * @date 2022年07月13日 16:46
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class CloudOrder {
    public static void main(String[] args) {
        SpringApplication.run(CloudOrder.class, args);
    }
}

4黔州、測試

編寫簡單的查詢業(yè)務(wù)類耍鬓,并啟動服務(wù),可以看到nacos上實(shí)例數(shù)變成3

重點(diǎn)代碼:

/**
 * 
 * OrderController.java
 */
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
    @Resource
    private PaymentService paymentService;

    @GetMapping(value = "/ok/{id}")
    public String paymentInfoOk(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfoOk(id);
        log.info("========result:{}========", result);
        return result;
    }


    @GetMapping(value = "/timeout/{id}")
    public String paymentInfoTimeOut(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfoTimeOut(id);
        log.info("========result:{}========", result);
        return result;
    }
}


/**
 * 
 * Feign接口類 PaymentService.java
 */
@Component
@FeignClient(value = "cloud-payment",fallback = PaymentFallbackService.class)
public interface PaymentService {

    @GetMapping(value = "/payment/ok/{id}")
    String paymentInfoOk(@PathVariable("id") Integer id);

    @GetMapping(value = "/payment/timeout/{id}")
    String paymentInfoTimeOut(@PathVariable("id") Integer id);
}



@Component
public class PaymentFallbackService implements PaymentService {
    @Override
    public String paymentInfoOk(Integer id) {
        return "全局解耦降級處理PaymentFallback->paymentInfoOk流妻!";
    }

    @Override
    public String paymentInfoTimeOut(Integer id) {
        return "全局解耦降級處理PaymentFallback->paymentInfoTimeOut牲蜀!";
    }
}


訪問http://localhost/order/ok/1測試,多次調(diào)用合冀,輪詢訪問各薇。

如果你的應(yīng)用測試報(bào)錯:Load balancer does not contain an instance for the service ..參看:解決辦法

Nacos作為服務(wù)注冊與發(fā)現(xiàn)的項(xiàng)目實(shí)戰(zhàn)就到這里了君躺。下一節(jié)峭判,我們再詳細(xì)介紹Nacos服務(wù)配置中心、Nacos集群和持久化配置棕叫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末林螃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俺泣,更是在濱河造成了極大的恐慌疗认,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伏钠,死亡現(xiàn)場離奇詭異横漏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熟掂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缎浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赴肚,你說我怎么就攤上這事素跺《叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵指厌,是天一觀的道長刊愚。 經(jīng)常有香客問我,道長踩验,這世上最難降的妖魔是什么鸥诽? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮箕憾,結(jié)果婚禮上衙传,老公的妹妹穿的比我還像新娘。我一直安慰自己厕九,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布地回。 她就那樣靜靜地躺著扁远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刻像。 梳的紋絲不亂的頭發(fā)上畅买,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音细睡,去河邊找鬼谷羞。 笑死,一個胖子當(dāng)著我的面吹牛溜徙,可吹牛的內(nèi)容都是我干的湃缎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蠢壹,長吁一口氣:“原來是場噩夢啊……” “哼嗓违!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起图贸,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹂季,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疏日,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偿洁,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年沟优,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涕滋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡净神,死狀恐怖何吝,靈堂內(nèi)的尸體忽然破棺而出溉委,到底是詐尸還是另有隱情,我是刑警寧澤爱榕,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布瓣喊,位于F島的核電站,受9級特大地震影響黔酥,放射性物質(zhì)發(fā)生泄漏藻三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一跪者、第九天 我趴在偏房一處隱蔽的房頂上張望棵帽。 院中可真熱鬧,春花似錦渣玲、人聲如沸逗概。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逾苫。三九已至,卻和暖如春枚钓,著一層夾襖步出監(jiān)牢的瞬間铅搓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工搀捷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留星掰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓嫩舟,卻偏偏與公主長得像氢烘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子至壤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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