【微服務】- 配置中心 – Nacos

微服務 – 配置中心 – Nacos

🏆 一個有夢有戲的人 @怒放吧德德
🔥分享學習心得,歡迎指正,大家一起學習成長!

今天的學習任務就是學習使用Nacos作為配置中心。
努力剋制自己,拒絕擺爛!
在這裡插入圖片描述

什麼是配置中心

配置中心就是將各個微服務的配置集中管理,就是一種統一管理各種應用配置的基礎服務組件,並且能夠動態配置服務,動態配置服務。動態配置服務讓您能夠以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變更時重新部署應用和服務的需要。配置中心化管理讓實現無狀態服務更簡單,也讓按需彈性擴展服務更容易。
image
就像如此,用戶發布/修改配置,客戶端能夠實時監聽到改動並且跟著改變。

Nacos配置模型

對於Nacos配置管理,通過Namespace、group、Data ID能夠定位到一個配置集。Nacos抽象定義了Namespace、Group、Data ID的概念,具體這幾個概念代表什麼,取決於我們把它們看成什麼,這裡推薦給大家一種用法,如下圖:
image
Namespace:代表不同環境,如開發、測試、生產環境。
Group:代表某項目,如XX項目
DataId:每個項目下往往有若干個工程,每個配置集(DataId)是一個工程的主配置文件
獲取配置集需要指定:
1、nacos服務地址,必須指定
2、namespace,如不指定默認public
3、group,如不指定默認 DEFAULT_GROUP
4、dataId,必須指定

命名空間

namespace 隔離設計,不同空間互不干擾。
命名空間(Namespace)是用於隔離多個環境的(如開發、測試、生產),而每個應用在不同環境的同一個配置(如資料庫數據源)的值是不一樣的。因此,我們應針對企業項目實際研發流程、環境進行規劃。如某軟體公司擁有開發、測試、生產三套環境,那麼我們應該針對這三個環境分別建立三個namespace。
image
通過新建命名空間,可以為不同環境設置不同的配置文件,並且不同的命名空間的配置內容是相互隔離的,並不會相互干擾,只是需要在配置的時候選中是那個命名空間,不選擇則是默認的public。

配置管理

Nacos提供管理所有配置,並且可以通過命名不同來定義許多種不一樣的配置。Nacos2.x提供了許多的配置文件類型,基本複合我們的開發使用。
image
選擇命名空間,新建配置文件,Data ID的命名規則:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默認為所屬工程配置spring.application.name 的值,也可以通過配置spring.cloud.nacos.config.prefix來配置。
  • spring.profiles.active=dev 即為當前環境對應的 profile。 注意:當 spring.profiles.active 為空時,對應的連接符 – 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。
    Nacos還支援編輯DIFF能力,幫助用戶校驗修改內容,降低改錯帶來的風險。
    通過編輯可以對配置進行編輯,編輯的時候,dateId和Group是不能修改的,因此只能添加新的配置文件
    image

如果在nacos的配置文件中配置了資料庫,就能夠將配置 數據保存下來
image

實例

現在使用springcloud demo來演示一下配置中心。

配置數據持久化

nacos有自帶默認的存儲方式,能夠保留本地,還可以是通過配置資料庫,從而達到數據的持久化。
首先在nacos/conf/application.properties 可以進行資料庫的配置
將以下配置放在配置文件中

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3307/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=12356

資料庫的數據是文件夾裡面的nacos-mysql.sql這個文件

導入依賴坐標

需要引入nacos配置坐標

<!--配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

設置相關的配置

在bootstrap.yml文件中設置相關的配置

server:
  port: 8000
spring:
  application:
    name: service-goods
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        ephemeral: false # false為永久實例,true表示臨時實例開啟,註冊為臨時實例
      config:
        server-addr: localhost:8848
        file-extension: yml
        group: DEFAULT_GROUP # 默認值
        namespace: bb4fbfd3-db73-45a7-8db0-59e62c2e2dd5 # 沒有指定的話就是默認 public

需要配置前綴,在application.yml文件中配置如下

spring:
  profiles:
    active: dev

編寫介面

通過編寫一個介面來測試從配置中心中拉取配置內容。
@RefreshScope: 能夠使之動態配置,只要在配置中心中修改數據,就能夠跟著改動。
@Value: 就是跟springboot獲取yml中的資訊一樣,實際上也是這樣子的,只不過是把配置內容放在了nacos伺服器上了

package com.lyd.demo.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lyd.demo.entity.GoodsDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
/**
 * @author: lyd
 * @description: api
 * @Date: 2022/9/21
 */
@RefreshScope // 動態更新配置
@RestController
@RequestMapping("/api")
public class GoodsController {
    @Autowired
    private RestTemplate restTemplate;
    @Value("${goods.name:null}")
    private String name;
    @Value("${goods.price:0.0}")
    private Double price;
    @GetMapping("/getValues")
    public String getConfigurationCenterValue() {
        return "商品名:" + name + " ,價格:" + price;
    }
    // ...
}

運行結果

image
今天就分享Nacos的初步使用,總體來說,Nacos在本地單機運行的時候很不穩定,容易出現問題。
👍創作不易,可能有些語言不是很通暢,如有錯誤請指正,感謝觀看!記得點贊哦!👍