都2020年了,你使用註冊中心還不考慮 Nacos 嗎?

什麼是 Nacos?

Nacos 是一個由阿里開源的產品,可以用來做註冊中心跟配置中心。

以前剛剛學習 Spring Cloud 的時候,還是記得 Eureka 是 Spring Cloud 默認的,推薦的服務註冊中心組件,但現在早已時過境遷,由於其的閉源,我們被迫只能使用 Consul、ZooKeeper 等開源中間件作爲註冊中心。不過最近火熱的 Nacos 也許應該引起我們的關注, 它不僅僅可以代替 Eureka 做註冊中心,還可以替代 Config 做配置中心。

也許我們應該給 Nacos 下一個定義,也對,老是說 Nacos 就是註冊中心跟配置中心,就好像只關注 Nacos 的外表,卻忽視了它的內核一樣。

下面摘抄自官網,清楚地介紹了什麼是 Nacos 以及 Nacos 可以做些什麼。

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。

Nacos 可以做些什麼?

服務發現和服務健康監測

Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生 SDK、OpenAPI、或一個獨立的 Agent TODO 註冊 Service 後,服務消費者可以使用 DNS TODO 或 HTTP&API 查找和發現服務。

Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求。Nacos 支持傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、用戶自定義)的健康檢查。 對於複雜的雲環境和網絡拓撲環境中(如 VPC、邊緣網絡等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀表盤,幫助您根據健康狀態管理服務的可用性及流量。

動態配置服務

動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。

動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。

配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

Nacos 提供了一個簡潔易用的 UI 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀發佈、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。

動態 DNS 服務

動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單 DNS 解析服務。動態 DNS 服務還能讓您更容易地實現以 DNS 協議爲基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。

服務及其元數據管理

Nacos 能讓您從微服務平臺建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。

做個小總結

Nacos 無縫支持一些主流的開源生態,例如 Spring Cloud,Dubbo,gRPC 等,使用 Nacos 簡化服務發現、配置管理、服務治理及管理的解決方案,讓微服務的發現、管理、共享、組合更加容易。

使用 Nacos 作爲註冊中心

我們之前說過,Nacos 可以作爲註冊中心以及配置中心,今天我們就來嘗試一下使用 Nacos 作爲我們 Spring Cloud 的註冊中心,畢竟光說不練假把式,總得練練避免紙上談兵嘛。

我們首先從 github 上下載 Nacos 的安裝包,解壓,進入 bin 目錄下的 startup.cmd 文件,將其啓動。
**加粗樣式**
我們打開 http://127.0.0.1:8848/nacos/index.html,其中賬號密碼默認均爲 nacos,發現可以訪問 nacos 控制檯。

在這裏插入圖片描述
接下來我們創建一個父工程 nacosuse,並分別創建兩個模塊,分別爲服務提供者 nacos-provider 和服務消費者 nacos-consumer。

服務提供者

我們修改一下 nacos-provider 的 pom 文件,添加 Nacos 有關注冊中心的依賴

<?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>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>nacos-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.2.RELEASE</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>

我們可以看到引入了一個 dependencyManagement,它定義了 spring cloud 的版本以及 spring cloud alibaba 的版本,這是因爲 spring cloud alibaba 還未納入 spring cloud 的主版本管理中,所以需要自己加入。然後我們引入了 Nacos 的服務註冊與發現模塊:spring-cloud-starter-alibaba-nacos-discovery。由於已經在 dependencyManagement 中引入了版本,所以在這裏就不指定具體版本了。

然後在啓動類上添加 @EnableDiscoveryClient 註解開啓服務註冊發現功能

package com.example.nacosprovider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }

}

配置文件修改一下:

server:
  port: 8089
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        #指定nacos註冊中心地址
        server-addr: 127.0.0.1:8848

然後我們寫一個控制類

package com.example.nacosprovider.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NameController {

    @RequestMapping("/test")
    public String getName() {
        return "Hello Nacos!";
    }
}

服務消費者

nacos-consumer 的 pom 文件與 nacos-provider 是一致的,同時也需要在啓動類添加 @EnableDiscoveryClient 註解開啓服務註冊發現功能。

配置文件如下:

server:
  port: 8090
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        #指定nacos註冊中心地址
        server-addr: 127.0.0.1:8848

注意,服務消費者在這裏通過 RestTemplate 調用服務提供者的服務,代碼如下:

package com.example.nacosconsuer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @RequestMapping("/consumer")
    public String consumer() {
        return restTemplate.getForObject("http://nacos-provider/test",String.class);
    }
}

測試

啓動兩個模塊,打開 Nacos 控制檯,可以發現兩個服務均已註冊到了 Nacos。

在這裏插入圖片描述
然後我們訪問服務消費者的接口 http://localhost:8090/consumer,發現調用成功。
在這裏插入圖片描述

總結

我們都知道,Nacos 可以作爲註冊中心,也可以作爲配置中心。

本文較爲詳細介紹瞭如何使用 Nacos 作爲註冊中心,在下一篇博客中會詳細介紹如何使用 Nacos 作爲配置中心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章