1. 程式人生 > >搞微服務用阿里開源的 Nacos 真香啊!

搞微服務用阿里開源的 Nacos 真香啊!

> 本文適合有 Java 基礎知識的人群 ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235524997-1598592948.png)

本文作者:HelloGitHub-秦人

HelloGitHub 推出的[《講解開源專案》](https://github.com/HelloGitHub-Team/Article)系列,今天給大家帶來一款開源 Java 版可以實現動態服務發現,配置和服務管理平臺——Nacos,它是阿里巴巴團隊開源符合國人的一切使用習慣,並且中文文件豐富,開源社群也特別活躍。 > 專案原始碼地址:https://github.com/alibaba/nacos ## 一、專案介紹 在選擇使用一個工具之前,我們先大概瞭解一下它的同類型產品,這樣更能看出它的價值。 **三大註冊中心** | 名稱 | 配置中心 | 註冊中心 |依賴 |訪問協議|版本迭代 |整合支援 |上手程度 | | -------- | -----: | :----: | :----: |:----: |:----: |:----: |:----: | | Eureka | 不支援 | 支援 | 依賴ZooKeeper |HTTP | 無版本升級 |SpringCloud整合 |容易,英文介面,不符合國人習慣 | Consul | 支援 | 支援 | 不依賴其他元件 |HTTP/DNS | 版本迭代中 |SpringCloud、K8S |複雜,英文介面,不符合國人習慣 | Nacos | 支援 | 支援 | 不依賴其他元件 |HTTP/動態DNS/UDP | 版本迭代中 |Dubbo、SpringCloud、K8S |極易,中文文件和社群,符合國人習慣 提供了一組簡單易用的特性集,幫助開發者快速實現動態服務發現、服務配置、服務元資料及流量管理。 主要特性: - 服務發現:支援基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的 Agent TODO 註冊 Service 後,服務消費者可以使用 DNS TODO 或 HTTP&API 查詢和發現服務。 - 服務健康監測:提供對服務的實時的健康檢查,阻止向不健康的主機或服務例項傳送請求。 - 動態配置服務:動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。 - 動態 DNS 服務:動態 DNS 服務支援權重路由,使用者更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單DNS解析服務。 - 服務及其元資料管理:Nacos 能讓使用者從微服務平臺建設的視角管理資料中心的所有服務及元資料,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計資料。 `Nacos` 生態圖 ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235537869-1464504871.png) ## 二、`SpringBoot` 實戰 `Nacos` 主要的功能有配置中心和註冊中心。 - 配置中心:通過在 `Nacos` 上配置使用者名稱,在不重啟微服務的情況下實現動態獲取配置資訊功能。 - 註冊中心:建立兩個微服務:服務提供者和服務消費者,實現微服務間呼叫。消費者要呼叫提供者的介面,只需要宣告提供者的微服務名稱和介面的請求地址,`Nacos` 就可準確的找到到對應的介面。 ### 2.1 執行 Nacos 下載地址:https://github.com/alibaba/nacos/releases ```bash unzip nacos-server-$version.zip #解壓 cd nacos/bin startup.cmd -m standalone #單機模式 ``` **訪問首頁** Nacos 的訪問地址:http://localhost:8848/nacos/ 預設賬號密碼:nacos nacos 頁面截圖如下: ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235554087-206051925.png) ### 2.2 配置中心 **建立微服務專案** 建立 `SpringBoot` 專案主要有三種方式:通過網站建立,`IntelliJ IDEA` 的 `Spring Initializr` 工具建立,Maven 建立專案形式建立。 專案的`pom` 檔案內容如下: ```xml ``` **bootstrap.yml 配置** ```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`,內容如下: ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235605054-2144649635.png) **建立 Controller** 動態獲取使用者名稱稱的功能為例: 建立一個對外介面 `/username` 程式碼如下: ```java @RestController @RefreshScope public class ConfigController { @Value("${username:wangzg}") private String username; @RequestMapping("/username") public String userNameInfo() { return username; } } ``` 注意:`Controller` 上要新增 `@RefreshScope註解` 它實現了配置的熱載入。 **驗證結果** 本地執行專案,可以看到專案的啟動時,埠已變為我們在 `Nacos` 上配置的埠`8090`。 ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235625084-1121936818.png) 在瀏覽器訪問連結:`http://localhost:8090/username`,返回 `testuser`。修改 `Nacos` 上 `username` 的值,不需要重啟微服務,重新請求連結 `username` 的值會動態變。可見 `Nacos` 作為配置中心實現了熱載入功能。 ### 2.3 註冊中心 1. 建立服務提供者 建立微服務可參上面**配置中心**的建立方式,建立對外介面 `/sayHello` 程式碼如下: ```java @RestController public class ProviderController { @GetMapping("/sayHello") public String sayHello(@RequestParam(value = "name",defaultValue = "helloWord")String sayHello){ return "tom say: " + sayHello; } } ``` 啟動服務,訪問地址:[http://localhost:8099/sayHello](http://localhost:8099/sayHello),可輸出: `tom say: helloWord`,表示微服務已建立成功。 2. 建立服務消費者 這裡採用 `FeignClient` 的方式實現跨服務間呼叫(有興趣的同學也可以研究一下RestTemplate的方式)。 **pom 檔案** 在 nacos-consumer 的 pom 檔案要新增 `Feigin-Client` 的 maven 依賴。 ```xml ``` **添加註解** 在微服務啟動類 `*Application.java` 添加註解 `@EnableFeignClients`。 **建立 FeignClient** ```java @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** ```java @RestController public class ConsumerController { @Autowired ProviderClient providerClient; @GetMapping("/hi-feign") public String hiFeign(){ return providerClient.sayHello("feign"); } } ``` 重啟工程,在瀏覽器上訪問[http://localhost:8090/hi-feign](http://localhost:8090/hi-feign),可以在瀏覽器上展示正確的響應,這時 nacos-consumer 呼叫 nacos-provider 服務成功。 下面一張請求流轉的時序圖,這樣理解清晰一些。 ![](https://img2020.cnblogs.com/blog/759200/202011/759200-20201111235634908-1471297799.png) 專案地址:[https://github.com/hellowHuaairen/wangzgSpringBootTest](https://github.com/hellowHuaairen/wangzgSpringBootTest) ## 三、最後 微服務有四大特點: - 小(微服務粒度小) - 獨(獨立部署執行和擴充套件) - 輕(系統簡潔輕量化) - 鬆(高內聚低耦合) 要完成一個複雜系統往往需要很多微服務單元,而銜接每個微服務,完成微服務的統一管理就非常有必要,所以整合服務管理中心和配置中心的產品就的就應運而生,而 `Nacos` 是其中的佼佼者! 教程至此,你應該也能對 `Nacos` 有一些瞭解!光看不練假把式,最快的學習方式莫過於模仿,再通過舉一反三才能融會貫通。每一種新工具都是對老工具的革新,有興趣的小夥伴可以參考我上面的案例,在實踐中會發現更多樂趣! ## 四、參考資料 - 官方文件: [https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh-cn/docs/what-is-nacos.html)