Nacos 配置管理
# Nacos 配置管理
除了作为注册中心,Nacos 还可以用作配置管理,统一管理微服务的配置文件,简化配置的维护和更新。
# 1. 统一配置管理
随着微服务实例数量的增加,逐个手动修改配置文件变得繁琐且容易出错。Nacos 提供了一种集中式的配置管理方案,能够统一管理所有实例的配置,避免重复操作。
注意:只有核心配置和需要热更新的配置才有放到 Nacos 中管理的必要。稳定且不常变更的配置建议仍然保存在微服务本地。
# 1.1 从微服务拉取配置
微服务从 Nacos 中获取配置的流程如下:
为了让微服务在启动时能够拉取 Nacos 中的配置,并与本地的 application.yml
合并,Spring 引入了一个新的配置文件 bootstrap.yaml
。该文件在 application.yml
之前被读取,流程如下:
# 1.2 配置步骤
- 引入 Nacos 配置管理依赖
首先,在 user-service
服务中,引入 Nacos Config 客户端依赖:
<!-- Nacos 配置管理依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2
3
4
5
说明:该依赖使得微服务能够通过 Nacos 获取配置文件,并支持配置的动态更新。
- 添加
bootstrap.yaml
接下来,在 user-service
中添加一个 bootstrap.yaml
文件,内容如下:
spring:
application:
name: userservice # 服务名称,用于生成配置文件的标识
profiles:
active: dev # 激活的环境,这里是开发环境 dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos 服务器地址
config:
file-extension: yaml # 指定配置文件的格式,这里使用 yaml
2
3
4
5
6
7
8
9
10
在使用 Nacos 作为配置中心时,微服务会通过配置的 spring.application.name
(服务名称)、spring.profiles.active
(激活的环境)和 spring.cloud.nacos.config.file-extension
(文件格式)来组合出在 Nacos 中的配置文件 ID。
根据以上配置,Nacos 中的配置文件 ID 会是:userservice-dev.yaml
读取流程
- 服务启动时,Spring Boot 会先加载
bootstrap.yaml
,在其中读取 Nacos 的配置地址(spring.cloud.nacos.server-addr
)以及服务的基本信息(如服务名称、环境和文件格式)。 - 服务连接 Nacos 后,会根据组合的配置文件 ID(如
userservice-dev.yaml
)去 Nacos 中拉取相应的配置。 - Nacos 返回配置内容,服务将这些配置与本地的
application.yml
配置合并后完成启动。
在 Nacos 中,配置文件的 ID 就是 userservice-dev.yaml
,也就是 Nacos 控制台中配置文件的文件名。这个文件名在 Nacos 控制台中可以看到,如下图所示:
- 读取 Nacos 中的配置
可以通过 @Value
注解从 Nacos 配置中读取内容。在 UserController
中添加业务逻辑,从配置中读取 pattern.dateformat
的值:
完整代码如下:
package cn.itcast.user.web;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 从 Nacos 配置中读取日期格式
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
// 返回当前时间,并按照 Nacos 配置中的日期格式格式化输出
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
// ...省略其他业务代码
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
重点说明:
- 使用
@Value("${pattern.dateformat}")
从 Nacos 配置中读取日期格式。- 请确保使用的是 Spring Boot 的
@Value
注解,而不是 Lombok 的注解。
- 页面访问效果
启动 user-service
后,通过浏览器访问 http://localhost:8081/user/now
,可以看到如下效果:
# 2. 配置热更新
使用 Nacos 作为配置中心的一个重要功能就是支持配置热更新。当我们在 Nacos 中修改配置时,无需重启微服务即可使配置生效。
# 2.1 场景回顾
我们先更改一下 Nacos 配置中心的配置,以区分当前配置内容:
访问:http://localhost:8081/user/now
结果发现配置没有立即生效:
这是因为缺少一些必要的配置和注解,导致配置没有自动更新。要实现配置热更新,我们可以使用以下两种方式。
# 2.2 使用 @RefreshScope
- 在
@Value
注入变量所在类上添加@RefreshScope
注解:
在 UserController
类上添加 @RefreshScope
注解,如下图所示:
添加完注解后,重启服务,访问页面,发现配置已经生效:
为了确认这是否是热更新而非重启引起的生效,我们可以在 Nacos 中再次修改配置文件,测试热更新功能:
刷新页面,发现配置确实实现了热更新:
此时,在控制台中也可以看到 Nacos 已成功读取配置文件并应用:
重点说明
@RefreshScope
注解的作用是让当前类下的配置支持动态刷新。当 Nacos 中的配置发生变更时,带有@RefreshScope
注解的类能够自动感知并更新配置。- 该方式适用于需要通过
@Value
注解直接读取配置的场景。
# 2.2 使用 @ConfigurationProperties
在某些复杂场景中,直接使用 @Value
可能不够灵活。此时,可以使用 @ConfigurationProperties
注解结合一个专用的配置类来实现热更新。
- 创建一个配置类:
在 user-service
服务中,创建一个 PatternProperties
配置类,读取 pattern.dateformat
属性:
package cn.itcast.user.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "pattern") // 绑定 Nacos 配置中的前缀 "pattern"
public class PatternProperties {
private String dateformat; // 绑定的配置项 "pattern.dateformat"
}
2
3
4
5
6
7
8
9
10
11
12
重点说明
- 使用
@ConfigurationProperties
注解可以将配置属性映射到类中,适用于需要读取多个相关配置的场景。 - 配置类必须使用
@Component
注解注册到 Spring 容器中。
- 在
UserController
中使用配置类代替@Value
:
在 UserController
中注入 PatternProperties
,并替换掉原先的 @Value
注入方式:
完整代码如下:
package cn.itcast.user.web;
import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties; // 注入配置类
@GetMapping("now")
public String now(){
// 使用配置类获取格式化日期的格式
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
// 省略其他代码
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- 添加依赖消除
@ConfigurationProperties
的报错信息:
在 user-service
模块的 pom.xml
中增加依赖,确保 @ConfigurationProperties
可以正常工作:
<!-- 添加 spring-boot-configuration-processor 依赖,支持 @ConfigurationProperties 注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2
3
4
5
6
- 修改 Nacos 中的配置并测试热更新:
修改 Nacos 中的配置文件:
再次访问地址:http://localhost:8081/user/now
发现配置热更新已生效:
重点说明
- 使用
@ConfigurationProperties
注解可以更灵活地管理配置项,尤其适用于读取多个相关配置的场景。 - 配置文件的变更通过 Nacos 实时推送至微服务,无需重启服务即可生效。
# 3. 配置共享
在实际开发中,某些配置在不同的环境(如开发、测试、生产)中是相同的。为了避免在多个环境中重复配置,可以使用 Nacos 提供的配置共享功能。
# 3.1 添加一个环境共享配置
在 Nacos 中,添加一个通用的 userservice.yaml
文件,用于共享配置:
# 3.2 在 user-service
中读取共享配置
- 修改
PatternProperties
类,读取新添加的共享属性:
在 PatternProperties
类中添加 envShareValue
属性,用于读取共享配置:
@Component
@Data
@ConfigurationProperties(prefix = "pattern") // 绑定 Nacos 配置中的前缀 "pattern"
public class PatternProperties {
private String dateformat;
private String envShareValue; // 新增共享配置属性
}
2
3
4
5
6
7
重点说明:通过
@ConfigurationProperties
注解,我们可以灵活读取多个相关配置项。
- 在
UserController
中添加读取共享配置的逻辑:
在 UserController
中添加一个新方法 getProp
,用于输出共享配置的内容:
package cn.itcast.user.web;
import cn.itcast.user.config.PatternProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("prop")
public String getProp(){
// 输出共享配置的内容
return "共享配置值: " + patternProperties.getEnvShareValue();
}
// 省略其他代码
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
重点说明:通过
PatternProperties
类读取envShareValue
属性,实现了不同环境的配置共享。
# 3.3 运行两个 UserApplication
实例,使用不同的 profile
为了验证配置共享,我们运行两个 UserApplication
实例,分别使用不同的 profile
值。
- 修改
UserApplication2
的启动配置,设置profile
为test
:
- 在 IDEA 中快速切换环境,配置为测试环境:
这样,UserApplication
(端口 8081)使用 dev
环境,而 UserApplication2
(端口 8082)使用 test
环境。
启动这两个实例后,分别访问:
可以看出,无论是 dev
还是 test
环境,都成功读取了 envSharedValue
的值,说明配置共享生效了。
# 3.4 配置共享的优先级
配置共享涉及多个配置文件,当这些配置文件存在相同的属性时,优先级如下:
userservice-dev.yaml
>userservice.yaml
> 本地application.yml
我们来验证这一点:
- 首先,在本地
application.yml
中添加属性:
在 application.yml
中添加如下配置:
pattern:
name: 本地环境local # 本地配置属性
2
- 修改
PatternProperties
类,读取新的属性name
:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envShareValue;
private String name; // 新增属性,用于验证优先级
}
2
3
4
5
6
7
8
- 重启
userservice
模块,访问:
访问 http://localhost:8081/user/prop (opens new window),结果如下:
此时,输出的是本地配置属性。
- 在 Nacos 中为
userservice.yaml
配置相同的属性:
再次访问 http://localhost:8081/user/prop (opens new window),结果如下:
此时,Nacos 的共享配置文件 userservice.yaml
生效。
- 在 Nacos 中为
userservice-dev.yaml
配置相同的属性:
修改如下:
发布后再次访问 http://localhost:8081/user/prop (opens new window),结果如下:
此时,userservice-dev.yaml
的配置生效了,验证了优先级的结论:
# 配置文件生效优先级总结
userservice-dev.yaml
>userservice.yaml
> 本地application.yml
当 Nacos 和本地同时存在相同属性时,优先级如图所示:
# 4. 搭建Nacos集群
Nacos生产环境下一定要部署为集群状态,部署方式参考课前资料中的文档:
# 4.1 集群结构图
官方给出的Nacos集群图: 其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:
三个nacos节点的地址:
节点 | ip | port |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
# 4.2 搭建集群
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
# 4.3 初始化数据库
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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# 4.4 下载nacos
nacos在GitHub上有下载地址:Nacos下载地址 (opens new window),可以选择任意版本下载。
本例中才用1.4.1版本:
# 4.5 配置Nacos
将这个包解压到任意非中文目录下,如图: 目录说明:
- bin:启动脚本
- conf:配置文件
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf: 然后添加内容:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
2
3
然后修改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
3
4
5
6
7
# 4.6 启动
将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的application.properties,
nacos1:server.port=8845
nacos2:server.port=8846
nacos3:server.port=8847
然后分别启动三个nacos节点:startup.cmd
# 4.7 nginx反向代理
找到课前资料提供的nginx安装包:
解压到任意非中文目录下: 修改conf/nginx.conf文件,配置如下: 注意粘贴到http大括号里面即可 端口号可以任意指定,比如我指定的是18000,(0,65535)开区间内的都可以,只要不被占用即可。
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 18000;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
启动nginx
start nginx.exe
而后在浏览器访问:http://localhost:18000/nacos即可。 登录成功即配置成功
代码中application.yml文件配置如下: 注意:这里80端口经常被占用,可以换一个
spring:
cloud:
nacos:
server-addr: localhost:18000 # Nacos地址
2
3
4
启动2个UserApplication看Nacos无误 我们加入配置看看 发布后,看到数据库已经写入
# 4.8 优化
- 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置。
- Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离。