alibaba/spring-cloud-alibaba

nacos2023.x读取不到配置

Closed this issue · 12 comments

2023版本现在连group和namespace的配置都没有了。SpringBoot配置如下:

spring:
  cloud:
    nacos:
      config:
        enabled: true
        # nacos server 地址
        server-addr: 172.26.32.1:8848
        # nacos 用户名
#        username:
        # nacos 用户名密码
#        password:
        # 是否启用导入检查
        import-check:
          enabled: false
        # 配置前缀,prefix是构成 dataId 的成员之一,如果不指定prefix,则默认使用spring.application.name
        # DataId 是 Nacos 配置管理中的关键组成部分,它用来区分不同的配置集。每个配置项都有一个唯一的 DataId,
        # 这使得用户可以方便地管理和检索特定的配置信息。例如,一个微服务应用可能会根据不同的环境(如开发、测试、生产)
        # 使用不同的配置文件,这时就可以用不同的 DataId 来表示这些配置文件。
        # 在Nacos Spring Cloud 中dataId的默认格式是: ${prefix}-${spring.profiles.active}.{file-extension}
        # 若未指定prefix,则默认使用${spring.application.name}
        prefix: ${spring.application.name}
        # 文件扩展名格式,默认 properties
        file-extension: yaml
        # 是否开启自动刷新,默认true
        refresh-enabled: true

  # 配置激活环境为dev
  profiles:
    active: dev
  # 应用名称
  application:
    name: config

server:
  port: 18084
management:
  endpoints:
    web:
      exposure:
        include: "*"

logging:
  level:
    com:
      alibaba:
        cloud:
          nacos:
            client: debug

nacos 配置:
image
读取配置时一直读取不到。

写法改成这样了

spring:
  cloud:
    nacos:
      serverAddr: 127.0.0.1:8848
      # 以下配置项必须填写
      username: 'nacos'
      password: 'nacos'
  config:
    import:
      - nacos:nacos-config-example.properties?refreshEnabled=true&group=DEFAULT_GROUP

@misakacoder 感谢你,等下我试试。

还是不行, application.yml:

spring:
  # 应用名称
  application:
    name: config
  # 配置激活环境为dev
  profiles:
    active: dev
  # Nacos配置
  cloud:
    nacos:
      config:
        enabled: true
        server-addr: 172.27.96.1:8848
        import-check:
          enabled: false
        # 配置前缀,prefix是构成 dataId 的成员之一,如果不指定prefix,则默认使用spring.application.name
        # DataId 是 Nacos 配置管理中的关键组成部分,它用来区分不同的配置集。每个配置项都有一个唯一的 DataId,
        # 这使得用户可以方便地管理和检索特定的配置信息。例如,一个微服务应用可能会根据不同的环境(如开发、测试、生产)
        # 使用不同的配置文件,这时就可以用不同的 DataId 来表示这些配置文件。
        # 在Nacos Spring Cloud 中dataId的默认格式是: ${prefix}-${spring.profiles.active}.{file-extension}
        # 若未指定prefix,则默认使用${spring.application.name}
        prefix: ${spring.application.name}
        # 文件扩展名格式,默认 properties
        file-extension: yaml
        # 开启自动刷新
        refresh-enabled: true
        import:
          - nacos:config-dev.yaml?refreshEnabled=true&group=DEFAULT_GROUP
        username: 'nacos'
        password: 'nacos'
logging:
  level:
    com:
      alibaba:
        cloud:
          nacos:
            client: debug

启动类:

@SpringBootApplication
@RestController
@RefreshScope // 开启nacos配置自动刷新
public class NacosConfigApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        String env = applicationContext.getEnvironment().getProperty("env");
        System.out.println("env:" + env);
    }

    // 读取nacos 名为configName的配置,若配置不存在则使用 default-env 作为默认值
    @Value("${env:default-env}")
    private String env;

    @GetMapping("/getEnv")
    public String getEnv() {
        return "env:" + env;
    }
}

image

不是读取key为configName的配置嘛,咋是env

读的就是 env 这个配置

最上面的例子是另外一台电脑的 下面是公司电脑的

@yibird 请问,你的问题解决了吗?
我升级spring 6.x,spring boot 3.x,spring cloud 2023,spring cloud alibaba 2023之后也遇到这样的问题,读取不到nacos中的配置,我使用的nacos server是2.3版本,将nacos-config 2023的传递依赖nacos-client换成2.3,问题依旧

