本文作者:HelloGitHub-秦人
HelloGitHub 推出的《講解開源項目》系列,今天給大家帶來一款開源 JAVA 版可以實現動態服務發現,配置和服務管理平臺——Nacos,它是阿里巴巴團隊推出的,符合國人的一切使用習慣,并且中文文檔豐富,開源社區也特別活躍。
項目源碼地址:https://github.com/alibaba/nacos
一、項目介紹
在選擇使用一個工具之前,我們先大概了解一下它的同類型產品,這樣更能看出它的價值。

提供了一組簡單易用的特性集,幫助開發者快速實現動態服務發現、服務配置、服務元數據及流量管理。主要特性:
- 服務發現:支持基于 DNS 和基于 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的 Agent TODO 注冊 Service 后,服務消費者可以使用 DNS TODO 或 HTTP&API 查找和發現服務。
- 服務健康監測:提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求。
- 動態配置服務:動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。
- 動態 DNS 服務:動態 DNS 服務支持權重路由,使用者更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。
- 服務及其元數據管理:Nacos 能讓使用者從微服務平臺建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。
Nacos 生態圖

二、SpringBoot 實戰
Nacos 主要的功能有配置中心和注冊中心。
- 配置中心:通過在 Nacos 上配置用戶名,在不重啟微服務的情況下實現動態獲取配置信息功能。
- 注冊中心:創建兩個微服務:服務提供者和服務消費者,實現微服務間調用。消費者要調用提供者的接口,只需要聲明提供者的微服務名稱和接口的請求地址,Nacos 就可準確地找到到對應的接口。
2.1 運行 Nacos
下載地址:https://github.com/alibaba/nacos/releases
unzip nacos-server-$version.zip #解壓
cd nacos/bin
startup.cmd -m standalone #單機模式
訪問首頁
Nacos 的訪問地址:http://localhost:8848/nacos/ 默認賬號密碼:nacos nacos
頁面截圖如下:

2.2 配置中心
創建微服務項目
創建 SpringBoot 項目主要有三種方式:通過網站創建,IntelliJ IDEA 的 Spring Initializr 工具創建,Maven 創建項目形式創建。
項目的pom 文件內容如下:
<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>
<!--nacos-config的Spring cloud依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
bootstrap.yml 配置
spring:
Application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: nacos-config
profiles:
active: dev
Nacos 配置
Nacos 上創建配置文件名稱格式:${prefix}-${spring.profile.active}.${file-extension},如上一步bootstrap.yml的配置可知,我要創建的配置名為:nacos-config-dev.yaml,內容如下:

創建 Controller
動態獲取用戶名稱的功能為例:
創建一個對外接口 /username 代碼如下:
@RestController
@RefreshScope
public class ConfigController {
@Value("${username:wangzg}")
private String username;
@RequestMapping("/username")
public String userNameInfo() {
return username;
}
}
注意:Controller 上要添加 @RefreshScope注解 它實現了配置的熱加載。
驗證結果
本地運行項目,可以看到項目的啟動時,端口已變為我們在 Nacos 上配置的端口8090。

在瀏覽器訪問鏈接:http://localhost:8090/username,返回 testuser。修改 Nacos 上 username 的值,不需要重啟微服務,重新請求鏈接 username 的值會動態變。可見 Nacos 作為配置中心實現了熱加載功能。
2.3 注冊中心
- 創建服務提供者
創建微服務可參上面配置中心的創建方式,創建對外接口 /sayHello 代碼如下:
@RestController
public class ProviderController {
@GetMapping("/sayHello")
public String sayHello(@RequestParam(value = "name",defaultValue = "helloword")String sayHello){
return "tom say: " + sayHello;
}
}
啟動服務,訪問地址:http://localhost:8099/sayHello,可輸出:tom say: helloWord,表示微服務已創建成功。
- 創建服務消費者
這里采用 FeignClient 的方式實現跨服務間調用(有興趣的同學也可以研究一下RestTemplate的方式)。
pom 文件
在 nacos-consumer 的 pom 文件要添加 Feigin-Client 的 maven 依賴。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解
在微服務啟動類 *Application.java 添加注解 @EnableFeignClients。
創建 FeignClient
@FeignClient("nacos-provider")
public interface ProviderClient {
@GetMapping("/sayHello")
String sayHello(@RequestParam(value = "name", defaultValue = "wangzg", required = false) String name);
}
說明:FeignClient 注解傳入的 name ,指定FeignClient的名稱,如果項目使用了 Ribbon,name 屬性會作為微服務的名稱,用于服務發現。
創建 ConsumerController
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.sayHello("feign");
}
}
重啟工程,在瀏覽器上訪問 http://localhost:8090/hi-feign,可以在瀏覽器上展示正確的響應,這時 nacos-consumer 調用 nacos-provider 服務成功。
下面一張請求流轉的時序圖,這樣理解清晰一些。

項目地址:https://github.com/hellowHuaairen/wangzgSpringBootTest
三、最后
微服務有四大特點:
- 小(微服務粒度小)
- 獨(獨立部署運行和擴展)
- 輕(系統簡潔輕量化)
- 松(高內聚低耦合)
要完成一個復雜系統往往需要很多微服務單元,而銜接每個微服務,完成微服務的統一管理就非常有必要,所以集成服務管理中心和配置中心的產品就的就應運而生,而 Nacos 是其中的佼佼者!
教程至此,你應該也能對 Nacos 有一些了解!光看不練假把式,最快的學習方式莫過于模仿,再通過舉一反三才能融會貫通。每一種新工具都是對老工具的革新,有興趣的小伙伴可以參考我上面的案例,在實踐中會發現更多樂趣!