项目场景:

今天尝试使用spring boot 3.3和spring cloud 2023.0.3 版本搭建一个新项目,发现无法解析bootstrap.yml


问题描述

方案一

启动项目无法读取bootstrap.yml文件中配置中心,查看官方文档发现,Spring Boot 2.4 引入了一种通过属性导入配置数据的新方法spring.config.import。现在这是绑定到配置服务器的默认方式,,如果还想使用原先的bootstrap配置文件则可以使用下面的解决方式:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>4.0.4</version>
    </dependency>

设置 spring.cloud.bootstrap.enabled=true,可以正常启动

方案二 (推荐,官方默认的)

application.properties中添加配置项pring.config.import=optional:configserver:http://myhost:8888,再项目中使用的nacos 配置中心,所以使用下面的配置:

spring:
  cloud:
    nacos:
      config:
 #      server-addr 必须有该项,替换成自己的nacos地址,其他都可选
        server-addr: http://172.23.192.1:8848
        group: DEFAULT_GROUP
        file-extension: yml
        namespace: ${spring.profiles.active}
        prefix: ${spring.application.name}
  config:
    import: "optional:nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}?group=DEFAULT_GROUP"

import 中的格式如下:

optional:nacos:data-id?group=&refreshEnabled=&preference=remote

除了data-id是必须的,其他都是可选的,当uri中的配置优先获取,当没有则使用spring.cloud.nacos.config 中的配置或默认配置
优先获取uri中的group参数, file-extension首先解析date-id的后缀名,如果没有则使用系统默认properties,

具体代码查看 com.alibaba.cloud.nacos.configdata.NacosConfigDataLocationResolver#loadConfigDataResources


	private List<NacosConfigDataResource> loadConfigDataResources(
			ConfigDataLocation location, Profiles profiles,
			NacosConfigProperties properties) {
		List<NacosConfigDataResource> result = new ArrayList<>();
		URI uri = getUri(location, properties);

		if (StringUtils.isBlank(dataIdFor(uri))) {
			throw new IllegalArgumentException("dataId must be specified");
		}

		NacosConfigDataResource resource = new NacosConfigDataResource(properties,
				location.isOptional(), profiles, log,
				new NacosItemConfig().setGroup(groupFor(uri, properties))
						.setDataId(dataIdFor(uri)).setSuffix(suffixFor(uri, properties))
						.setRefreshEnabled(refreshEnabledFor(uri, properties))
						.setPreference(preferenceFor(uri)));
		result.add(resource);

		return result;
	}
# 其他方法略,只给出data-id的解析

private String dataIdFor(URI uri) {
		String path = uri.getPath();
		// notice '/'
		if (path == null || path.length() <= 1) {
			return StringUtils.EMPTY;
		}
		String[] parts = path.substring(1).split("/");
		if (parts.length != 1) {
			throw new IllegalArgumentException("illegal dataId");
		}
		return parts[0];
	}

上述代码使用的版本是:

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