【Spring Cloud】深入理解 Nacos 的统一配置管理,配置热更新,多环境配置共享,集群搭建

这篇具有很好参考价值的文章主要介绍了【Spring Cloud】深入理解 Nacos 的统一配置管理,配置热更新,多环境配置共享,集群搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言:为什么要统一配置管理

在微服务架构中,配置管理是一个至关重要的问题。随着系统规模的扩大,配置的管理和更新变得更加繁琐。Nacos 作为一个全能的服务发现和配置管理平台,为解决这一问题提供了全方位的支持。在本文中,我们将深入理解 Nacos 的配置管理,包括配置的统一管理、热更新、多环境配置共享以及Nacos集群的搭建。

一、Nacos 的配置管理

1.1 在 Nacos 中添加配置文件

Nacos 提供了直观的 Web 界面,使得我们可以轻松地添加和管理配置文件。通过 Web 界面,我们可以为不同的微服务添加对应的配置信息,包括数据库连接、端口号等。

下面将演示如何在 Nacos 的控制台上添加新的配置文件:

  1. 首先在 Nacos 的控制台中点击配置管理,然后选择右侧的加号添加新的配置:
    nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

  2. 然后设置以下配置信息,最后点击发布:
    nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

在这个配置信息中,指定了 Data ID 为 userservice-dev.yml,并在配置内容中设置了一个日期的格式。

关于 Data ID 命名格式的说明:

  1. 首先要确保 Data ID 的唯一性,使用具体的服务名称就可确保唯一性;
  2. 采用 Servicename-profile 的格式,其中 profile 代表的是目前服务的运行环境,如dev
  3. 配置文件可采用多种类型,如 ymlproperties等,根据不同格式的配置,Data ID 的后缀名也会不同。例如,使用userservice-dev.yml作为 Data ID 表示该配置文件为 YAML 格式。

关于配置内容的说明:

配置内容通常包含了应用程序的参数、设置、以及其他与应用程序运行有关的信息。这些配置信息可能包括但不限于:

  1. 数据库连接信息: 包括数据库的URL、用户名、密码等。

  2. 服务端口号: 应用程序运行的端口,用于处理外部请求。

  3. 第三方服务的地址和密钥: 与其他服务进行交互时所需的信息。

  4. 日志级别和格式: 控制应用程序日志输出的详细程度和格式。

  5. 缓存策略: 配置缓存的大小、过期时间等相关参数。

  6. 安全配置: 包括认证和授权相关的配置信息。

  7. 任务调度配置: 配置定时任务的执行策略和参数。

  8. 其他运行时参数: 如线程池大小、连接超时等。

配置内容的特点在于它们是经常需要变化的,而不同环境下的配置可能也有所不同。因此,合理管理和更新配置信息对于应用程序的灵活性和可维护性至关重要。通过使用Nacos等配置中心,可以实现配置信息的集中管理、动态更新,从而更好地适应应用程序的不断变化。

1.2 微服务获取配置

在微服务应用中,获取配置信息是一个关键的任务。配置信息包括数据库连接、服务端口、第三方服务的地址、日志设置等等,这些信息对于应用程序的正确运行至关重要。在没有 Nacos 配置时和有 Nacos 配置时,微服务获取配置信息的过程有所不同。

1.2.1 没有 Nacos 配置的情况下

在没有Nacos配置中心的情况下,微服务获取配置信息的步骤如下图所示:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

说明:

  1. 当项目启动时,应用程序会读取本地的配置文件,这些配置文件通常存储在类路径中,例如application.propertiesapplication.yml
  2. 随后,应用程序会根据配置文件中的内容创建Spring容器,加载相关的Bean对象。
  3. 当应用程序需要获取配置信息时,它会直接从Spring容器中获取。

1.2.2 有 Nacos 配置的情况下

在有 Nacos 配置中心的情况下,微服务获取配置信息的步骤如下图所示:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

