前言:為什么要統(tǒng)一配置管理
在微服務(wù)架構(gòu)中,配置管理是一個至關(guān)重要的問題。隨著系統(tǒng)規(guī)模的擴大,配置的管理和更新變得更加繁瑣。Nacos 作為一個全能的服務(wù)發(fā)現(xiàn)和配置管理平臺,為解決這一問題提供了全方位的支持。在本文中,我們將深入理解 Nacos 的配置管理,包括配置的統(tǒng)一管理、熱更新、多環(huán)境配置共享以及Nacos集群的搭建。
一、Nacos 的配置管理
1.1 在 Nacos 中添加配置文件
Nacos 提供了直觀的 Web 界面,使得我們可以輕松地添加和管理配置文件。通過 Web 界面,我們可以為不同的微服務(wù)添加對應的配置信息,包括數(shù)據(jù)庫連接、端口號等。
下面將演示如何在 Nacos 的控制臺上添加新的配置文件:
-
首先在 Nacos 的控制臺中點擊配置管理,然后選擇右側(cè)的加號添加新的配置:
-
然后設(shè)置以下配置信息,最后點擊發(fā)布:
在這個配置信息中,指定了 Data ID 為 userservice-dev.yml
,并在配置內(nèi)容中設(shè)置了一個日期的格式。
關(guān)于 Data ID 命名格式的說明:
- 首先要確保 Data ID 的唯一性,使用具體的服務(wù)名稱就可確保唯一性;
- 采用
Servicename-profile
的格式,其中profile
代表的是目前服務(wù)的運行環(huán)境,如dev
。 - 配置文件可采用多種類型,如
yml
、properties
等,根據(jù)不同格式的配置,Data ID 的后綴名也會不同。例如,使用userservice-dev.yml
作為 Data ID 表示該配置文件為 YAML 格式。
關(guān)于配置內(nèi)容的說明:
配置內(nèi)容通常包含了應用程序的參數(shù)、設(shè)置、以及其他與應用程序運行有關(guān)的信息。這些配置信息可能包括但不限于:
-
數(shù)據(jù)庫連接信息: 包括數(shù)據(jù)庫的URL、用戶名、密碼等。
-
服務(wù)端口號: 應用程序運行的端口,用于處理外部請求。
-
第三方服務(wù)的地址和密鑰: 與其他服務(wù)進行交互時所需的信息。
-
日志級別和格式: 控制應用程序日志輸出的詳細程度和格式。
-
緩存策略: 配置緩存的大小、過期時間等相關(guān)參數(shù)。
-
安全配置: 包括認證和授權(quán)相關(guān)的配置信息。
-
任務(wù)調(diào)度配置: 配置定時任務(wù)的執(zhí)行策略和參數(shù)。
-
其他運行時參數(shù): 如線程池大小、連接超時等。
配置內(nèi)容的特點在于它們是經(jīng)常需要變化的,而不同環(huán)境下的配置可能也有所不同。因此,合理管理和更新配置信息對于應用程序的靈活性和可維護性至關(guān)重要。通過使用Nacos等配置中心,可以實現(xiàn)配置信息的集中管理、動態(tài)更新,從而更好地適應應用程序的不斷變化。
1.2 微服務(wù)獲取配置
在微服務(wù)應用中,獲取配置信息是一個關(guān)鍵的任務(wù)。配置信息包括數(shù)據(jù)庫連接、服務(wù)端口、第三方服務(wù)的地址、日志設(shè)置等等,這些信息對于應用程序的正確運行至關(guān)重要。在沒有 Nacos 配置時和有 Nacos 配置時,微服務(wù)獲取配置信息的過程有所不同。
1.2.1 沒有 Nacos 配置的情況下
在沒有Nacos配置中心的情況下,微服務(wù)獲取配置信息的步驟如下圖所示:
說明:
- 當項目啟動時,應用程序會讀取本地的配置文件,這些配置文件通常存儲在類路徑中,例如
application.properties
或application.yml
。 - 隨后,應用程序會根據(jù)配置文件中的內(nèi)容創(chuàng)建Spring容器,加載相關(guān)的Bean對象。
- 當應用程序需要獲取配置信息時,它會直接從Spring容器中獲取。
1.2.2 有 Nacos 配置的情況下
在有 Nacos 配置中心的情況下,微服務(wù)獲取配置信息的步驟如下圖所示:
說明:
- 在有 Nacos 配置的情況下,首先需要知道 Nacos 配置中心的地址以及配置文件的信息。這些信息通常存儲在應用程序的
bootstrap.yml
或bootstrap.properties
中。 - 當項目啟動后,應用程序會先讀取
bootstrap.yml
中的配置,獲取 Nacos 配置中心的地址和其他必要信息。 - 隨后,應用程序會連接到 Nacos 配置中心,獲取配置信息。這些配置信息包括數(shù)據(jù)庫連接、第三方服務(wù)的地址、日志設(shè)置等。
- 在獲取 Nacos 配置信息之后,應用程序會再次讀取本地的配置文件,例如
application.properties
或application.yml
。 - 最終,應用程序會將 Nacos 配置和本地配置合并,創(chuàng)建 Spring 容器,加載相關(guān)的 Bean 對象。
在有 Nacos 配置中心的情況下,Nacos 充當了集中式的配置管理中心,使得微服務(wù)可以動態(tài)獲取配置信息并實現(xiàn)配置的集中管理,從而提高了靈活性和可維護性。
1.3 本地配置文件的修改
- 引入 Nacos 的配置管理客戶端依賴:
<!--nacos配置管理依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在
user-service
中的resource
目錄下添加一個bootstrap.yml
文件,這個文件是引導文件,優(yōu)先級高于application.yml
:
spring:
application:
name: userservice # 服務(wù)名稱
profiles:
active: dev #開發(fā)環(huán)境,這里是 dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos 地址
config:
file-extension: yaml # 文件后綴名
當新增了 bootstrap.yml
配置文件之后,就可以將application.yml
重復的配置項刪除掉。
1.4 代碼獲取配置信息
當所有的配置都修改完成之后,如何證明配置成功了呢?此時就可以使用代碼來讀取,看看能否讀取到 Nacos 中添加的配置信息。讀取配置信息可以使用 @Value
注解讀取。
例如,修改 UserController
中的代碼如下:
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
然后重啟服務(wù)器,使用瀏覽器訪問 now
這個接口:
成功輸出了時間,說明 Nacos 中新增的配置也成功生效了。
二、配置文件的熱更新
2.1 修改配置文件
此時,如果我們想要修改 Nacos 中的配置內(nèi)容,比如修改日期的格式如下:
當修改完成之后,再次通過瀏覽器訪問,發(fā)現(xiàn)并沒有生效:
如果重啟 user-service
服務(wù),再次通過瀏覽器訪問才生效了:
但是如果想要修改了配置文件之后立馬就生效,并且在實際生產(chǎn)環(huán)境中,也不能因為修改一點配置信息就重啟服務(wù)器吧,那么此時又該然如何操作呢?
2.2 設(shè)置配置文件熱更新
要達到這個目的,就需要使用到配置文件的熱更新,即 Nacos 中的配置文件變更后,微服務(wù)無需重啟就可以感知。在代碼中,有兩種實現(xiàn)配置文件熱更新的方法:
方式一: 在 @Value
注入的變量所在類上添加注解 @RefreshScope
注解
添加完注解之后,重啟微服務(wù),當前訪問輸出的時間格式如下:
然后,再次修改 Nacos 的配置文件中的時間格式:
此時并沒有重啟微服務(wù),直接通過瀏覽器訪問,其輸出的時間格式如下,和剛修改的格式相匹配,則說明熱更新配置成功了:
并且此時,user-service
的控制臺也會輸出相關(guān)配置文件相關(guān)的信息:
方式二:使用 @ConfigurationProperties
注解
使用@ConfigurationProperties
注解時,會把從配置文件中讀取到的內(nèi)容封裝到一個對象中,因此首先需要創(chuàng)建一個類:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
然后修改 UserController
中的代碼,并注釋掉方式一的相關(guān)代碼:
@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
重啟微服務(wù),此時訪問瀏覽器輸出的時間格式如下:
然后再次修改Nacos配置文件中的日期格式:
此時并沒有重啟微服務(wù),直接通過瀏覽器訪問,其輸出的時間格式如下,和剛修改的格式相匹配,則說明熱更新配置成功了:
三、多環(huán)境配置共享
在微服務(wù)應用中,通常需要在不同的環(huán)境(開發(fā)、測試、生產(chǎn)等)下使用不同的配置信息。但如果在多個環(huán)境中的配置內(nèi)容是相同的,為了避免重復配置,可以實現(xiàn)多環(huán)境配置文件的共享。Nacos提供了一種簡單而有效的方式來實現(xiàn)這一目標。
3.1 共享配置文件命名
3.1 共享配置文件命名
在微服務(wù)啟動時,從 Nacos 中讀取多個配置文件時,采用以下命名規(guī)范:
-
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml
-
[spring.application.name].yaml
,例如:userservice.yaml
不論 spring.profiles.active
如何變化,[spring.application.name].yaml
這個文件都會被加載。因此,多環(huán)境共享的配置可以寫入這個文件中。
示例:
假設(shè) spring.application.name
為 userservice
,則對應的配置文件命名如下:
-
userservice.yaml
:共享配置文件,包含所有環(huán)境通用的配置。
server:
port: 8080
database:
url: jdbc:mysql://localhost:3306/userservice
username: admin
password: admin123
-
userservice-dev.yaml
:開發(fā)環(huán)境配置文件,覆蓋需要變更的配置項。
spring:
profiles:
active: dev
database:
url: jdbc:mysql://localhost:3306/userservice_dev
-
userservice-test.yaml
:測試環(huán)境配置文件,同樣覆蓋需要變更的配置項。
spring:
profiles:
active: test
database:
url: jdbc:mysql://testdb:3306/userservice_test
這樣的命名規(guī)范使得在不同環(huán)境下維護配置變得更加清晰和方便,同時確保了在多環(huán)境中可以共享相同的配置信息。
3.2 設(shè)置多環(huán)境配置文件共享
在 Nacos 的環(huán)境列表中新增一個配置文件userservice.yaml
:
當添加完共享配置文件之后,再次修改 PatternProperties
類和UserController
來讀取共享配置信息:
PatternProperties
類:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
}
UserController
類:
@GetMapping("prop")
public PatternProperties properties(){
return properties;
}
然后重啟這個user-service
服務(wù),注意這個服務(wù)當前的環(huán)境是dev
環(huán)境,對應的端口號是 8081。
另外,再開啟一個user-service
服務(wù),端口號為 8082,使其處于test
環(huán)境,但并不用在創(chuàng)建一個配置文件,直接通過IDEA進行設(shè)置即可:
由于并沒有創(chuàng)建test
環(huán)境的配置文件,因此可以推測 8082 端口對應的服務(wù)除了共享環(huán)境變量外的其他字段都應該為null
。
分別訪問這兩個服務(wù)的prop
接口,結(jié)果如下:
至此,便成功實現(xiàn)了配置文件的共享。
3.3 配置文件的優(yōu)先級
如果當不同的配置文件擁有不同的屬性時,配置文件的優(yōu)先級有是怎么樣的呢?其實這個問題可以很容易的找出答案。那就是中不同的配置文件中設(shè)置相同的屬性,看看最終的結(jié)果以哪個為準就能夠得出優(yōu)先級的關(guān)系了。
- 首先在本地的配置文件
application.yml
文件中新增以下內(nèi)容:
并修改PatternProperties
代碼:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
private String name;
}
此時毫無疑問讀取到的就是本地配置,因為 Nacos 中并沒有配置這個屬性。
- 然后在 Nacos 的
userservice.yaml
配置文件中設(shè)置這個屬性
刷新瀏覽器,發(fā)現(xiàn)是以共享配置文件為準,因此得出結(jié)論是Nacos的共享配置文件的優(yōu)先級大于本地配置文件。
- 接著也在
userservice-dev.yaml
中也設(shè)置這個屬性
刷新瀏覽器,發(fā)現(xiàn)是以Nacos的開發(fā)配置文件為準,因此得出結(jié)論是 Nacos 開發(fā)環(huán)境配置文件的優(yōu)先級大于共享配置文件。
綜上所述,不同的配置文件的優(yōu)先級關(guān)系如下:
- 服務(wù)名-profile.yaml >服務(wù)名稱.yaml > 本地配置
更詳細地,在 Nacos 配置管理中,不同來源的配置文件有不同的優(yōu)先級。優(yōu)先級從高到低排列如下:
-
環(huán)境配置(Profile): 環(huán)境配置具有最高優(yōu)先級。當在Nacos中使用
[spring.application.name]-[spring.profiles.active].yaml
格式命名的配置文件時,其中的spring.profiles.active
將指定當前環(huán)境,優(yōu)先級最高。 -
服務(wù)名.yaml: 使用
[spring.application.name].yaml
格式命名的配置文件,其中的spring.application.name
即服務(wù)名。這是服務(wù)級別的通用配置,具有較高優(yōu)先級。 -
extension-config: 通過Nacos配置中心的
Data ID
中的extension-config
配置項獲取的配置。這個配置項通常用于擴展配置,例如定制化的業(yè)務(wù)配置。 -
extension-configs: 通過Nacos配置中心的
Data ID
中的extension-configs
配置項獲取的配置。這個配置項也用于擴展配置,但具有比單獨的extension-config
更低的優(yōu)先級。 -
shared-configs: 通過Nacos配置中心的
Data ID
中的shared-configs
配置項獲取的配置。這個配置項通常用于共享配置,例如團隊內(nèi)部約定的通用配置。 -
本地配置: 本地配置是在應用程序中直接指定的配置項,具有最低的優(yōu)先級。這包括在應用程序的配置文件(如
application.yml
或application.properties
)中定義的配置項。
優(yōu)先級示例:
假設(shè)有一個微服務(wù)名為 userservice
,當前環(huán)境為 dev
,那么優(yōu)先級順序為:
-
userservice-dev.yaml
(環(huán)境配置) >userservice.yaml
(服務(wù)名.yaml) >extension-config
>extension-configs
>shared-configs
> 本地配置
這個優(yōu)先級規(guī)則確保了在不同層次和來源的配置中,能夠靈活地管理和覆蓋配置項,從而實現(xiàn)更精細化的配置控制。
四、Nacos 集群搭建
搭建 Nacos 集群是確保系統(tǒng)可用性和容錯性的關(guān)鍵步驟。通過集群部署,可以分攤負載、提高系統(tǒng)的并發(fā)處理能力,并在某一節(jié)點發(fā)生故障時保持系統(tǒng)的正常運行。
以下是 Nacos 集群搭建的基本步驟:
- 搭建數(shù)據(jù)庫,初始化數(shù)據(jù)庫表結(jié)構(gòu)
- 下載 nacos 安裝包
- 配置 nacos
- 啟動 nacos 集群
- nginx 反向代理
下面是詳解的搭建過程。
4.1 集群結(jié)構(gòu)圖
官方給出的 Nacos 集群圖:
其中包含3個 nacos 節(jié)點,然后一個負載均衡器代理 3 個 Nacos。這里負載均衡器可以使用 nginx。
計劃搭建的集群結(jié)構(gòu):
三個 nacos 節(jié)點的地址:
節(jié)點 | IP | PORT |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
4.2 初始化數(shù)據(jù)庫
Nacos 默認數(shù)據(jù)存儲在內(nèi)嵌數(shù)據(jù)庫 Derby 中,不屬于生產(chǎn)可用的數(shù)據(jù)庫。
官方推薦的最佳實踐是使用帶有主從的高可用數(shù)據(jù)庫集群,但是這里以單點的數(shù)據(jù)庫為例。
首先新建一個數(shù)據(jù)庫,命名為 nacos,而后導入下面的 SQL:
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '內(nèi)容',
`gmt_modified` datetime NOT NULL COMMENT '修改時間',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租戶字段';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整個集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用默認值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為字節(jié),0表示使用默認值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數(shù),,0表示使用默認值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數(shù)據(jù)的子配置大小上限,單位為字節(jié),0表示使用默認值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數(shù)量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租戶改造';
/******************************************/
/* 數(shù)據(jù)庫全名 = nacos_config */
/* 表名稱 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用默認值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為字節(jié),0表示使用默認值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數(shù)',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數(shù)據(jù)的子配置大小上限,單位為字節(jié),0表示使用默認值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數(shù)量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租戶容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '創(chuàng)建時間',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
4.3 配置 Nacos
進入 nacos 的 conf 目錄,修改配置文件 cluster.conf.example
,重命名為cluster.conf
:
然后添加地址:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
然后修改 application.properties 文件,添加數(shù)據(jù)庫配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
4.4.啟動
將nacos文件夾復制三份,分別命名為:nacos1、nacos2、nacos3
然后分別修改三個文件夾中的application.properties,
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
然后分別啟動三個nacos節(jié)點:
startup.cmd
4.5.nginx反向代理
將 nginx 安裝到非中文目錄下:
修改conf/nginx.conf
文件,配置如下:
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
而后在瀏覽器訪問:http://localhost/nacos
即可。
代碼中application.yml
文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
4.6.優(yōu)化
-
實際部署時,需要給做反向代理的nginx服務(wù)器設(shè)置一個域名,這樣后續(xù)如果有服務(wù)器遷移nacos的客戶端也無需更改配置.文章來源:http://www.zghlxwxcb.cn/news/detail-785062.html
-
Nacos的各個節(jié)點應該部署到多個不同服務(wù)器,做好容災和隔離文章來源地址http://www.zghlxwxcb.cn/news/detail-785062.html
到了這里,關(guān)于【Spring Cloud】深入理解 Nacos 的統(tǒng)一配置管理,配置熱更新,多環(huán)境配置共享,集群搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!