SpringCloud06_Nacos配置管理

59 阅读7分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情


⭐️前面的话⭐️

✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee


springcloud实用篇二

六、Nacos配置管理

 # 将配置交给Nacos管理的步骤
 ​
 - 在Nacos中添加配置文件
 - 在微服务中引入nacos的config依赖
 - 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件
 ​
 # Nacos配置更改后,微服务可以实现热更新,2种方式
 - 通过@Value注解注入,结合@RefreshScope来刷新
 - 通过@ConfigurationProperties注入,自动刷新
 ​
 # 注意事项
 - 不是所有的配置都适合放到配置中心,维护起来比较麻烦
 - 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
 ​
 ​

1 统一配置管理

image-20211212093955308

Nacos实现配置管理

在Nacos中添加配置信息

在弹出表单中填写配置信息

微服务配置拉取

(1)引入Nacos的配置管理客户端依赖

 <!--nacos的配置管理依赖-->
 <dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

(2)在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml

 spring:
   application:
     name: userservice
   profiles:
     active: dev # 环境
   cloud:
     nacos:
       server-addr: localhost:8848 # nacos地址
       config:
         file-extension: yaml # 文件后缀名

(3)我们在user-service中将 pattern.dateformat 这个属性注入到UserController中做测试

 @RestController
 @RequestMapping("/user")
 public class UserController {
     
     // 注入nacos中的配置属性
     @Value("${pattern.dateformat}")
     private String dateformat;
     
     // 编写controller,通过日期格式化器来格式化现在时间并返回
     @GetMapping("now")
     public String now(){
         return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
     }
 }

2 配置热更新

Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:

方式一:在@Value注入的变量所在类上添加注解 @RefreshScope

 @Slf4j
 @RestController
 @RequestMapping("/user")
 @RefreshScope
 public class UserController {
 ​
     @Value("${pattern.dateformat}")
     private String dateformat;

方式二:使用 @ConfigurationProperties注解(推荐)

 @Data
 @Component
 @ConfigurationProperties(prefix = "pattern")
 public class PatternProperties {
     private String dateformat;
     private String envSharedValue;
     private String name;
 }

3 多环境配置共享

微服务启动时会从nacos读取多个配置文件:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml,环境配置
  • [spring.application.name].yaml,例如:userservice.yaml,默认配置,多环境共享

无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件

多种配置的优先级:[服务名]-[环境].yaml >[服务名].yaml > 本地配置

不同微服务之间可以共享配置文件,通过下面的两种方式来指定:

多种配置的优先级:

 # 微服务默认读取的配置文件:
     [服务名]-[spring.profile.active].yaml,默认配置
     [服务名].yaml,多环境共享
 # 不同微服务共享的配置文件:
     通过shared-configs指定
     通过extension-configs指定
 # 优先级:
     环境配置 >服务名.yaml > extension-config > extension-configs > shared-configs > 本地配置

4 搭建Nacos集群

 # 搭建步骤
 ​
 - 搭建数据库,初始化数据库表结构
 - 下载nacos安装包
 - 配置nacos
 - 启动nacos集群
 - nginx反向代理

1)初始化数据库

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。

官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考传智教育的后续高手课程。

这里我们以单点的数据库为例来讲解。

首先新建一个数据库,命名为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(可以选择任意版本下载。本例中采用1.4.1版本。)

github.com/alibaba/nac…

3)配置nacos

 1.解压 
 - bin:启动脚本  
 - conf:配置文件
 ​
 2.进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为 `cluster.conf`
 然后添加内容
 127.0.0.1:8845
 127.0.0.1.8846
 127.0.0.1.8847
  1. 然后修改application.properties文件,添加数据库配置
 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=123456

4)启动

将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3

然后分别修改三个文件夹中的application.properties

nacos1:

 server.port=8845

nacos2:

 server.port=8846

nacos3:

 server.port=8847

然后分别启动三个nacos节点:

 startup.cmd

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;
     }
 }