说明:

  1. 在有 Nacos 配置的情况下,首先需要知道 Nacos 配置中心的地址以及配置文件的信息。这些信息通常存储在应用程序的bootstrap.ymlbootstrap.properties中。
  2. 当项目启动后,应用程序会先读取bootstrap.yml中的配置,获取 Nacos 配置中心的地址和其他必要信息。
  3. 随后,应用程序会连接到 Nacos 配置中心,获取配置信息。这些配置信息包括数据库连接、第三方服务的地址、日志设置等。
  4. 在获取 Nacos 配置信息之后,应用程序会再次读取本地的配置文件,例如application.propertiesapplication.yml
  5. 最终,应用程序会将 Nacos 配置和本地配置合并,创建 Spring 容器,加载相关的 Bean 对象。

在有 Nacos 配置中心的情况下,Nacos 充当了集中式的配置管理中心,使得微服务可以动态获取配置信息并实现配置的集中管理,从而提高了灵活性和可维护性。

1.3 本地配置文件的修改

  1. 引入 Nacos 的配置管理客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. user-service中的 resource 目录下添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是 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));
}

然后重启服务器,使用浏览器访问 now 这个接口:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

成功输出了时间,说明 Nacos 中新增的配置也成功生效了。

二、配置文件的热更新

2.1 修改配置文件

此时,如果我们想要修改 Nacos 中的配置内容,比如修改日期的格式如下:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

当修改完成之后,再次通过浏览器访问,发现并没有生效:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
如果重启 user-service服务,再次通过浏览器访问才生效了:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
但是如果想要修改了配置文件之后立马就生效,并且在实际生产环境中,也不能因为修改一点配置信息就重启服务器吧,那么此时又该然如何操作呢?

2.2 设置配置文件热更新

要达到这个目的,就需要使用到配置文件的热更新,即 Nacos 中的配置文件变更后,微服务无需重启就可以感知。在代码中,有两种实现配置文件热更新的方法:

方式一: 在 @Value 注入的变量所在类上添加注解 @RefreshScope 注解
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
添加完注解之后,重启微服务,当前访问输出的时间格式如下:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
然后,再次修改 Nacos 的配置文件中的时间格式:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

此时并没有重启微服务,直接通过浏览器访问,其输出的时间格式如下,和刚修改的格式相匹配,则说明热更新配置成功了:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

并且此时,user-service的控制台也会输出相关配置文件相关的信息:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

方式二:使用 @ConfigurationProperties注解

使用@ConfigurationProperties注解时,会把从配置文件中读取到的内容封装到一个对象中,因此首先需要创建一个类:

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

然后修改 UserController 中的代码,并注释掉方式一的相关代码:

@Autowired
private PatternProperties properties;

@GetMapping("now")
public String now() {
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}

重启微服务,此时访问浏览器输出的时间格式如下:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

然后再次修改Nacos配置文件中的日期格式:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

此时并没有重启微服务,直接通过浏览器访问,其输出的时间格式如下,和刚修改的格式相匹配,则说明热更新配置成功了:
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

三、多环境配置共享

在微服务应用中,通常需要在不同的环境(开发、测试、生产等)下使用不同的配置信息。但如果在多个环境中的配置内容是相同的,为了避免重复配置,可以实现多环境配置文件的共享。Nacos提供了一种简单而有效的方式来实现这一目标。

3.1 共享配置文件命名

3.1 共享配置文件命名

在微服务启动时,从 Nacos 中读取多个配置文件时,采用以下命名规范:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

不论 spring.profiles.active 如何变化,[spring.application.name].yaml 这个文件都会被加载。因此,多环境共享的配置可以写入这个文件中。

示例:

假设 spring.application.nameuserservice,则对应的配置文件命名如下:

  • userservice.yaml:共享配置文件,包含所有环境通用的配置。
server:
  port: 8080
database:
  url: jdbc:mysql://localhost:3306/userservice
  username: admin
  password: admin123
  • userservice-dev.yaml:开发环境配置文件,覆盖需要变更的配置项。
