一.Nacos配置管理
Nacos不僅可以作為注冊中心,可以進行配置管理
1.1 統一配置管理
統一配置管理可以實現配置的熱更新(即不用重啟當服務發生變更時也可以直接更新)
dataId格式:服務名-環境名.yaml,分組一般使用默認即可,配置內容只寫有熱更新需求的配置
1.2 拉取配置文件
在沒有nacos配置文件時,項目啟動順序為:
項目啟動>>>讀取本地配置文件>>>創建spring容器>>>加載bean
在有nacos配置文件之后,項目啟動順序為:
項目啟動>>>讀取nacos配置文件>>>讀取本地配置文件>>>創建spring容器>>>加載bean
此時出現了一個問題:**讀取nacos配置文件需要知道nacos配置文件的地址,而這個地址應該在application.yml中,這是否造成了沖突?**因此需要將nacos配置的地址提前,此時使用bootstrap.yml引導文件,該文件的優先級還要高于application.yml
執行步驟
1.在相應的服務中導入依賴比如user-service:
<!--nacos配置管理依賴-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.導入并編寫bootstrap.yml(該引導文件中會指明nacos配置文件所在位置)
spring:application:name: userserviceprofiles:active: dev # 環境cloud:nacos:server-addr: localhost:8848 # nacos地址config:file-extension: yaml # 文件后綴名
3.刪除application.yml中與bootstrap.yml中重復的配置
# application:
# name: userservice # user服務名稱
# cloud:
# nacos:
# server-addr: localhost:8848 # nacos服務地址
# discovery:
# cluster-name: SH # 集群名稱
4.驗證是否真的讀取到nacos配置文件:
在UserController中添加內容:
@Value("${pattern.dateformat}") //讀取nacos配置文件中的內容,并將內容注入到dateformat中;private String dateformat;@GetMapping("/now")public String now(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}
修改之后啟動user-service,訪問http://localhost:8081/user/now,結果:
1.3 配置文件熱更新
Nacos中的配置文件變更之后,微服務無需重啟就可以感知。不過需要通過下面2種配置實現:
方式一
??在@Value注入的變量所在類上添加注解@RefreshScope
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {@Autowiredprivate UserService userService;@Value("${pattern.dateformat}")private String dateformat;@GetMapping("/now")public String now(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}
}
修改之前
熱更新之后:
方式二
使用@ConfigurationProperties(prefix = “pattern”)注解,單獨配置一個屬性類,讀取配置文件中的內容:
1.新建config.PatternProperties屬性類
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;
}
2.將PatternProperties bean注入到UserController中:
@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate PatternProperties patternProperties;// @Value("${pattern.dateformat}")
// private String dateformat;@GetMapping("/now")public String now(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));}
}
最終實現效果同上
1.4 配置管理-多環境配置共享
微服務啟動時會從nacos讀取多個配置文件:
- [spring.application.name]-[spring-profiles.active].yaml,例如userservice-dev.yaml,這個是區分環境的。
- [spring.application.name].yaml,例如userservice.yaml,這個不區分環境,多環境共性。
無論profiles如何變化,[spring.application.name].yaml該文件一定會被加載,因此多環境共享分配置可以寫入這個文件。
執行步驟
1.添加共享配置
2.采用第二種方式讀入nacos配置文件屬性
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;private String envShareValue;
}
編寫測試接口
@GetMapping("/prop")
public PatternProperties prop(){return patternProperties;
}
重啟配置類,訪問結果:dev
訪問結果:test
配置文件訪問優先級
1.5 配置管理-nacos集群搭建
nacos在生產環境中必定是集群形式,搭建集群的基本步驟:
- 搭建數據庫,初始化數據庫表結構
- 下載nacos安裝包
- 配置nacos
- 啟動nacos集群
- nginx反向代理
1.新建數據庫nacos,初始化數據庫表結構(如果你使用的其他版本的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 '創建時間',`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';/******************************************/
/* 數據庫全名 = 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 '內容',`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='增加租戶字段';/******************************************/
/* 數據庫全名 = 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 '創建時間',`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';/******************************************/
/* 數據庫全名 = 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 '創建時間',`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';/******************************************/
/* 數據庫全名 = 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';/******************************************/
/* 數據庫全名 = 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 '單個配置大小上限,單位為字節,0表示使用默認值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數,,0表示使用默認值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數據的子配置大小上限,單位為字節,0表示使用默認值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`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容量信息表';/******************************************/
/* 數據庫全名 = 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='多租戶改造';/******************************************/
/* 數據庫全名 = 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 '單個配置大小上限,單位為字節,0表示使用默認值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數據的子配置大小上限,單位為字節,0表示使用默認值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`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 '創建時間',`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');
2.安裝nacos(略)
3.配置nacos(由于是集群,所以我們配置多份),配置多份可以采用解壓一次,配置一次,復制兩份,再依次修改。(因為內存吃緊的原因,我用2個nacos作為集群;)
- 將nacos/conf/cluster.conf.example重命名為cluster.conf,然后修改為,表示2臺機器(這里是只有一臺機器所以用兩個不同的端口號來模擬兩臺機器,注意盡量使用你的本機IP地址),cmd》》ipconfig可以查看本機IP地址。我的本機IP地址為10.81.62.166,所以cluster.conf中寫的內容是:
10.81.62.166:8848
10.81.62.166:8858
- 修改nacos/conf/application.properties,添加數據庫配置
1.打開數據源
spring.datasource.platform=mysql
2.指定數據庫的數量
db.num=1
3.指定數據庫連接信息
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=你的密碼
4.將nacos文件夾復制2份
5.分別修改三個nacos中的application.properties中的server-port,server-port對應的是你在cluster.conf中配置的內容,比如讓nacos1中的server-port=8848,讓nacos2中的server-port=8858。
6.啟動startup.cmd,這次是集群啟動(默認),區別之前的單點啟動,共同點是都要進入bin目錄再打開cmd窗口.注意目錄中不能出現中文目錄。
//單點啟動
startup.cmd -m standalone
//集群啟動
startup.cmd
nacos1集群啟動效果:
nacos2集群啟動效果:
可能遇到的問題1
由于vmware虛擬網卡的存在,nacos啟動時會獲取虛擬網卡的IP地址而不會讀取cluster.conf中IP地址。我之前明明配置好了IP地址,但是一直讀取的確實192.168.11.11這個地址,后來發現這是一個虛擬網卡IP地址,于是禁用了虛擬網絡,恢復了正常。
7.配置nginx
- 將Nginx解壓到一個沒有中文的目錄
- 修改conf/nginx.conf文件,配置如下,將如下配置內容復制到conf/nginx.conf中的任何一個位置即可(只要包含在http下):
upstream nacos-cluster {server 10.81.62.166:8848;server 10.81.62.166:8858;}server {listen 8088;server_name localhost;location /nacos {proxy_pass http://nacos-cluster;}}
可能遇到的問題2
nginx進行反向代理的配置時,一個http中只能有一個server{},所以像視頻中老師那樣直接復制進去是不行的,需要刪除之前的server即可。保存之后重啟nginx,打開對應的端口。
Nacos集群啟動成功
8.修改代碼中配置文件
由于部署了集群,因此訪問地址發生了變更,修改bootstrap.yml文件中server-addr為nginx監聽端口
spring:cloud:nacos:server-addr: localhost:8088 # nacos地址