SpringBoot使用Nacos作為配置中心服務和服務註冊中心

牧竹子發表於2019-03-07

簡介

從spring開始,所有的配置檔案都放在專案中,如果需要修改配置檔案內容,則需要登陸伺服器重啟服務。想象一下如果你有一百臺服務的需要修改,那是不可想象的工作量。

目前已有的配置中心

  • 攜程開源的Apollo:資料儲存在mysql中,支援名稱空間和分發更新配置
  • springcloud 中的springcloud config:必須使用git儲存配置資訊
  • 阿里的開源Nacos

其他專案未關注
最次的就是springcloud config 必須從git,svn才能更新

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 (控制檯樣例 Demo) 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀釋出、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。

  • 動態 DNS 服務
    動態 DNS 服務支援權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
    Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 列表.

  • 服務及其後設資料管理
    Nacos 能讓您從微服務平臺建設的視角管理資料中心的所有服務及後設資料,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計資料。
    在這裡插入圖片描述

Nacos 確實是極易上手,幾乎免安裝,只需要簡單的解壓包, 啟動 server 即可,它除了提供配置中心還提供註冊中心的作用,可以替代Eureka。
不足。但是官方特別強調了 Nacos v0.8.0 Production Ready 之前不建議在生產上大規模使用,建議使用之後版本在穩定性上要高很多。
Spring Cloud支援使用Eureka、Zookeeper、Consul實現服務發現的能力。Eureka 是其預設的也是推薦的服務註冊中心元件。但從Eureka切換成Zookeeper、consul只需要改個依賴,加兩行配置就可以了。

闢謠
Eureka沒有閉源,是Eurkea 2.x分支不再維護!
Spring Cloud並不強依賴Eureka,不要過分解讀

簡單入門

官方demo https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example
官方git上是有它的demo的,我這裡有寫了一下
本文配置中心demo原始碼如下:
https://github.com/BambooZhang/springboot-study.git

服務中心安裝和啟動

1.JDK環境
2.直接去官網git上下載 tar.gz或者zip格式到本地。
https://github.com/alibaba/nacos

windows安裝方式
解壓後,直接雙擊starup.bat

centos

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin
#啟動
sh startup.sh -m standalone

啟動成功後
訪問http://localhost:8848/nacos/index.html即可看到如下管理介面

springboot客戶端

新建一個springboot工程,我這裡直接拷貝了一個springboot專案,修改檔名和工程名以及pom

pom如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springboot</groupId>
    <artifactId>springboot-nacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-nacos :: 整合 nacos配置中心</name>

    <!-- Spring Boot 啟動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <properties>
        <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
    </properties>

    <dependencies>

        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


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

        <!-- nacos 依賴 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>${nacos-config-spring-boot.version}</version>
        </dependency>


        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

啟動類

package org.spring.springboot;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
 * Spring Boot 應用啟動類
 *
 * Created by bambo on 19/2/7.
 */
// Spring Boot 應用的標識
@SpringBootApplication
@RestController
@NacosPropertySource(dataId = "bamboo.test", autoRefreshed = true)
public class Application {

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

    @NacosValue(value = "${service.name:1}", autoRefreshed = true)
    private String serverName;

    @RequestMapping(value = "/test", method = GET)
    @ResponseBody
    public String get() {
        return serverName;
    }


}

配置檔案
application.properties

nacos.config.server-addr=127.0.0.1:8848

配置中心配置

這裡直接配置管理新增,注意預設group不變哦
在這裡插入圖片描述
儲存釋出,然後啟動springboot服務,訪問http://localhost:8080/test可以看到結果如下,說明成功了,如果修改這個值再發布,重新整理url值也會更接著變化。自動重新整理的基本功能就實現了

bamboo

擴充套件知識

其他配置資訊

客戶端配置檔案型別設定

在bootstrap.properties檔案中
spring.cloud.nacos.config.file-extension=properties,yml,yaml
屬性宣告從配置中心中讀取的配置檔案格式
該配置的預設值為properties,即預設是讀取properties格式的配置檔案。當客戶端沒有配置該屬性,並且在nacos server新增的是yml格式的配置檔案,則給客戶端會讀取不到配置檔案,導致啟動失敗。
非properties配置格式,必須新增如下配置才可生效

spring.cloud.nacos.config.file-extension=yml

根據profile設定不同的環境配置

springboot中我們可以通過配置spring.profiles.active 實現在開發、測試、生產環境下采用不同的配置檔案
同樣,我們同科可以在nacos server分別建立

${application.name}-dev.properties
${application.name}-test.properties
${application.name}-prod.properties

然後通過命令啟動jar時 設定spring.profiles.active來實現不同環境下使用不同的配置檔案。

java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

同樣也適用於yml/yaml檔案,只是客戶端設定spring.cloud.nacos.config.file-extension=yaml具體可見上一個說明

