IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Nacos系列【24】集成Nacos 2.x配置中心及动态刷新配置 -> 正文阅读

[Java知识库]Nacos系列【24】集成Nacos 2.x配置中心及动态刷新配置

有道无术,术尚可求,有术无道,止于术。

前言

在很早之前我们使用Nacos 1.3.2 搭建了配置中心,自从发布2.0版本以来,以及Spring Boot 、Cloud 持续发布,升级到Nacos2.x 发现了一些升级需要注意的问题,所以写这篇文档闭坑,顺便讲解下如何实现动态刷新配置。

集成Nacos 2.x配置中心

首先按照之前的文档安装Nacos 2.x 以及升级到最新客户端。

Nacos系列(15)-Nacos2.0.3安装

1. 环境搭建

添加配置中心依赖:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

添加bootstrap.yml文件,该文件会在应用启动时最先加载,并在文件中添加配置中心:

server:
  port: 9005
spring:
  application:
    name: app-service001
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        enabled: true

Nacos控制台,添加一个app-service001.yaml配置文件,内容如下:
在这里插入图片描述

2. 解决Param ‘serviceName’ is illegal, serviceName is blank

首先启动的时候,控制台打印了以下错误信息:

java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank
	at com.alibaba.nacos.api.naming.utils.NamingUtils.getGroupedName(NamingUtils.java:47) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.event.InstancesChangeNotifier.registerListener(InstancesChangeNotifier.java:55) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:392) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.cloud.nacos.discovery.NacosWatch.start(NacosWatch.java:134) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.8.RELEASE.jar:2.2.8.RELEASE]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) [spring-context-5.3.8.jar:5.3.8]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) [spring-context-5.3.8.jar:5.3.8]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) [spring-context-5.3.8.jar:5.3.8]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_201]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) [spring-context-5.3.8.jar:5.3.8]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) [spring-context-5.3.8.jar:5.3.8]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.8.jar:5.3.8]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.8.jar:5.3.8]

大概意思就是没有配置服务名,也就是没有配置spring.application.name,而我们明明是在bootstrap.yml中添加了的:
在这里插入图片描述
而且在启动开始,并没有打印连接到配置中心的日志:
在这里插入图片描述
由此猜想,难道是bootstrap.yml没有被加载?

首先要知道bootstrap.yml优先于application.yml加载,其目的是为了在应用启动时,加载一些系统级的资源配置项,比如远程配置中心地址,该文件是由引导上下文在启动最开始的阶段去加载的。

而该机制是spring-cloud-starter-bootstrap 提供的,Spring Boot 默认是不支持,在Spring Boot 2.4 之后的版本,提供了spring.config.import通过属性导入配置数据的方法,所以Spring Cloud 也就移除了spring-cloud-starter-bootstrap ,改用spring.config.import作为默认集成配置中心的方式。官网说明

Spring Cloud Alibaba 2021.0.1.0 升级指南中,也对此进行了详细说明。
在这里插入图片描述

所以怎么解决这个问题呢?

  • 方案1:自己引入spring-cloud-starter-bootstrap
  • 方案2:使用 spring.config.import 方式引入配置

既然都Spring Cloud 都推荐使用 spring.config.import ,那么我们就用这个吧~

首先删除bootstrap.yml,在application.yml使用import 的方式导入Nacos 的配置:

spring:
  application:
    name: app-service001
  cloud:
    nacos:
      config:
        group: DEFAULT_GROUP
        server-addr: 127.0.0.1:8848
  config:
    import:
      #- optional:nacos:test.yml  # 监听 DEFAULT_GROUP:test.yml
      #- optional:nacos:test01.yml?group=group_01 # 覆盖默认 group,监听 group_01:test01.yml
      #- optional:nacos:test02.yml?group=group_02&refreshEnabled=false # 不开启动态刷新
      - nacos:app-service001.yaml # 在拉取nacos配置异常时会快速失败,会导致 spring 容器启动失败

启动程序,可以看到连接到了Nacos 远程配置中心:
在这里插入图片描述

3. 读取远程配置

首先写一个测试配置类,通过@Value读取配置:

@Configuration
public class Person {

    @Value("${person.name}")
    String name;

    @Value("${person.age}")
    Integer age;

 // getter setter

在写一个测试访问接口,返回配置内容:

    @Autowired
    Person person;

    @GetMapping("/test")
    public String test() {
        return person.toString();
    }

访问接口,可以看到读取到了Nacos 中的配置:
在这里插入图片描述
接着修改以下配置内容,再次访问,发现并没有返回更新后的数据,所以这就牵扯出配置动态刷新的问题。
在这里插入图片描述

动态刷新配置

方式1:@RefreshScope

@RefreshScope是Spring Cloud 提供的注解,可以看到它就是通过Spring 的作用域来实现的。
在这里插入图片描述
在之前的配置类上添加注解:


@Configuration
@RefreshScope
public class Person { } 

重新启动应用,修改Nacos 中的配置,再通过接口查看数据,可以看到是最新修改后的数据~~

方式2: @NacosValue

@NacosValue在看到这个注解的时候,去看了源码,上面注释写的是Annotation which extends value to support auto-refresh.,说它是@Value注解的扩展,并支持动态刷新。

然后直接在上面的测试案例中使用@NacosValue,发现连配置中心的配置都获取不到,更不用说动态刷新了。

    @NacosValue(value = "${person.name}", autoRefreshed = true)
    String name;

接着咨询了一下开发大佬:
在这里插入图片描述
又在官网中发现了相关说明:
在这里插入图片描述
由上总结@NacosValue Spring Cloud并不能直接使用,只是为了在纯Spring 环境中方便集成配置中心,Spring Cloud环境下使用其本身推荐的方式。

要想使用@NacosValue 需要添加以下依赖:

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-spring-context</artifactId>
            <version>1.1.1</version>
        </dependency>

然后在启动类或者配置类上添加@EnableNacosConfig@NacosPropertySource注解:

@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "app-service001.yaml", autoRefreshed = true)

使用@NacosConfigurationProperties获取配置:

@NacosConfigurationProperties(prefix = "person",
        dataId = "app-service001.yaml",
        autoRefreshed = true,
        type = ConfigType.YAML
)
@Data
@Component
public class NacosValueConfig {

    private String name;

    private Integer age;
}

或者 @NacosValue获取配置:

    @NacosValue(value = "${person.name}", autoRefreshed = true)
    String name;

    @GetMapping("/value")
    public String value() {
        System.out.println(nacosValueConfig.toString());
        System.out.println(person.toString());
        System.out.println(name);
        return "@NacosConfigurationProperties ";
    }

启动项目,访问获取配置接口:
在这里插入图片描述
修改配置,再次访问,可以看到打印了配置刷新的日志,并且获取到了最新配置:
在这里插入图片描述
当然方式2 并不推荐使用

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:50:24  更:2022-08-19 18:53:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:50:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码