spring:
  profiles:
    active: dev
database:
  url: jdbc:mysql://localhost:3306/userservice_dev
  • userservice-test.yaml:测试环境配置文件,同样覆盖需要变更的配置项。
spring:
  profiles:
    active: test
database:
  url: jdbc:mysql://testdb:3306/userservice_test

这样的命名规范使得在不同环境下维护配置变得更加清晰和方便,同时确保了在多环境中可以共享相同的配置信息。

3.2 设置多环境配置文件共享

在 Nacos 的环境列表中新增一个配置文件userservice.yaml

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
当添加完共享配置文件之后,再次修改 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服务,注意这个服务当前的环境是dev环境,对应的端口号是 8081。

另外,再开启一个user-service服务,端口号为 8082,使其处于test 环境,但并不用在创建一个配置文件,直接通过IDEA进行设置即可:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

由于并没有创建test环境的配置文件,因此可以推测 8082 端口对应的服务除了共享环境变量外的其他字段都应该为null

分别访问这两个服务的prop接口,结果如下:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

至此,便成功实现了配置文件的共享。

3.3 配置文件的优先级

如果当不同的配置文件拥有不同的属性时,配置文件的优先级有是怎么样的呢?其实这个问题可以很容易的找出答案。那就是中不同的配置文件中设置相同的属性,看看最终的结果以哪个为准就能够得出优先级的关系了。

  1. 首先在本地的配置文件application.yml文件中新增以下内容:
    nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
    并修改 PatternProperties代码:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
    private String envSharedValue;
    private String name; 
}

此时毫无疑问读取到的就是本地配置,因为 Nacos 中并没有配置这个属性。
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

  1. 然后在 Nacos 的 userservice.yaml 配置文件中设置这个属性
    nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

刷新浏览器,发现是以共享配置文件为准,因此得出结论是Nacos的共享配置文件的优先级大于本地配置文件。
nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

  1. 接着也在 userservice-dev.yaml 中也设置这个属性

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos
刷新浏览器,发现是以Nacos的开发配置文件为准,因此得出结论是 Nacos 开发环境配置文件的优先级大于共享配置文件。

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

综上所述,不同的配置文件的优先级关系如下:

  • 服务名-profile.yaml >服务名称.yaml > 本地配置

更详细地,在 Nacos 配置管理中,不同来源的配置文件有不同的优先级。优先级从高到低排列如下:

  1. 环境配置(Profile): 环境配置具有最高优先级。当在Nacos中使用 [spring.application.name]-[spring.profiles.active].yaml 格式命名的配置文件时,其中的 spring.profiles.active 将指定当前环境,优先级最高。

  2. 服务名.yaml: 使用 [spring.application.name].yaml 格式命名的配置文件,其中的 spring.application.name 即服务名。这是服务级别的通用配置,具有较高优先级。

  3. extension-config: 通过Nacos配置中心的 Data ID 中的 extension-config 配置项获取的配置。这个配置项通常用于扩展配置,例如定制化的业务配置。

  4. extension-configs: 通过Nacos配置中心的 Data ID 中的 extension-configs 配置项获取的配置。这个配置项也用于扩展配置,但具有比单独的 extension-config 更低的优先级。

  5. shared-configs: 通过Nacos配置中心的 Data ID 中的 shared-configs 配置项获取的配置。这个配置项通常用于共享配置,例如团队内部约定的通用配置。

  6. 本地配置: 本地配置是在应用程序中直接指定的配置项,具有最低的优先级。这包括在应用程序的配置文件(如 application.ymlapplication.properties)中定义的配置项。

优先级示例:

假设有一个微服务名为 userservice,当前环境为 dev,那么优先级顺序为:

  • userservice-dev.yaml(环境配置) > userservice.yaml(服务名.yaml) > extension-config > extension-configs > shared-configs > 本地配置

这个优先级规则确保了在不同层次和来源的配置中,能够灵活地管理和覆盖配置项,从而实现更精细化的配置控制。

