七、config 設定中心

2022-01-13 08:00:02

為什麼需要設定中心

單體應用,設定寫在組態檔中,沒有什麼大問題。如果要切換環境 可以切換不同的profile(2種方式),但在微服務中。

  1. 微服務比較多。成百上千,設定很多,需要集中管理。

  2. 管理不同環境的設定。

  3. 需要動態調整設定引數,更改設定不停服。

設定中心介紹

分散式設定中心包括3個部分:

  1. 存放設定的地方:git ,本地檔案 等。
  2. config server。從 1 讀取設定。
  3. config client。是 config server 的使用者端 消費設定。在這裡插入圖片描述

服務搭建

基於GITHUB

  1. 建立倉庫
    在這裡插入圖片描述
    登入GitHub建立倉庫,並上傳幾個組態檔

  2. 新建微服務作為設定中心服務
    依賴

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

組態檔

spring.cloud.config.server.git.uri=https://github.com/piziniao/config-center.git
spring.cloud.config.label=master

eureka.client.service-url.defaultZone=http://euk1.com:7002/eureka/

啟動類

package com.mashibing.admin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class AConfigApplication {

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

}

  1. 啟動測試拉取

啟動服務後存取服務

http://localhost:70/master/config-client-dev.properties

正確設定後能讀到來自git的組態檔

匹配規則

獲取設定規則:根據字首匹配
/{name}-{profiles}.properties
/{name}-{profiles}.yml
/{name}-{profiles}.json
/{label}/{name}-{profiles}.yml

name 服務名稱
profile 環境名稱,開發、測試、生產:dev qa prd
lable 倉庫分支、預設master分支

匹配原則:從字首開始。

分支讀取

使用者端設定

修改 application.properties為bootstrap.properties

#直接URL方式查詢設定中心
spring.cloud.config.uri=http://localhost:9999/
#通過註冊中心查詢
#spring.cloud.config.discovery.enabled=true
#spring.cloud.config.discovery.service-id=a-config
spring.cloud.config.profile=dev
spring.cloud.config.label=dev

引入依賴

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

使用遠端設定

	@Value("${config.info}")
	String info;

consumer-dev.properties

config.info="config-dev,v1"

重新整理設定

手動設定熱更新

  1. 開啟actuator中的refresh端點
  2. Controller中新增@RefreshScope註解
  3. 向用戶端 url http://localhost:91/actuator/refresh傳送Post請求

自動重新整理

erlang安裝
http://www.erlang.org/downloads

RabbitMQ安裝
http://www.rabbitmq.com/install-windows.html

環境變數
path中新增 %ERLANG_HOME%\bin

# 開啟RabbitMQ節點
rabbitmqctl start_app
# 開啟RabbitMQ管理模組的外掛,並設定到RabbitMQ節點上
rabbitmq-plugins enable rabbitmq_management

管理介面

http://localhost:15672

使用者名稱密碼均為guest

服務設定

組態檔

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

依賴

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>

測試

啟動兩個微服務

修改組態檔後向其中一個端點傳送post請求

http://localhost:91/actuator/bus-refresh

觀察另一個服務是否也跟著重新整理了

完整設定

#################################### common config : ####################################
spring.application.name=a-config
# 應用服務web存取埠
server.port=9999
# ActuatorWeb存取埠
management.server.port=8081
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

spring.cloud.config.server.git.uri=https://github.com/piziniao/config-center.git
spring.cloud.config.label=master

eureka.client.service-url.defaultZone=http://euk1.com:7002/eureka/


spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

啟動類

@EnableConfigServer

依賴

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>
		
		
			<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>

Consumer
bootstrap.properties

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=a-config
spring.cloud.config.profile=dev
spring.cloud.config.label=dev


spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

依賴

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-client</artifactId>
		</dependency>

遠端設定
consumer-dev.properties

config.info="config-dev,v8"