快速入手:Nacos融合SpringCloud成為注冊配置中心
- 前言
- 安裝Nacos
- 項目搭建
- 添加配置
- 啟動類添加注解
- 運行項目
- 服務調用
- RestTemplate 模式
- FeignClient 模式
- Gateway 網關
前言
- Spring Cloud是一系列框架的集合,提供了微服務架構下的各種解決方案,如服務治理、配置管理、熔斷器、網關等。它基于 Spring Boot,使得開發者能夠快速構建微服務應用。
- Nacos是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。它可以作為服務注冊中心,幫助微服務實例進行注冊與發現,使各個微服務之間能夠方便地進行通信。Nacos 服務器維護著一個服務注冊表,記錄著各個微服務的實例信息,如 IP 地址、端口號、服務名稱等。當其他微服務需要調用某個服務時,只需從 Nacos 服務器獲取服務實例列表,即可進行遠程調用。此外,Nacos 還支持服務健康檢查,能夠實時監測服務實例的健康狀態,將不健康的實例從服務列表中剔除,保證服務調用的可靠性。
當與 Nacos 集成時,Spring Cloud 應用可以從 Nacos 服務器獲取配置信息。同時,Nacos 支持配置的動態更新,當配置信息發生變化時,微服務應用能夠實時感知到變化,并自動更新本地的配置,無需重啟應用。
搭建微服務.
安裝Nacos
您需要先下載 Nacos 并啟動 Nacos server。
快速開始所生產出的Nacos服務為單機模式及未開啟鑒權,建議僅在測試中使用,若在實際生產環境中部署,請部署集群模式并開啟鑒權,以避免存在穩定性和安全性的風險。
您可以通過Nacos的版本下載頁面、Github找到每個版本支持的功能的介紹,當前推薦的穩定版本為2.5.1。
Nacos 依賴 Java 環境來運行,請確保是在以下版本環境中安裝使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下載 & 配置。
下載完成后解壓Nacos壓縮包,以Linux為例。
如果是.zip
文件執行如下代碼:
unzip nacos-server-$version.zip
如果是.gz
文件執行如下代碼:
tar -xvf nacos-server-$version.tar.gz
解壓完成后,進入/bin
目錄:
cd nacos/bin
注:Nacos的運行建議至少在2C4G 60G的機器配置下運行。
解壓后進入/bin
目錄,執行啟動命令,如果是Linux則執行.sh
腳本文件,Windows則執行.cmd
腳本文件,示例代碼如下:
# Linux
sh startup.sh -m standalone
# Windows
startup.cmd -m standalone
standalone
代表著單機模式運行,非集群模式。
啟動后,返回以下信息說明啟動成功,如圖所示:
打開任意瀏覽器,輸入地址:http://127.0.0.1:8848/nacos
,即可進入Nacos控制臺頁面(無需數用戶名和密碼)。
如果需要關閉服務器,執行對應文件與啟動時文件后綴一致,示例代碼如下:
# Linux
sh shutdown.sh
# Windows 或者雙擊
shutdown.cmd
項目搭建
參考官網最新版本說明,如圖所示:
我們使用當前Nacos最新的版本,依賴文件如下:
Spring Boot Version | Spring Cloud Alibaba Version | Spring Cloud Version |
---|---|---|
3.3.9 | 2023.0.3.* | 2023.0.3 |
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sc.nacos.product</groupId><artifactId>sc-nacos-product</artifactId><version>0.0.1-SNAPSHOT</version><name>sc-nacos-product</name><description>sc-nacos-product</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 用于配置管理 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- 服務發現 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.3.2</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2023.0.3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
添加配置
在 bootstrap.properties
或bootstrap.yml
中配置應用名和文件名、 Nacos server 的地址,示例代碼如下:
spring:application:name: sc-nacos-product# 設置外部配置源config:import: nacos:sc-nacos-product-dev.ymlcloud:nacos:# 指定 Nacos 配置服務器的地址config:server-addr: 127.0.0.1:8848# 指定 Nacos 服務發現服務器的地址discovery:server-addr: 127.0.0.1:8848
再Nacos上創建對應sc-nacos-product-dev.yml
配置文件,如圖所示:
啟動類添加注解
啟動類增加 @EnableDiscoveryClient
開啟服務注冊發現功能,示例代碼如下:
@SpringBootApplication
@EnableDiscoveryClient
public class ScNacosProductApplication {public static void main(String[] args) {SpringApplication.run(ScNacosProductApplication.class, args);}}
運行項目
啟動項目,檢查配置文件是否連接正常,如圖所示:
再檢查服務在Nacos上是否注冊成功,如圖所示:
至此一個簡單的SpringCloud整合Nacos項目已經完成。
服務調用
Spring Cloud提供了許多用于服務調用的功能。常見的服務調用方式RestTemplate 和 FeignClient 、Ribbon、Hystrix 等。
RestTemplate 模式
RestTemplate 是 Spring 提供的用于發送 HTTP 請求和接收響應的類。它適用于多種場景,尤其是在沒有聲明式調用需求時。通過 RestTemplate,你可以直接發送 HTTP 請求并獲取返回結果,通常與 Ribbon 結合使用進行負載均衡。
引入依賴:
<!-- 負載均衡 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
在sc-nacos-product
服務中定義一個Controller接口,示例代碼如下:
@RestController
public class AppController {@GetMapping("/echo/{str}")public String rest(@PathVariable String str){return "hello "+ str;}
}
按照之前的步驟,創建一個調用方項目(比如項目名:
sc-nacos-consumer
)。
添加 @LoadBlanced
注解,使得 RestTemplate 接入服務發現與負載均衡:
@Configuration
public class AppConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
在sc-nacos-consumer
服務定義一個Controller接口,調用sc-nacos-product
服務接口,示例代碼如下:
@RestController
public class AppController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/rest/{str}")public String rest(@PathVariable String str){return restTemplate.getForObject("htt://sc-nacos-product/echo/"+ str, String.class);}
}
使用Postman等工具,請求sc-nacos-consumer
服務接口,確認響應無誤,如圖所示:
FeignClient 模式
FeignClient 是 Spring Cloud 提供的一個聲明式 HTTP 客戶端,可以讓你通過注解方式自動化服務調用。Feign 會根據接口定義自動實現 HTTP 請求,簡化了服務調用的代碼,并集成了負載均衡和錯誤處理功能。
引入依賴:
<!-- 遠程調用 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
啟動類增加@EnableFeignClients
注解,用于啟用 Feign 客戶端,示例代碼如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ScNacosProductApplication {public static void main(String[] args) {SpringApplication.run(ScNacosProductApplication.class, args);}}
使用 @FeignClient
注解將sc-nacos-product
服務提供的Controller接口,包裝成一個 FeignClient,屬性 name
對應對端應用名,示例代碼如下:
@FeignClient(name = "sc-nacos-product")
public interface EchoService {@GetMapping(value = "/echo/{str}")String echo(@PathVariable(value = "str") String str);
}
將 EchoService 作為標準bean 注入sc-nacos-consumer
服務,即可對遠端服務發起請求了,示例代碼如下:
@RestController
public class AppController {@Autowiredprivate EchoService echoService;@GetMapping("/client/{str}")public String client(@PathVariable(value = "str") String str){return echoService.echo(str);}
}
需要注意再sc-nacos-consumer
服務,使用@EnableFeignClients
注解并指定掃描路徑,示例代碼如下:
@SpringBootApplication
@EnableFeignClients(basePackages = "com.sc.nacos.product.client")
@EnableDiscoveryClient
public class ScNacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(ScNacosConsumerApplication.class, args);}}
使用Postman等工具,請求sc-nacos-consumer
服務接口,確認響應無誤,如圖所示:
Gateway 網關
Spring Cloud Gateway 是 Spring Cloud 生態系統中的一個 API 網關,用于路由請求、過濾請求和響應。
引入依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
按照之前的步驟,創建一個網關項目(比如項目名:
sc-nacos-gateway
)。
啟動類添加注解,示例代碼如下:
@SpringBootApplication
@EnableDiscoveryClient
public class ScNacosGatewayApplication {public static void main(String[] args) {SpringApplication.run(ScNacosGatewayApplication.class, args);}
}
在 application.yml
中配置路由規則:
spring:cloud:gateway:routes:- id: sc-nacos-consumeruri: lb://sc-nacos-consumerpredicates:- Path=/consumer/**- id: sc-nacos-producturi: lb://sc-nacos-productpredicates:- Path=/product/**filters:- StripPrefix=1
每個路由規則使用 -
來表示一個獨立的路由。
-
id
為當前的路由規則唯一標識符。 -
uri
是一個關鍵配置項,它代表著請求被路由后要前往的目標地址或者服務發現中的服務名。lb://
是負載均衡的前綴,當請求/consumer
開頭的地址,就會被路由到sc-nacos-consumer
服務,并且會通過負載均衡算法選擇合適的實例來處理請求。 -
predicates
是路由的匹配條件部分,用于判斷什么樣的請求會被這個路由規則所處理。它表示當請求的路徑以任意地址開頭時,該請求就會匹配這個路由規則。**
是通配符,可以跟任意的路徑信息。 -
filters
是路由的過濾部分,用于在請求被路由前后對請求和響應進行修改或處理。StripPrefix
過濾器的作用是在請求被路由之前,從請求的路徑中移除指定數量的路徑前綴部分。這里的 1 表示移除路徑中的第一個路徑段。比如:請求/product/user
在經過StripPrefix=1
過濾器處理后,實際被路由的路徑會變成/user
。
完整的配置文件如下:
spring:application:name: sc-nacos-gatewayconfig:import: nacos:sc-nacos-gateway.ymlcloud:nacos:config:server-addr: 127.0.0.1:8848discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: sc-nacos-consumeruri: lb://sc-nacos-consumerpredicates:- Path=/consumer/**filters:- StripPrefix=1- id: sc-nacos-producturi: lb://sc-nacos-productpredicates:- Path=/product/**filters:- StripPrefix=1
使用Postman等工具,從網關請求sc-nacos-consumer
服務接口,確認響應無誤,如圖所示: