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

削微寒發表於2020-11-12

本文適合有 Java 基礎知識的人群

本文作者:HelloGitHub-秦人

HelloGitHub 推出的《講解開源專案》系列,今天給大家帶來一款開源 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 生態圖

二、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 IDEASpring 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。修改 Nacosusername 的值,不需要重啟微服務,重新請求連結 username 的值會動態變。可見 Nacos 作為配置中心實現了熱載入功能。

2.3 註冊中心

  1. 建立服務提供者

建立微服務可參上面配置中心的建立方式,建立對外介面 /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,表示微服務已建立成功。

  1. 建立服務消費者

這裡採用 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 有一些瞭解!光看不練假把式,最快的學習方式莫過於模仿,再通過舉一反三才能融會貫通。每一種新工具都是對老工具的革新,有興趣的小夥伴可以參考我上面的案例,在實踐中會發現更多樂趣!

四、參考資料

相關文章