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、服务本地同时出现相同属性时,优先级有高低之分:

相关推荐
1.14(java)1 小时前
Spring-boot快速上手
java·开发语言·javaee
Darkdreams1 小时前
SpringBoot项目集成ONLYOFFICE
java·spring boot·后端
bropro2 小时前
【Spring Boot】Spring AOP中的环绕通知
spring boot·后端·spring
lhbian2 小时前
【Spring Cloud Alibaba】基于Spring Boot 3.x 搭建教程
java·spring boot·后端
luom01022 小时前
springcloud springboot nacos版本对应
spring boot·spring·spring cloud
代码雕刻家2 小时前
3.6.Maven-依赖管理-依赖范围
java·maven
范什么特西3 小时前
狂神报错页面设置
java·tomcat
架构师沉默3 小时前
AI 真的会取代程序员吗?
java·后端·架构
Memory_荒年4 小时前
ReentrantLock 线程安全揭秘:从“锁”到“重入”的魔法
java·后端·源码
L0CK4 小时前
秒杀异步下单业务逻辑梳理
java