栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录使用spring-cloud-starter-alibaba-nacos-config遇到的问题(nacos 2.1)【2022.06】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录使用spring-cloud-starter-alibaba-nacos-config遇到的问题(nacos 2.1)【2022.06】

      • ==遇到的问题==
      • ==解决方案==
            • 1. 确定nacos的版本、端口开通{8849、9848}
            • 2. 修改pom文件依赖
            • 3. 增加bootstrap.yml配置
            • 4. 修改类文件注解和刷新字段逻辑

遇到的问题

使用nacos作为配置中心,字段没有被负值
@Value报错
GrpcClient报错
字段刷新

解决方案 1. 确定nacos的版本、端口开通{8849、9848}

localhost:8848 登陆成功后左上角显示 nacos 版本,此处以2.1为例

docker命令,注意docker宿主机此处端口必须是 1000 的偏移量

docker run --env MODE=standalone --name nacos -d -p 8848:8848 -p 9848:9848 -v /home/docker-data/nacos-data/logs:/home/nacos/logs -v /home/docker-data/nacos-data/conf:/home/nacos/conf nacos/nacos-server
2. 修改pom文件依赖
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
            2021.1
            
                
                    com.alibaba.nacos
                    nacos-client
                
            
        
        
        
            com.alibaba.nacos
            nacos-client
            2.1.0
        
        
            org.springframework.cloud
            spring-cloud-starter-bootstrap
        

说明:

  1. spring-cloud-starter-alibaba-nacos-config 中的nacos-client 版本过低,选择使用 nacos 服务端匹配的版本
  2. spring-cloud-starter-bootstrap用于加载 NacosConfigBootstrapConfiguration 配置类,开启访问配置中心的资源文件并开启刷新字段的监听器
  3. nacos-client的 2.x版本 有grpc的优化,这里就是需要上面端口1000 的偏移量:9848
3. 增加bootstrap.yml配置

由于 加载nacos的configuration优先级很高,application.yml满足不了,必须使用bootstrap.yml来配置访问nacos服务端的配置信息

bootstrap.yml

spring:
  application:
    name: global
  cloud:
    nacos:
      config:
        server-addr: ip:8848
        group: DEFAULT_GROUP
        username: nacos
        password: nacos
        namespace: b14aef81-2b0e-472d-8b79-e98e4582c3d8
        enabled: true
        extension-configs:
          - dataId: global.properties
            group: DEFAULT_GROUP
            refresh: true
          - dataId: global_common.properties
            group: DEFAULT_GROUP
            refresh: true

ext-config 以过时,使用extension-configs。
读取配置文件的顺序:

源码:

loadSharedConfiguration(composite);
loadExtConfiguration(composite);
loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);

loadSharedConfiguration 对应配置 shared-configs

loadExtConfiguration 对应配置 本地+ extension-configs + spring.application.name。
以当前配置为例 读取nacos服务端三次,分别是 global.properties、global_common.properties、global

loadApplicationConfiguration中又读取了一次global.properties,以设置的profile 修改dataid放到 Set> propertySources 集合中,源码如下:

		for (String profile : environment.getActiveProfiles()) {
			String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;
			loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,
					fileExtension, true);
		}
4. 修改类文件注解和刷新字段逻辑
package com.example.springcloudgateway7050;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
@RefreshScope
public class HelloController {


    @Value("${first_global_config:123}")
    private String first_global_config;

    @Value("${hello_global_config:321}")
    private String hello_global_config;

    private ConfigurableApplicationContext context;

    @RequestMapping("/sayHello")
    public String sayHello() {
        return first_global_config+ " | " + hello_global_config;
    }

    @RequestMapping("/sayRefreshHello")
    public String sayRefreshHello() {
        return context.getEnvironment().getProperty("first_global_config") + "  ||  " +
                context.getEnvironment().getProperty("hello_global_config");
    }


    @Autowired
    public void context(ConfigurableApplicationContext context) {
        this.context = context;
    }

}

@Value 遵从spring就可以

  1. 类上增加@RefreshScope注解 ,自动刷新@Value标识的属性
    配置文件中的 refresh: true ,自动刷新
  2. ConfigurableApplicationContext.getEnvironment().getProperty(“first_global_config”)中的属性

至于怎么刷新的大家看下源码就知道了,有时间再细讲。
(ps: 有问题请再评论留言)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991778.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号