本文講解項目中集成nacos,并將nacos作為注冊中心使用的過程。本文不涉及nacos的原理。
1、項目簡介
以一個演示項目為例,項目包含三個服務,調用及依賴如下圖:
由圖中可以看出,coupon-customer-serv為服務的消費者,coupon-calculation-serv和coupon-template-serv為服務的提供者。業務簡述如下表:
序號 | 服務名稱 | 服務描述 |
---|---|---|
1 | coupon-template-serv | 優惠卷模板服務,提供模板的創建功能。比如打折優惠券,當用戶領取優惠卷時,優惠卷由模板生成,而具體打折多少,由商家指定。 |
2 | coupon-calculation-serv | 優惠卷計算服務。當用戶支付訂單時,根據用戶購買的商品和已有的優惠券,計算實際支付的貨款。 |
3 | coupon-customer-serv | 用戶服務。包含用戶領取優惠券、支付等功能。 |
2、主要依賴的版本
- springboot:2.4.2
- spring cloud:2020.0.1
- spring cloud alibaba:2021.1
3、開工
關于springboot項目的搭建,此處略過。此處只討論spring cloud相關的內容。先集成服務提供者(coupon-template-serv、coupon-calculation-serv),再集成服務消費者。
3.1、模塊內部結構介紹
下面從coupon-template-serv服務開始,集成nacos。該服務的目錄結構如下:
內部各模塊介紹:
- coupon-template-api:存放該項目用到dto類
- coupon-template-dao: 數據庫操作模塊
- coupon-template-impl: 服務層和controller保存的地方,也是springboot的入口。
3.2、引入依賴
打開coupon-template-serv模塊下的pom.xml文件(也就是模塊的根pom.xml),添加如下依賴:
<!--spring cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.1</version><type>pom</type><scope>import</scope></dependency><!--spring cloud alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version><type>pom</type><scope>import</scope></dependency>
打開coupon-template-impl模塊下的pom.xml文件,添加nacos依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3、配置nacos服務發現
打開coupon-template-impl下的application.yml文件,添加如下配置:
spring:cloud:nacos:discovery:# Nacos的服務注冊地址,可以配置多個,逗號分隔server-addr: 192.168.110.165:8848,192.168.110.165:8948# 服務注冊到Nacos上的名稱,一般不用配置service: coupon-template-serv# nacos客戶端向服務端發送心跳的時間間隔,時間單位其實是msheart-beat-interval: 5000# 服務端沒有接受到客戶端心跳請求就將其設為不健康的時間間隔,默認為15s# 注:推薦值該值為15s即可,如果有的業務線希望服務下線或者出故障時希望盡快被發現,可以適當減少該值heart-beat-timeout: 20000# 元數據部分 - 可以自己隨便定制metadata:mydata: abc# 客戶端在啟動時是否讀取本地配置項(一個文件)來獲取服務列表# 注:推薦該值為false,若改成true。則客戶端會在本地的一個# 文件中保存服務信息,當下次宕機啟動時,會優先讀取本地的配置對外提供服務。naming-load-cache-at-start: false# 命名空間ID,Nacos通過不同的命名空間來區分不同的環境,進行數據隔離,namespace: dev# 創建不同的集群cluster-name: Cluster-A# [注意]兩個服務如果存在上下游調用關系,必須配置相同的group才能發起訪問group: myGroup# 向注冊中心注冊服務,默認為true# 如果只消費服務,不作為服務提供方,倒是可以設置成false,減少開銷register-enabled: true
配置的注釋比較詳細,可以對照著看。注意nacos的ip地址和端口改成你自己的。
3.4、驗證集成成功
啟動nacos,再啟動coupon-template-impl,仔細觀察打印的日志,如圖:
再打開nacos管理端,看服務的注冊情況,因為我們的服務注冊在namespace dev下,所以看dev:
至此,服務提供者集成完畢,并驗證成功。
coupon-calculation-serv服務也是服務提供者,集成過程類似,此處不再贅述。
3.5、服務消費者coupon-customer-serv集成
項目結構如圖:
3.5.1、添加依賴
根pom.xml與上面一致,但是作為服務的消費者,需要配置負載均衡等依賴。所以,打開
coupon-custom-impl模塊的pom.xml文件,添加以下依賴:
<!--服務發現-->
<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><!--webflux調用-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
再配置application.yml文件,它與上面兩個服務配置一樣,保證服務名稱不一致就行了。再次查看nacos管理端,現在有三個服務在注冊中心。
4、發起遠程調用
這里用webflux發起調用,有興趣的同學去網上查一下資料,這里僅展示一下調用的代碼:
...CouponTemplateInfo templateInfo = webClientBuilder.build().get().uri("http://coupon-template-serv/template/getTemplate?id=" + request.getCouponTemplateId()).retrieve().bodyToMono(CouponTemplateInfo.class).block();
注意:uri中用的是服務名而不是ip地址+端口,這樣調用時,nacos會把具體的地址給調用方,另一個,還有負載均衡的意思。因為實際中用webflux調用的比較少,話不多說。
注入webClientBuilder對象:
@Autowiredprivate WebClient.Builder webClientBuilder;
webClientBuilder對象的配置:
@org.springframework.context.annotation.Configuration
public class Configuration {@Bean@LoadBalancedpublic WebClient.Builder register() {return WebClient.builder();}
}
5、三個服務git
coupon-template-serv
coupon-calculation-serv
coupon-custom-serv
Ok, Have a nice day!