Nacos配置中心
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
启动微服务时的流程:如图
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
bootstrap.yaml文件的优先级高于application.yaml

设置配置中心
1、设置Nacos配置文件
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

然后在弹出的表单中,填写配置信息:
Data Id命名规则:[服务名称]-[profile].[后缀名] 如:userservice-dev.yaml 一定要遵守

2、配置微服务
①微服务都要导入依赖
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- </dependency>
复制代码 ②添加bootstrap.yaml
这里的取名一定要和nacos配置的一样
- spring:
- application:
- name: userservice # 服务名称
- profiles:
- active: dev #开发环境,这里是dev
- cloud:
- nacos:
- server-addr: localhost:8848 # Nacos地址
- config:
- file-extension: yaml # 文件后缀名
复制代码 这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml:

③业务中读取nacos配置中心的配置
这里的读取都实现了配置热更新,即更新nacos配置文件无需重启服务
有两种方式,二选一即可。
- 方式一:@RefreshScope
- 使用@Value注解得到nacos配置文件信息
- 在@Value注入的变量所在类上添加注解@RefreshScope
- 使用nacos配置文件信息完成业务

- 方式二:@ConfigurationProperties注解代替@Value注解【推荐】
- 创建一个配置类,在类上面加入@Component @Data @ConfigurationProperties
!!!注意:这里的prefix="变量是配置文件中的前缀名",String dateformat需要取名和配置文件中一致
nacos配置文件:
 - 配置类:
- ```java
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- @Component //作用:讲从nacos中读取到的信息写成对象并注入到spring容器
- @Data //作用:在业务类注入该类即可调用其中的信息
- @ConfigurationProperties(prefix = "pattern") //读取Nacos配置文件的patterrn.dateformat属性
- public class PatternProperties {
- private String dateformat;
- }
- ```
复制代码
- 业务中注入nacos配置文件类,并调用配置信息完成业务
- @Slf4j
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private PatternProperties patternProperties;
- @GetMapping("now")
- public String now(){
- return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
- }
- }
复制代码 设置配置共享
引入:有些配置在开发和测试环境都是一样的就可以使用配置共享
其实微服务启动时,会去nacos读取多个配置文件,例如:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。(即[spring.application.name]这个名字下的所有环境都会读取到该配置文件)
举例:有两个服务分别配置在userservice的dev和test环境运行;此时在nacos配置了一个userservice.yaml 和 userservice-dev.yaml;
结果:两个服务都能读到userservice.yaml、但只有dev环境的才可以读到userservice-dev.yaml
1. 配置共享的优先级
当nacos、服务本地同时出现相同属性时,优先级有高低之分:nacos的局部 > nacos全局 > 服务本地
【当有相同配置的时候优先级高的覆盖低的】

搭建Nacos集群
注意:搭建集群后,服务访问的nacos接口就改成访问nginx的接口。 如nginx是80接口,那服务的bootstrap.yaml配置文件访问nacos的接口改成80
1.集群结构图
官方给出的Nacos集群图:

其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:

三个nacos节点的地址:
节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.188472.搭建集群
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
2.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.2.下载nacos
nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。
本例中才用1.4.1版本:

2.3.配置Nacos
将这个包解压到任意非中文目录下,如图:

目录说明:
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:

然后添加内容:如果里面有ip地址就删除换成如下(在生产环境就需要改成服务器地址)- 127.0.0.1:8845
- 127.0.0.1.8846
- 127.0.0.1.8847
复制代码 然后修改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=123
复制代码 2.4.启动
将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3

然后分别修改三个文件夹中的application.properties,
nacos1:nacos2:nacos3:然后分别启动三个nacos节点:2.5.nginx反向代理
找到课前资料提供的nginx安装包:

解压到任意非中文目录下:

修改conf/nginx.conf文件,添加配置如下:添加到http内部- 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;
- }
- }
复制代码 在nginx.exe的目录下打开cmd启动nginx:start nginx.exe ;而后在浏览器访问:http://localhost/nacos即可。
2.6 服务端该端口
所有服务的代码中bootstrap.yaml/application.yml文件配置如下:- spring:
- cloud:
- nacos:
- server-addr: localhost:80 # Nacos地址
复制代码 2.7.优化
- 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.
- Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |