程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 微服务基础

    • 了解SpringCloud微服务架构
    • 启动多个微服务项目
    • Eureka 服务注册
    • Ribbon 负载均衡
    • Nacos 下载与安装
    • Nacos 服务注册
    • Nacos 配置管理
      • 1. 统一配置管理
        • 1.1 从微服务拉取配置
        • 1.2 配置步骤
      • 2. 配置热更新
        • 2.1 场景回顾
        • 2.2 使用 @RefreshScope
        • 2.2 使用 @ConfigurationProperties
      • 3. 配置共享
        • 3.1 添加一个环境共享配置
        • 3.2 在 user-service 中读取共享配置
        • 3.3 运行两个 UserApplication 实例,使用不同的 profile
        • 3.4 配置共享的优先级
        • 配置文件生效优先级总结
      • 4. 搭建Nacos集群
        • 4.1 集群结构图
        • 4.2 搭建集群
        • 4.3 初始化数据库
        • 4.4 下载nacos
        • 4.5 配置Nacos
        • 4.6 启动
        • 4.7 nginx反向代理
        • 4.8 优化
    • openFeign 远程调用
    • OpenFeign 最佳实践
    • Gateway 网关
    • Gateway 进阶使用
    • Sentinel 服务保护
    • Sentinel 整合 Feign
    • 分布式事务 Seata
    • 什么是分布式
    • 什么是RPC框架
  • 微服务之DDD架构思想

  • 微服务
  • 微服务基础
scholar
2024-08-24
目录

Nacos 配置管理

# Nacos 配置管理

除了作为注册中心,Nacos 还可以用作配置管理,统一管理微服务的配置文件,简化配置的维护和更新。

# 1. 统一配置管理

随着微服务实例数量的增加,逐个手动修改配置文件变得繁琐且容易出错。Nacos 提供了一种集中式的配置管理方案,能够统一管理所有实例的配置,避免重复操作。

在这里插入图片描述

注意:只有核心配置和需要热更新的配置才有放到 Nacos 中管理的必要。稳定且不常变更的配置建议仍然保存在微服务本地。

# 1.1 从微服务拉取配置

微服务从 Nacos 中获取配置的流程如下:

在这里插入图片描述

为了让微服务在启动时能够拉取 Nacos 中的配置,并与本地的 application.yml 合并,Spring 引入了一个新的配置文件 bootstrap.yaml。该文件在 application.yml 之前被读取,流程如下:

在这里插入图片描述

# 1.2 配置步骤

  1. 引入 Nacos 配置管理依赖

首先,在 user-service 服务中,引入 Nacos Config 客户端依赖:

<!-- Nacos 配置管理依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1
2
3
4
5

说明:该依赖使得微服务能够通过 Nacos 获取配置文件,并支持配置的动态更新。

  1. 添加 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
1
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

读取流程

  1. 服务启动时,Spring Boot 会先加载 bootstrap.yaml,在其中读取 Nacos 的配置地址(spring.cloud.nacos.server-addr)以及服务的基本信息(如服务名称、环境和文件格式)。
  2. 服务连接 Nacos 后,会根据组合的配置文件 ID(如 userservice-dev.yaml)去 Nacos 中拉取相应的配置。
  3. Nacos 返回配置内容,服务将这些配置与本地的 application.yml 配置合并后完成启动。

在 Nacos 中,配置文件的 ID 就是 userservice-dev.yaml,也就是 Nacos 控制台中配置文件的文件名。这个文件名在 Nacos 控制台中可以看到,如下图所示:

在这里插入图片描述

  1. 读取 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));
    }
    // ...省略其他业务代码
}
1
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 的注解。
  1. 页面访问效果

启动 user-service 后,通过浏览器访问 http://localhost:8081/user/now,可以看到如下效果:

在这里插入图片描述


# 2. 配置热更新

使用 Nacos 作为配置中心的一个重要功能就是支持配置热更新。当我们在 Nacos 中修改配置时,无需重启微服务即可使配置生效。

# 2.1 场景回顾

我们先更改一下 Nacos 配置中心的配置,以区分当前配置内容:

在这里插入图片描述

访问:http://localhost:8081/user/now

结果发现配置没有立即生效:

在这里插入图片描述

这是因为缺少一些必要的配置和注解,导致配置没有自动更新。要实现配置热更新,我们可以使用以下两种方式。

# 2.2 使用 @RefreshScope

  1. 在 @Value 注入变量所在类上添加 @RefreshScope 注解:

在 UserController 类上添加 @RefreshScope 注解,如下图所示:

在这里插入图片描述

添加完注解后,重启服务,访问页面,发现配置已经生效:

在这里插入图片描述

为了确认这是否是热更新而非重启引起的生效,我们可以在 Nacos 中再次修改配置文件,测试热更新功能:

在这里插入图片描述

刷新页面,发现配置确实实现了热更新:

在这里插入图片描述

此时,在控制台中也可以看到 Nacos 已成功读取配置文件并应用:

在这里插入图片描述

重点说明

  • @RefreshScope 注解的作用是让当前类下的配置支持动态刷新。当 Nacos 中的配置发生变更时,带有 @RefreshScope 注解的类能够自动感知并更新配置。
  • 该方式适用于需要通过 @Value 注解直接读取配置的场景。

# 2.2 使用 @ConfigurationProperties

在某些复杂场景中,直接使用 @Value 可能不够灵活。此时,可以使用 @ConfigurationProperties 注解结合一个专用的配置类来实现热更新。

  1. 创建一个配置类:

在 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"
}
1
2
3
4
5
6
7
8
9
10
11
12

重点说明

  • 使用 @ConfigurationProperties 注解可以将配置属性映射到类中,适用于需要读取多个相关配置的场景。
  • 配置类必须使用 @Component 注解注册到 Spring 容器中。
  1. 在 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()));
    }

    // 省略其他代码
}
1
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
  1. 添加依赖消除 @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>
1
2
3
4
5
6
  1. 修改 Nacos 中的配置并测试热更新:

修改 Nacos 中的配置文件:

在这里插入图片描述

再次访问地址:http://localhost:8081/user/now

发现配置热更新已生效:

在这里插入图片描述

重点说明

  • 使用 @ConfigurationProperties 注解可以更灵活地管理配置项,尤其适用于读取多个相关配置的场景。
  • 配置文件的变更通过 Nacos 实时推送至微服务,无需重启服务即可生效。

# 3. 配置共享

在实际开发中,某些配置在不同的环境(如开发、测试、生产)中是相同的。为了避免在多个环境中重复配置,可以使用 Nacos 提供的配置共享功能。

# 3.1 添加一个环境共享配置

在 Nacos 中,添加一个通用的 userservice.yaml 文件,用于共享配置:

在这里插入图片描述

# 3.2 在 user-service 中读取共享配置

  1. 修改 PatternProperties 类,读取新添加的共享属性:

在 PatternProperties 类中添加 envShareValue 属性,用于读取共享配置:

@Component
@Data
@ConfigurationProperties(prefix = "pattern") // 绑定 Nacos 配置中的前缀 "pattern"
public class PatternProperties {
    private String dateformat;
    private String envShareValue; // 新增共享配置属性
}
1
2
3
4
5
6
7

重点说明:通过 @ConfigurationProperties 注解,我们可以灵活读取多个相关配置项。

  1. 在 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();
    }

    // 省略其他代码
}
1
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 值。

  1. 修改 UserApplication2 的启动配置,设置 profile 为 test:

在这里插入图片描述

  1. 在 IDEA 中快速切换环境,配置为测试环境:

在这里插入图片描述

这样,UserApplication(端口 8081)使用 dev 环境,而 UserApplication2(端口 8082)使用 test 环境。

启动这两个实例后,分别访问:

  • http://localhost:8081/user/prop (opens new window) 结果如下:

在这里插入图片描述

  • http://localhost:8082/user/prop (opens new window) 结果如下:

在这里插入图片描述

可以看出,无论是 dev 还是 test 环境,都成功读取了 envSharedValue 的值,说明配置共享生效了。

# 3.4 配置共享的优先级

配置共享涉及多个配置文件,当这些配置文件存在相同的属性时,优先级如下:

userservice-dev.yaml > userservice.yaml > 本地 application.yml

我们来验证这一点:

  1. 首先,在本地 application.yml 中添加属性:

在 application.yml 中添加如下配置:

pattern:
  name: 本地环境local # 本地配置属性
1
2
  1. 修改 PatternProperties 类,读取新的属性 name:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
    private String envShareValue;
    private String name; // 新增属性,用于验证优先级
}
1
2
3
4
5
6
7
8
  1. 重启 userservice 模块,访问:

访问 http://localhost:8081/user/prop (opens new window),结果如下:

在这里插入图片描述

此时,输出的是本地配置属性。

  1. 在 Nacos 中为 userservice.yaml 配置相同的属性:

在这里插入图片描述

再次访问 http://localhost:8081/user/prop (opens new window),结果如下:

在这里插入图片描述

此时,Nacos 的共享配置文件 userservice.yaml 生效。

  1. 在 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');
1
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
1
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
1
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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

启动nginx 在这里插入图片描述

start nginx.exe
1

而后在浏览器访问:http://localhost:18000/nacos即可。 登录成功即配置成功 在这里插入图片描述

代码中application.yml文件配置如下: 注意:这里80端口经常被占用,可以换一个

spring:
  cloud:
    nacos:
      server-addr: localhost:18000 # Nacos地址
1
2
3
4

启动2个UserApplication看Nacos无误 在这里插入图片描述 我们加入配置看看 在这里插入图片描述 发布后,看到数据库已经写入 在这里插入图片描述

# 4.8 优化

  • 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置。
  • Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Nacos 服务注册
openFeign 远程调用

← Nacos 服务注册 openFeign 远程调用→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式