你的配置改一下在试试

spring:
  application:
    name: xxxxx
  cloud:
    nacos:
      username: xx
      password: xx
      server-addr: 172.27.96.1:8848
      # 命名空间变成了公共的了,不知道为啥
      namespace: 你的命名空间
      discovery:
        namespace: 你的命名空间
        group: DEFAULT_GROUP
  # 注意看层级,config和nacos一个层级了。
  config:
    import:
      #这里弄个 namespace=命名空间 不生效要在上面弄个公共才可以
      - nacos:config-dev.yaml?refreshEnabled=true&group=DEFAULT_GROUP

#3882

问题解决了,我使用docker安装nacos-server,读取配置前只开放了8848端口,由于nacos2.x 引入GRPC优化通讯效率,需要额外开放9848、9849端口。docker安装nacos-server:

docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone nacos/nacos-server

我使用了官网的一个例子用于向nacos-server导入配置(172.26.32.1是本机ip):

curl -X POST "http://172.26.32.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=spring.cloud.nacos.config.serverAddr=172.26.32.1:8848%0Aspring.cloud.nacos.config.prefix=PREFIX%0Aspring.cloud.nacos.config.group=GROUP%0Aspring.cloud.nacos.config.namespace=NAMESPACE"

image
我自己也创建了一个配置:
image

application.yml配置:

server:
  port: 18084

spring:
  application:
    name: nacos-config-example
  cloud:
    nacos:
      config:
        serverAddr: 172.26.32.1:8848
        username: 'nacos'
        password: 'nacos'
        import-check:
          enabled: false
        # 配置前缀,prefix是构成 dataId 的成员之一,如果不指定prefix,则默认使用spring.application.name
        # DataId 是 Nacos 配置管理中的关键组成部分,它用来区分不同的配置集。每个配置项都有一个唯一的 DataId,
        # 这使得用户可以方便地管理和检索特定的配置信息。例如,一个微服务应用可能会根据不同的环境(如开发、测试、生产)
        # 使用不同的配置文件,这时就可以用不同的 DataId 来表示这些配置文件。
        # 在Nacos Spring Cloud 中dataId的默认格式是: ${prefix}-${spring.profiles.active}.{file-extension}
        # 若未指定prefix,则默认使用${spring.application.name}
        prefix: ${spring.application.name}
        # 文件扩展名格式,默认 properties
        file-extension: properties
        # 开启自动刷新,当配置发生变化后自动推送并刷新
        refresh-enabled: true
  config:
    import:
      - nacos:nacos-config-example.properties?refreshEnabled=true&group=DEFAULT_GROUP
      - nacos:config-dev.yml?refreshEnabled=true&group=DEFAULT_GROUP
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: '*'
logging:
  level:
    com.alibaba.cloud.nacos.configdata: debug

读取配置类:

package com.fly.example;

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

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/nacos/annotation")
@RefreshScope
public class ValueAnnotationExample {

	@Value("${spring.cloud.nacos.config.serverAddr:}")
	private String serverAddr;

	@Value("${spring.cloud.nacos.config.prefix:}")
	private String prefix;

	@Value("${spring.cloud.nacos.config.group:}")
	private String group;

	@Value("${spring.cloud.nacos.config.namespace:}")
	private String namespace;

	@Value("${env:default-env}")
	private String env;

	@GetMapping
	public Map<String, String> getConfigInfo() {
		Map<String, String> result = new HashMap<>(5);
		result.put("serverAddr", serverAddr);
		result.put("prefix", prefix);
		result.put("group", group);
		result.put("namespace", namespace);
		result.put("env", env);
		return result;
	}
}

由于加了日志,启动项目就会出现读取配置的信息:

image

读的就是 env 这个配置

我就是按官网最新文档配置的,这样就可以的,我的Nacos是启动的源码,应该和这个没关系

image
image

spring:
  application:
    name: alibaba-auth
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      config:
        namespace: spring-cloud-alibaba
        import-check:
          enabled: false
      discovery:
        namespace: spring-cloud-alibaba
  config:
    import:
      - nacos:${spring.application.name}.yml?refreshEnabled=true

你是用docker安装的?是多少版本?

你用docker 安装nacos-server 只开放8848端口 就有可能出现我遇到的问题