天天看點

Spring Cloud:Nacos配置中心Nacos配置中心參考資料

Nacos配置中心

什麼是配置中心

在微服務架構中,當系統從一個單體應用,被拆分成分布式系統上一個個服務節點後,配置檔案也必須跟着分割,這樣導緻配置分散、備援,難以管理。如下圖:

Spring Cloud:Nacos配置中心Nacos配置中心參考資料

總得來說,配置中心就是一種統一管理各種應用配置的基礎服務元件。

配置中心将配置從各應用中剝離出來,對配置進行統一管理,應用自身不需要自己去管理配置,讓您以中心化、外部化和動态化的方式管理所有環境的應用配置和服務配置。動态配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和靈活。

Nacos配置中心

Nacos是阿裡巴巴開源的一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。

Spring Cloud:Nacos配置中心Nacos配置中心參考資料

配置中心的服務流程如下:

  1. 使用者在配置中心更新配置資訊。
  2. 服務A和服務B及時得到配置更新通知,從配置中心擷取配置。

整合Nacos Spring Cloud

首先下載下傳并啟動Nacos,詳情參考:Nacos入門

然後通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 實作配置的動态變更,關于 Nacos Spring Cloud 的詳細文檔請參看:Nacos Discovery。

  1. 添加依賴:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>
           
  1. 添加Nacos配置(bootstrap.yml檔案或者bootstrap.properties檔案)
spring:
	application:
		# 應用名稱
		name: spring2go-upms
	profiles:
		# 環境配置
		active: dev
	cloud:
		nacos:
			discovery:
				# 服務注冊位址
				server-addr: 127.0.0.1:8848
			config:
				# 配置中心位址
				server-addr: 127.0.0.1:8848
				# 配置檔案格式
				file-extension: yml
				# 共享配置
				shared-configs:
					- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
           

說明:之是以需要配置 spring.application.name ,是因為它是構成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 預設為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
  • spring.profiles.active 即為目前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profiles.active 為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-exetension 為配置内容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前隻支援 properties 和 yaml 類型。
  1. 在Application添加注解@SpringBootApplication并啟動
@SpringBootApplication
@EnableDiscoveryClient
public class Spring2goUpmsApplication {
  public static void main(String[] args) {
    SpringApplication.run(Spring2goUpmsApplication.class, args);
    System.out.println("(♥◠‿◠)ノ゙  UPMS 啟動成功   ლ(´ڡ`ლ)゙  \n");
  }
}
           
  1. 啟動Nacos,在配置管理中添加yml檔案
Spring Cloud:Nacos配置中心Nacos配置中心參考資料

詳情

spring:
	application:
		# 應用名稱
		name: spring2go-upms
	# mysql
	datasource:
		url: jdbc:mysql://127.0.0.1:3306/spring2go_upms?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
		username: root
		password: 123456

# mybatis配置
mybatis-plus:
	mapper-locations: classpath:mapper/**/*.xml
	configuration:
		# 這個配置會将執行的sql列印出來,在開發或測試的時候可以用
		log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# swagger配置
swagger:
	enabled: true
	title: UPMS 系統子產品接口文檔
	groupName: upms

# feign配置
spring2go:
	upms-service-endpoint: http://spring2go-upms
           

測試

package com.spring2go.upms.biz.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
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;

/**
* @Description: Nacos示例代碼
* @author: xiaobin
* @date: 2021-04-13 10:00
*/

@RestController
public class TestController {

@Value("${spring2go.upms-service-endpoint}")
private String endpoint;

@RequestMapping("/getEndpoint")
public String getEndpoint() {
		return endpoint;
}
} 
           

啟動程式,通路http://localhost:4000/getEndpoint(端口請根據實際調整),傳回"http://spring2go-upms"表示測試通過。

填坑日志

nacos 配置中心無法加載bootstrap.yml/properties配置檔案

當項目完成了依賴引入和參數配置後,啟動時仍報配置參數不存在的異常。

解決方案:

如果是spring cloud項目加入以下依賴

<!-- 若bootstrap配置不生效,加入以下依賴 -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-bootstrap</artifactId>
     <version>last version</version>
</dependency>
           

如果是spring boot項目則加入以下

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-context</artifactId>
</dependency>
           

因為bootstrap.yml 用于應用程式上下文的引導階段。bootstrap.yml 由父Spring ApplicationContext加載。

預設情況下,bootstrap.yml配置隻在spring cloud項目中加載使用,spring boot項目隻會識别application.yml配置。是以如果需要讀取bootstrap.yml,需要依賴spring-cloud-context。

拓展知識

  • 加載順序

若application.yml 和bootstrap.yml 在同一目錄下:bootstrap.yml 先加載 application.yml後加載

bootstrap.yml 用于應用程式上下文的引導階段。bootstrap.yml 由父Spring ApplicationContext加載。

  • 配置差別

bootstrap.yml 和 application.yml 都可以用來配置參數。

bootstrap.yml 用來程式引導時執行,應用于更加早期配置資訊讀取。可以了解成系統級别的一些參數配置,這些參數一般是不會變動的。一旦bootStrap.yml 被加載,則内容不會被覆寫。

application.yml 可以用來定義應用級别的, 應用程式特有配置資訊,可以用來配置後續各個子產品中需使用的公共參數等。

  • 屬性覆寫問題

啟動上下文時,Spring Cloud 會建立一個 Bootstrap Context,作為 Spring 應用的 Application Context 的父上下文。

初始化的時候,Bootstrap Context 負責從外部源加載配置屬性并解析配置。這兩個上下文共享一個從外部擷取的 Environment。Bootstrap 屬性有高優先級,預設情況下,它們不會被本地配置覆寫。

也就是說如果加載的 application.yml 的内容标簽與 bootstrap 的标簽一緻,application 也不會覆寫 bootstrap,而 application.yml 裡面的内容可以動态替換。

  • bootstrap.yml典型的應用場景
    • 當使用 Spring Cloud Config Server 配置中心時,這時需要在 bootstrap.yml 配置檔案中指定 spring.application.name 和 spring.cloud.config.server.git.uri,添加連接配接到配置中心的配置屬性來加載外部配置中心的配置資訊
    • 一些固定的不能被覆寫的屬性
    • 一些加密/解密的場景

參考資料

  • 官網
  • Github

繼續閱讀