SpringCloud篇(配置中心 - Nacos)

目录

[一、Nacos 配置中心](#一、Nacos 配置中心)

[1. 统一配置管理](#1. 统一配置管理)

[1.1. 在nacos中添加配置文件](#1.1. 在nacos中添加配置文件)

[1.2. 从微服务拉取配置](#1.2. 从微服务拉取配置)

[1.2.1. 引入nacos-config依赖](#1.2.1. 引入nacos-config依赖)

[1.2.2. 添加bootstrap.yaml](#1.2.2. 添加bootstrap.yaml)

[1.2.3. 读取nacos配置](#1.2.3. 读取nacos配置)

[1.2.4. 页面访问](#1.2.4. 页面访问)

[2. 配置热更新:两种](#2. 配置热更新:两种)

[2.1. 方式一](#2.1. 方式一)

[2.2. 方式二](#2.2. 方式二)

[3. 配置共享](#3. 配置共享)

[3.1. 添加一个环境共享配置](#3.1. 添加一个环境共享配置)

[3.2. 在user-service中读取共享配置](#3.2. 在user-service中读取共享配置)

[3.3. 运行两个UserApplication,使用不同的profile](#3.3. 运行两个UserApplication,使用不同的profile)

[3.4. 配置共享的优先级](#3.4. 配置共享的优先级)


一、Nacos 配置中心

Nacos配置管理:Nacos除了可以做注册中心,同样可以做配置管理来使用。

1. 统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错,

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

1.1. 在nacos中添加配置文件

如何在nacos中管理配置呢?

然后在弹出的表单中,填写配置信息:

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。

基本不会变更的一些配置还是保存在微服务本地比较好。

1.2. 从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此spring引入了一种新的配置文件:bootstrap.yml文件,会在application.yml之前被读取,流程如下:

1.2.1. 引入nacos-config依赖

首先,在user-service服务中,引入nacos-config的客户端依赖:

复制代码
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

</dependency>
1.2.2. 添加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 # 文件后缀名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件

id,来读取配置。

本例中,就是去读取userservice-dev.yaml:

1.2.3. 读取nacos配置

在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:

完整代码:

复制代码
package com.cloud.user.web;

import com.cloud.user.pojo.User;
import com.cloud.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;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    // ...略
}
1.2.4. 页面访问

在页面访问,可以看到效果:

访问地址:https://localhost:8082/user/now

2. 配置热更新:两种

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

2.1. 方式一

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

2.2. 方式二

使用@ConfigurationProperties注解代替@Value注解。

在user-service服务中,添加一个类,读取patterrn.dateformat属性:

复制代码
package com.cloud.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

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

在UserController中使用这个类代替@Value:

完整代码:

复制代码
package com.cloud.user.web;

import com.cloud.user.config.PatternProperties;
import com.cloud.user.pojo.User;
import com.cloud.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.PathVariable;
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()));
    }

    // 略
}

3. 配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

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

而 [spring.application.name].yaml 不包含环境,因此可以被多个环境共享。

下面我们通过案例来测试配置共享

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

我们在nacos中添加一个userservice.yaml文件:

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

在user-service服务中,修改PatternProperties类,读取新添加的属性:

在user-service服务中,修改UserController,添加一个方法:

3.3. 运行两个UserApplication,使用不同的profile

修改UserApplication2这个启动项,改变其profile值:

这样,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。

启动UserApplication和UserApplication2

访问http://localhost:8081/user/prop,结果:

访问http://localhost:8082/user/prop,结果:

可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。

3.4. 配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有高低之分:

相关推荐
言慢行善15 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星16 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟16 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z16 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可16 小时前
Java 中的实现类是什么
java·开发语言
He少年16 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新16 小时前
myeclipse的pojie
java·ide·myeclipse
迷藏49416 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构
迷藏49416 小时前
**发散创新:基于Solid协议的Web3.0去中心化身份认证系统实战解析**在Web3.
java·python·web3·去中心化·区块链
qq_4335021817 小时前
Codex cli 飞书文档创建进阶实用命令 + Skill 创建&使用 小白完整教程
java·前端·飞书