SpringCloud2020版新特新
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
Nacos官网配置中心所要求的Data Id格式
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
POM文件
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般基础配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
明确一点bootstrap的读取优先级是高于application的
bootst.yaml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yaml
spring:
profiles:
active: dev #表示开发环境
根据官网给出的配置中心的配置文件来看结合application跟bootstrap两个配文件
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
//就等价于
nacos-config-client-dev.yaml
在在Nacos中配置一个配置文件
而Data ID就需要根据上面的nacos-config-client-dev.yaml来进行配置
(注意,目前仅支持yaml和properties,但不支持yml,虽然yaml跟yml都一样,但是这两个是文件的后缀名,所以是不一样的)
主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3377.class,args);
}
}
Controller
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
启动程序,控制台打印错误
第一个错误
java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank
很明显就是说serviceName的名字为空
第二个错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.configClientController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"
这个错误的意思就是说,${config.info}没有这个值
这是为什么呢?
我们来尝试解决第一个问题服务名不能为空
而serviceName的默认名称就是spring.application.name
而spring.application.name我们明明配置了
第二个问题找不到值,但是我们在nacos配置中心配置的相应的配置
但为什么又没有值呢?
这时我们就需要想起springcloud2020版的新特性
bootstrap的优先级比application高,那么是不是因为bootstrap这个配置文件没有被解析到呢?所以我们在pom文件中加上一个新的坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
让bootstrap被解析到
重启服务
无任何报错
说明bootstrap文件被解析到
访问我们的controller中的GetMapper地址
在于我们在nacos中的配置进行比较
发现两个配置一直,成功
2021我们将变得更好,共勉