應用程式在啓動和執行的時候, 往往需要讀取一些設定資訊, 設定基本上伴隨着應用程式的整個生命週期, 比如: 數據庫連線參數, 啓動參數等
設定主要有一下幾個特點:
傳統單體應用存在一些潛在缺陷, 如隨着規模的擴大, 部署效率降低, 團隊共同作業效率差, 系統可靠性變差, 維護困難, 新功能上線週期長等, 所以迫切需要一種新的架構去解決這些問題, 而微服務(microservices)架構正是當下一種流行的解法
不過, 解決一個問題的同時, 往往會誕生出很多新的問題, 所以微服務化的過程中伴隨着很多的挑戰, 其中一個挑戰就是有關服務(應用)設定的. 當系統從一個單體應用, 被拆分成分佈式系統上一個個服務節點後, 組態檔也必須跟着遷移, 分割, 這樣設定就分散了, 不僅如此, 分散中還包含着冗餘, 如下圖
設定中心將設定從應用中剝離出來, 統一管理, 優雅的解決了設定的動態變更, 持久化, 運維成本等問題
應用自身既不需要去新增管理設定介面, 也不需要自己去實現設定的持久化, 更不需要引入"定時任務"以便降低運維成本
總的來說, 設定中心就是一種統一管理各種應用設定的基礎服務元件
在系統架構中, 設定中心時整個微服務基礎架構體系中的一個元件, 如下圖, 它的功能看上去不起眼, 無非就是設定的管理和存取, 但它是整個微服務架構中不可或缺的一環
集中管理設定,那麼就要將應用的設定作爲一個單獨的服務抽離出來了,同理也需要解決新的問題,比如:版本管理(爲了支援回滾),許可權管理等。
總結一下,在傳統巨型單體應用紛紛轉向細粒度微服務架構的歷史進程中,設定中心是微服務化不可缺少的一個系統元件,在這種背景下中心化的設定服務即設定中心應運而生,一個合格的設定中心需要滿足:
設定項容易讀取和修改
新增新設定簡單直接
支援對設定的修改的檢視以把控風險
可以檢視設定修改的歷史記錄
不同部署環境支援隔離
目前市面上用的比較多的設定中心有:(按開源時間排序)
功能點 | SpringCloudConfig | Apollo | Nacos |
---|---|---|---|
設定實時推播 | 支援(Spring Cloud Bus) | 支援(HTTP長輪詢1s內) | 支援(HTTP長輪詢1s內) |
版本管理 | 支援(Git) | 支援 | 支援 |
設定回滾 | 支援(Git) | 支援 | 支援 |
灰度發佈 | 支援 | 支援 | 不支援 |
許可權管理 | 支援(依賴Git) | 支援 | 不支援 |
多叢集 | 支援 | 支援 | 支援 |
多環境 | 支援 | 支援 | 支援 |
監聽查詢 | 支援 | 支援 | 支援 |
多語言 | 只支援Java | 主流語言, 提供了Open Api | 主流語言, 提供了Open Api |
設定格式校驗 | 不支援 | 支援 | 支援 |
單機讀(QPS) | 7(限流所致) | 9000 | 15000 |
單機寫(QPS) | 5(限流所致) | 1100 | 1800 |
3節點讀(QPS) | 21(限流所致) | 27000 | 45000 |
3節點寫(QPS) | 5(限流所致) | 3300 | 5600 |
總的來看,Apollo和Nacos相對於Spring Cloud Config的生態支援更廣,在設定管理流程上做的更好。Apollo相對於Nacos在設定管理做的更加全面,Nacos則使用起來相對比較簡潔,在對效能要求比較高的大規模場景更適合。但對於一個開源專案的選型,專案上的人力投入(迭代進度、文件的完整性)、社羣的活躍度(issue的數量和解決速度、Contributor數量、社羣的交流頻次等),這些因素也比較關鍵,考慮到Nacos開源時間不長和社羣活躍度,所以從目前來看Apollo應該是最合適的設定中心選型。
Apollo - A reliable configuration management system
https://github.com/ctripcorp/apollo
Apollo(阿波羅)是攜程框架部門研發的分佈式設定中心,能夠集中化管理應用的不同環境、不同叢集的設定,設定修改後能夠實時推播到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務設定管理場景。
Apollo包括伺服器端和用戶端兩部分:
伺服器端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需要額外安裝Tomcat等應用容器。
Java用戶端不依賴任何框架,能夠執行於所有Java執行時環境,同時對Spring/Spring Boot環境也有較好的支援。
基於設定的特殊性,所以Apollo從設計之初就立志於成爲一個有治理能力的設定發佈平臺,目前提供了以下的特性:
操作流程如下:
使用者通過Apollo設定中心修改或發佈設定後,會有兩種機制 機製來保證應用程式來獲取最新設定:一種是Apollo設定中心會向用戶端推播最新的設定;另外一種是Apollo用戶端會定時從Apollo設定中心拉取最新的設定,通過以上兩種機制 機製共同來保證應用程式能及時獲取到設定。
Java
由於需要同時執行伺服器端和用戶端,所以建議安裝Java 1.8+。
MySQL
Apollo的表結構對timestamp使用了多個default宣告,所以需要5.6.5以上版本。
Apollo伺服器端共需要兩個數據庫:ApolloPortalDB
和ApolloConfigDB
,ApolloPortalDB只需要在生產環境部署一個即可,而ApolloConfigDB需要在每個環境部署一套。
soure apollo/ApolloPortalDB_initialization.sql
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
注: ApolloPortalDB只需要在生產環境部署一個即可
source apollo/ApolloConfigDB__initialization.sql
select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-configservice-1.3.0.jar
java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-adminservice-1.3.0.jar
java -Xms256m -Xmx256m -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-portal-1.3.0.jar
echo
set url="localhost:3306"
set username="root"
set password="123"
start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
執行runApollo.bat即可啓動Apollo 待啓動成功後,存取管理頁面(localhost:8070) apollo/admin
ApolloPortalDB
和ApolloConfigDB
pro環境只需要建立ApolloConfigDB
vim apollo-env.properties
dev.meta是第二臺伺服器dev的ip加8080埠, pro.meta是第三臺伺服器pro的ip加8080埠,其餘環境暫時沒有用到
vim application-github.properties
修改portal對應的mysql地址username 和password
進入PortalDB數據庫 修改表格(ServerConfig)
進入到第二臺伺服器中,首先進入configservice的config目錄
vim application-github.properties
修改成dev環境的ApolloConfigDB的數據庫設定
再進入adminservice的config目錄, 修改application-github.properties的數據庫設定
進入到第三臺伺服器, 修改configservice和adminservice的mysql數據庫設定
<dependencies>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.28</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
編寫main方法獲取設定
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
public class GetConfigTest {
//VM Options:
//-Dapp.id=applo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
public static void main(String[] args) {
Config config = ConfigService.getAppConfig();
String someKey = "sms.enable";
//獲取設定資訊, 第一個參數: 設定的key, 第二個參數: 拿不到的話設定的預設值
//如果這樣寫會報警告, 找不到app.id,沒有與Apollo內的專案系結,暫時先通過VM-Options的方式加入
String value = config.getProperty(someKey,null);
System.out.println("sms.enable: " + value);
}
}
修改sms.enable的設定, 再啓動main方法, 發現sms.enable輸出已經改變了
修改程式碼, 讓主方法一直取設定
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import java.time.LocalDateTime;
public class GetConfigTest {
//VM Options:
//-Dapp.id=applo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
public static void main(String[] args) throws InterruptedException {
Config config = ConfigService.getAppConfig();
while(true){
Thread.sleep(1000);
String someKey = "sms.enable";
//獲取設定資訊, 第一個參數: 設定的key, 第二個參數: 拿不到的話設定的預設值
//如果這樣寫會報警告, 找不到app.id,沒有與Apollo內的專案系結,暫時先通過VM-Options的方式加入
String value = config.getProperty(someKey,null);
//列印帶時間的日誌
System.out.printf("now: %s , sms.enable: %s%n " , LocalDateTime.now().toString(), value);
}
}
}
啓動main方法後, 去Apollo管理頁面修改sms.enable的值, 發現設定可以修改並自動生效
上圖簡要描述了Apollo的總體設計,我們可以從下往上看:
apollo預設的部門有兩個. 要增加自己的部門, 可在系統參數中修改:
進入系統參數設定
輸入key查詢以存在的部門設定: organizations
修改value值來新增新部門, 下面 下麪新增一個微服務部門
退出後重新登錄, 可以使之生效
apollo預設提供一個超級管理員: apollo, 可以自行新增使用者
如果想要刪除整個專案, 點選右上角的"管理員工具–> 刪除應用, 叢集"
首先查詢出要刪除的專案, 點選"刪除應用"
下邊在account-service專案中進行設定
點選右側修改按鈕
點選右側刪除按鈕
Namespace作爲設定的分類,可當成一個組態檔。
以新增rocketmq設定爲例,新增「spring-rocketmq」 Namespace設定rocketmq相關資訊。
建立成功後, 會跳轉到針對這個namespace的許可權分配頁面, 可以對某些使用者進行授權
想要獲取到指定namespace下的設定, 需要修改java程式碼
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import java.time.LocalDateTime;
public class GetConfigTest {
//VM Options:
//-Dapp.id=account-service -Denv=DEV -Ddev_meta=http://localhost:8080
public static void main(String[] args) throws InterruptedException {
//讀取預設namespace的設定資訊
//Config config = ConfigService.getAppConfig();
//指定namespace獲取config物件
Config config = ConfigService.getConfig("spring-rocketmq");
while(true){
Thread.sleep(1000);
String someKey = "rocketmq.name-server";
//獲取設定資訊, 第一個參數: 設定的key, 第二個參數: 拿不到的話設定的預設值
//如果這樣寫會報警告, 找不到app.id,沒有與Apollo內的專案系結,暫時先通過VM-Options的方式加入
String value = config.getProperty(someKey,null);
System.out.printf("now: %s , sms.enable: %s%n " , LocalDateTime.now().toString(), value);
}
}
}
在專案開發中,有一些設定可能是通用的,我們可以通過把這些通用的設定放到公共的Namespace中,這樣其他專案要使用時可以直接新增需要的Namespace
3. 新增設定項併發布
spring.http.encoding.enabled = true
spring.http.encoding.charset = UTF-8
spring.http.encoding.force = true
server.tomcat.remote_ip_header = x-forwarded-for
server.tomcat.protocol_header = x-forwarded-proto
server.use-forward-headers = true
server.servlet.context-path = /
在有些情況下,應用有需求對不同的叢集做不同的設定,比如部署在A機房的應用連線的RocketMQ伺服器地址和部署在B機房的應用連線的RocketMQ伺服器地址不一樣。另外在專案開發過程中,也可爲不同的開發人員建立不同的叢集來滿足開發人員的自定義設定。
同步叢集的設定是指在同一個應用中拷貝某個環境下的叢集的設定到目標環境下的目標叢集。
讀取某個叢集的設定,需要啓動應用時指定具體的應用、環境和叢集。
-Dapp.id=應用名稱
-Denv=環境名稱
-Dapollo.cluster=叢集名稱
-D環境_meta=meta地址
-Dapp.id=account-service -Denv=DEV -Dapollo.cluster=SHAJQ -Ddev_meta=http://localhost:8080
在設定中心中,一個重要的功能就是設定發佈後實時推播到用戶端。下面 下麪我們簡要看一下這塊是怎麼設計實現的。
上圖簡要描述了設定發佈的主要過程:
Admin Service在設定發佈後,需要通知所有的Config Service有設定發佈,從而Config Service可以通知對應的用戶端來拉取最新的設定。
從概念上來看,這是一個典型的訊息使用場景,Admin Service作爲producer(生產者)發出訊息,各個Config Service作爲consumer(消費者)消費訊息。通過一個訊息佇列元件(Message Queue)就能很好的實現Admin Service和Config Service的解耦。
在實現上,考慮到Apollo的實際使用場景,以及爲了儘可能減少外部依賴,我們沒有採用外部的訊息中介軟體,而是通過數據庫實現了一個簡單的訊息佇列。
具體實現方式如下:
SELECT * FROM ApolloConfigDB.ReleaseMessage
3. Config Service如果發現有新的訊息記錄,那麼就會通知到所有的訊息監聽器
然後呼叫訊息監聽類的handleMessage方法:NotificationControllerV2
4. NotificationControllerV2得到設定發佈的AppId+Cluster+Namespace後,會通知對應的用戶端
上一節中簡要描述了NotificationControllerV2是如何得知有設定發佈的,那NotificationControllerV2在得知有設定發佈後是如何通知到用戶端的呢?
實現方式如下:
除了之前介紹的用戶端和伺服器端保持一個長連線,從而能第一時間獲得設定更新的推播外,用戶端還會定時從Apollo設定中心伺服器端拉取應用的最新設定。
在微服務架構模式下,專案往往會切分成多個微服務,下面 下麪將以萬信金融P2P專案爲例演示如何在專案中使用。
萬信金融是一款面向網際網路大衆提供的理財服務和個人消費信貸服務的金融平臺,依託大數據風控技術,爲使用者提供方便、快捷、安心的P2P金融服務。本專案包括交易平臺和業務支撐兩個部分,交易平臺主要實現理財服務,包括:借錢、出借等模組,業務支撐包括:標的管理、對賬管理、風控管理等模組。專案採用先進的網際網路技術進行研發,保證了P2P雙方交易的安全性、快捷性及穩定性。
本章節僅僅是爲了演示設定中心,所以摘取了部分微服務,如下:
使用者中心服務(consumer-service):爲借款人和投資人提供使用者賬戶管理服務,包括:註冊、開戶、充值、提現等
UAA認證服務(uaa-service):爲使用者中心的使用者提供認證服務
統一賬戶服務(account-service):對借款人和投資人的登錄平臺賬號進行管理,包括:註冊賬號、賬號許可權管理等
交易中心(transaction-service):負責P2P平臺使用者發標和投標功能
下面 下麪以整合統一賬戶服務(account-service)爲例
參考account-service、transaction-service、uaa-service、consumer-service工程,手動建立這幾個微服務。
每個工程必須新增依賴:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
下邊是account-service依賴,其它工程參考「資料」下的「微服務」。
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pbteach</groupId>
<artifactId>account-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
app:
id: account-service
apollo:
bootstrap:
enabled: true
# namespace中間以,分隔
namespaces: application,micro_service.spring-boot-http,spring-rocketmq,micro_service.spring-boot-druid
env 需要通過VMOPtions來指定
cacheDir, cluster, meta, 都可以通過yml檔案的方式設定, 但是env需要通過指定VMOptions來設定
server:
port: 19082
servlet:
context-path: /gbmp/bdmgmt
spring:
application:
name: account-service
apollo:
bootstrap:
enabled: true
namespaces: application,yuecloud.mybatis,yuecloud.management,yuecloud.logging,yuecloud.pagehelper,yuecloud.datasource,yuecloud.jackson,yuecloud.redis,yuecloud.eureka,yuecloud.securityoauth2
cacheDir: /opt/data/apollo-config
cluster: DEFAULT
meta: http://localhost:8080
app:
id: account-service
在主啓動類上加入註解@EnableApolloConfig
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableApolloConfig
public class AccountMain {
public static void main(String[] args) {
SpringApplication.run(AccountMain.class,args);
}
}
將自己的設定資訊拷貝到apollo中
在Controller上獲取設定@Value方式,在Apollo上點擊發佈會自動重新整理
@ConfigurationProperties(prefix=「dev」)組態檔方式, 需要加@RefreshScope纔會自動重新整理
首先需要加入pom的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
再寫一個設定類,設定重新整理監控類ConfigRefresh
可以把其他微服務的組態檔都放到Apollo上
當一個專案要上線部署到生產環境時,專案的設定比如數據庫連線、RocketMQ地址等都會發生變化,這時候就需要通過Apollo爲生產環境新增自己的設定。
在企業中常用的部署方案爲:Apollo-adminservice和Apollo-configservice兩個服務分別在線上環境(pro),模擬環境(uat)和開發環境(dev)各部署一套,Apollo-portal做爲管理端只部署一套,統一管理上述三套環境。
建立生產環境的ApolloConfigDB:每新增一套環境就需要部署一套ApolloConfgService和ApolloAdminService
source apollo/ApolloConfigDB_PRO__initialization.sql
echo
set url="localhost:3306"
set username="root"
set password="mysqlpwd"
start "configService-PRO" java -Dserver.port=8081 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDBPRO?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
start "adminService-PRO" java -Dserver.port=8091 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDBPRO?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
更新生產環境Apollo的Eureka地址:
USE ApolloConfigDBPRO;
UPDATE ServerConfig SET `Value` = "http://localhost:8081/eureka/" WHERE `key` = "eureka.service.url";
服務設定項統一儲存在ApolloPortalDB.ServerConfig表中,可以通過管理員工具 - 系統參數頁面進行設定:apollo.portal.envs - 可支援的環境列表
預設值是dev,如果portal需要管理多個環境的話,以逗號分隔即可(大小寫不敏感),如:
dev,pro
Apollo Portal需要在不同的環境存取不同的meta service(apollo-configservice)地址,所以我們需要在設定中提供這些資訊。
-Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081/
echo
set url="localhost:3306"
set username="root"
set password="123"
start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
同步完成後,切換到pro環境,修改生產環境rocketmq地址後發佈設定
-Denv=pro -Dapollo.cacheDir=/opt/data/apollo-config -Dapollo.cluster=DEFAULT
灰度發佈是指在黑與白之間,能夠平滑過渡的一種發佈方式。在其上可以進行A/B testing,即讓一部分使用者繼續用產品特性A,一部分使用者開始用產品特性B,如果使用者對B沒有什麼反對意見,那麼逐步擴大範圍,把所有使用者都遷移到B上面來。
apollo-quickstart專案有兩個用戶端:
啓動apollo-quickstart專案的GrayTest類輸出timeout的值
public class GrayTest {
// VM options:
// -Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
public static void main(String[] args) throws InterruptedException {
Config config = ConfigService.getAppConfig();
String someKey = "timeout";
while (true) {
String value = config.getProperty(someKey, null);
System.out.printf("now: %s, timeout: %s%n", LocalDateTime.now().toString(), value);
Thread.sleep(3000L);
}
}
}
如果灰度的設定測試下來比較理想,符合預期,那麼就可以操作全量發佈。
全量發佈的效果是:
如果灰度版本不理想或者不需要了,可以點選放棄灰度
點選主版本的發佈歷史按鈕,可以看到當前namespace的主版本以及灰度版本的發佈歷史
現在在203節點上通過修改組態檔的方式, 改成DEV環境下的叢集, 202和203應該共用一套mysql的ConfigServiceDB