四、Nacos 集群搭建

搭建 Nacos 集群是确保系统可用性和容错性的关键步骤。通过集群部署,可以分摊负载、提高系统的并发处理能力,并在某一节点发生故障时保持系统的正常运行。

以下是 Nacos 集群搭建的基本步骤:

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

下面是详解的搭建过程。

4.1 集群结构图

官方给出的 Nacos 集群图:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

其中包含3个 nacos 节点,然后一个负载均衡器代理 3 个 Nacos。这里负载均衡器可以使用 nginx。

计划搭建的集群结构:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

三个 nacos 节点的地址:

节点 IP PORT
nacos1 192.168.150.1 8845
nacos2 192.168.150.1 8846
nacos3 192.168.150.1 8847

4.2 初始化数据库

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');

4.3 配置 Nacos

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

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

然后添加地址:

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

4.4.启动

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

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

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

nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

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

startup.cmd

4.5.nginx反向代理

将 nginx 安装到非中文目录下:

nacos2 配置 spring cloud 指定多个配置文件,微服务,spring cloud,服务器,nacos

修改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.优化

  • 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.

  • Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离文章来源地址https://www.toymoban.com/news/detail-785062.html

到了这里,关于【Spring Cloud】深入理解 Nacos 的统一配置管理,配置热更新,多环境配置共享,集群搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud】关于Nacos配置管理的详解介绍

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起

    2024年02月01日
    浏览(34)
  • 【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识

                                                                💧 深入了解 S p r i n g C l o u d A l i b a b a N a c o s :服务注册和配置中心 color{#FF1493}{深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心} 深入了解 Sp r in g Cl o u d A l ibaba N a cos :服务注

    2024年02月11日
    浏览(35)
  • 《Spring Cloud学习笔记:Nacos配置管理 & OpenFeign & LoadBalancer & Getway》

    基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不

    2024年02月04日
    浏览(32)
  • Spring Cloud Day2 Nacos配置管理、Feign远程调用与Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月10日
    浏览(50)
  • cloud Alibab+nacos+gateway集成swaggerui,统一文档管理(注意点)

    首先说明:本文只说整合注意点 效果图和功能参考链接 在网关服务添加依赖即可解决 请注意排查:webflux的依赖是否有效。并且排除spring-boot-starter-web 注意查看gateway的相关配置是否有错误 原因:一定是你的依赖或者配置有问题 有问题请留言

    2024年02月13日
    浏览(30)
  • Spring Cloud集成Nacos实现本地配置优先 | Spring Cloud 9

    Nacos Config Starter 实现了 org.springframework.cloud.bootstrap.config.PropertySourceLocator 接口,并将优先级设置为最高。 在 Spring Cloud 应用启动阶段,会主动从 Nacos Server 端获取对应的数据,并将获取到的数据转换成 PropertySource 且注入到 Environment 的 PropertySources 属性中,所以使用 @Value 注解

    2024年02月15日
    浏览(44)
  • Spring Cloud集成Nacos实现服务配置中心 | Spring Cloud 7

    先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。 配置文件无法区分环境,开发环境、测试环境、线上环境。微服务项目可能会

    2024年02月14日
    浏览(29)
  • 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一、配置问题分析及解决方案 1、问题分析 2、解决方案 二、Spring Cloud Config 介绍 1、Spring Cloud Config特性 2、Spring Cloud Config作用     3、Spring Cloud Config 组件    统一配置中心服务端    统一配置中心客户端 4、Spring Cloud Config 工作流程 三、 配置中心使用 1 搭建远程 git

    2024年02月16日
    浏览(27)
  • 微服务 – Spring Cloud – Nacos 配置中心

    Data ID : nacos-config-client-dev.yaml Group: DEV-CLOUD2023

    2024年02月11日
    浏览(37)
  • Spring Cloud Alibaba nacos配置中心

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代码管理gitlab 使用 第十章 Spr

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包