自定義group

在同一個group下,配置檔名不能重複,所以當需要建立檔名稱相同的兩個配置檔案時,將兩個配置檔案建立在不同的group下即可。當我們再同一個group下建立一個已有的配置檔案時,nacos會將其視為配置檔案的修改,而不是新建。
因此我們可以把group作為一個project名稱,相當於pom中的artifactId來標示不同的工程,每個工程擁有不同的配置檔案即可。
在這裡插入圖片描述
但是如果建立了新的group那麼客戶端需要顯式的配置group資訊否則預設DEFAULT_GROUP空間中會出現找不到或者配置資訊不符合你真實想法的情況。

#spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.group=bamboo_group

自定義 namespace 名稱空間

相應的如果是服務,我們一般是按照一個服務一個隔離空間的,比如公司有兩個不同的業務專案都有amdin服務,那麼為了避免不會發生衝突,服務配置中就使用名稱空間作為隔離開來。
在這裡插入圖片描述
上圖我建立了一個private服務名稱空間,這樣只有配置了該名稱空間的服務客戶端才會找到,否則就找不到了

# 根據自己nacos server生成的名稱空間ID進行修改
spring.cloud.nacos.config.namespace=fd69214f-54f1-47e8-affb-d19bc6616c13

注:該配置必須放在 bootstrap.properties 檔案中。此外 spring.cloud.nacos.config.namespace的值是 namespace 對應的 id,id 值可以在 Nacos 的控制檯獲取。並且在新增配置時注意不要選擇其他的 namespace,否則將會導致讀取不到正確的配置。

服務中心使用mysql儲存資料

在0.7版本之前,在單機模式時nacos使用嵌入式資料庫實現資料的儲存,不方便觀察資料儲存的基本情況。0.7版本增加了支援mysql資料來源能力,具體的操作步驟:

1.安裝資料庫,版本要求:5.6.5+
2.初始化mysql資料庫,資料庫初始化檔案:nacos-mysql.sql
3.修改conf/application.properties檔案,增加支援mysql資料來源配置(目前只支援mysql),新增mysql資料來源的url、使用者名稱和密碼。

具體操作:
1.在mysql server 新建資料庫:nocas(名字自己隨意)
2.在nacos server的 conf目錄下找到nacos-mysql.sql 檔案,並在建立的nacos資料庫下執行表nacos-mysql.sql中的SQL語句
3.修改nacos server application.properties配置檔案,修改後如下圖所示

# spring
 
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
 
spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://資料庫IP:埠號/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=資料庫使用者名稱
db.password=資料庫密碼

4.重啟Nacos server並新增配置檔案,就可以看到mysql資料庫資料表中出現了自己的配置檔案內容

注:由嵌入式資料庫切換為mysql資料庫後,資料並不能自動轉移到mysql中,導致之前的配置檔案丟失

注 :當然為了可用性較高,生產使用建議至少主備模式,或者採用高可用資料庫。

配置中心的高可用叢集

nacos server的叢集部署

叢集部署架構圖
官方的推薦部署架構圖:
[外鏈圖片轉存失敗(img-x4go827X-1568616387514)(https://nacos.io/img/deployDnsVipMode.jpg)]
推薦使用者把所有服務列表放到一個vip(虛擬IP,主機當機後可以自動漂移到備用機器上)下面,然後掛到一個域名下面
http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。
http://VIP:port/openAPI 掛載VIP模式,直連vip即可,下面掛server真實ip,可讀性不好。
http://nacos.com:port/openAPI 域名+VIP模式,可讀性好,而且換ip方便,推薦模式

具體操作實踐
注:目前器群模式下不採用mysql作為配置檔案的儲存方式,所以需要先配置為採用mysql資料來源模式,我在上一篇部落格中已經說明了,這裡不再介紹,直接配置叢集。

步驟如下:

1.conf資料夾下的檔案如下圖所示,其中下載的壓縮包解壓出來是沒有cluster.conf的,通過複製cluster.conf-example並修改檔名得來。
修改cluster.conf,將部署nacos server的三臺伺服器ip地址寫上即可
三臺伺服器cluster.conf檔案相同,都是協商這三個IP地址即可

#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***

2.分別啟動三臺nacos server
修改客戶端,在客戶端的bootstrap.properties檔案中修改server的IP地址
注:修改成自己的三臺伺服器ip地址,用逗號分隔

spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848
 ``

啟動客戶端 發現可以正常啟動



## 更多功能
關於如何在這些生態中使用 Nacos,請參考以下文件:

Nacos與Spring Cloud一起使用
Nacos與Kubernetes一起使用
Nacos與Dubbo一起使用
Nacos與gRPC一起使用
Nacos與Istio一起使用


相關文章