SpringBoot与Nacos整合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot与Nacos整合相关的知识,希望对你有一定的参考价值。
参考技术A上一篇笔者已经介绍怎么安装Nacos了,这篇就开始重头戏。
nacos-config这个依赖就相当于SpringCloud Config,nacos-discovery这个依赖就相当于Eureka。
先将nacos-discovery依赖进行注释,先来实现config
在项目中创建bootstrap.yml文件,加入以下配置
然后登录nacos,在nacos页面选择配置管理,创建配置文件
这里主要配置三个东西,Data ID、Group 以及要配置的内容。
Data Id 的格式是 $prefix-$spring.profile.active.$file-extension
$prefix 的值,默认为 spring.application.name 的值
$spring.profile.active 表示项目当前所处的环境
$file-extension 表示配置文件的扩展名
提供测试的Controller
然后调用接口: http://localhost:8080/hello
将nacos-discovery依赖注释放开
在nacos节点下增加配置
启动项目,登录nacos。可以看到服务管理 -》服务列表中有注册上来的服务的相关信息。
注:如果配置中心与当前应用的配置文件都配置了相同的key,优先使用配置中心的配置。
在实际开发中,我们不可能将所有的配置同时放在同一个配置文件中,那样会显得多而有杂。
接下来笔者会将product-dev.yaml里的有的配置拆分出来成为datasource-dev.yaml、mybatis-plus-dev.yaml。
然后在应用程序的bootstrap.yml里的config节点下增加配置:
nacos 使用记
本文记录SpringBoot和SpringCloud与Nacos作为配置中心的整合过程及问题
Nacos官方使用文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
何为配置中心: https://www.cnblogs.com/yelao/p/10741156.html
本文仅记录整合过程中的细节问题
1. Nacos简介
参见官方文档;
2. Nacos安装
参见官方文档,推荐使用 下载编译后压缩包方式 安装
安装完成后,按照官方文档调试可能出现下图问题:
startup.sh: [[: not found
问题原因:自行百度 bash与sh区别:
使用bash命令运行:
bash startup.sh -m standalone
结果如图
3. nacos 之 spring boot 配置管理
参见官方文档
问题一: 配置文件为yaml格式(阶梯格式)时无法解析 ,如下
配置:
引用:
@NacosValue(value="${log.time}",autoRefreshed=true) private String time;
出现异常:无法解析
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘log.time‘ in value "${log.time}" at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:839) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE] at com.alibaba.nacos.spring.context.annotation.config.NacosValueAnnotationBeanPostProcessor.doGetInjectedBean(NacosValueAnnotationBeanPostProcessor.java:82) ~[nacos-spring-context-0.2.2-RC1.jar:na] at com.alibaba.nacos.spring.context.annotation.config.NacosValueAnnotationBeanPostProcessor.doGetInjectedBean(NacosValueAnnotationBeanPostProcessor.java:54) ~[nacos-spring-context-0.2.2-RC1.jar:na] at com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor.getInjectedObject(AnnotationInjectedBeanPostProcessor.java:330) ~[spring-context-support-1.0.1.jar:na] at com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor$AnnotatedFieldElement.inject(AnnotationInjectedBeanPostProcessor.java:510) ~[spring-context-support-1.0.1.jar:na] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE] at com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor.postProcessPropertyValues(AnnotationInjectedBeanPostProcessor.java:118) ~[spring-context-support-1.0.1.jar:na] ... 22 common frames omitted
问题解决一:放弃使用yaml阶梯状格式,使用增量式,或改用properties
如:
问题解决二:放弃使用spring boot , 使用spring cloud
4. nacos 之 spring cloud 配置管理
参见官方文档
此处介绍配置细节:resource/sbootstrap.properties
# Nacos 服务地址 spring.cloud.nacos.config.server-addr=192.168.52.128:8848 # Nacos 控制台添加配置: # Data ID:example-dev.properties # Group:test # 配置内容:useLocalCache=true
# 对应 dataId
spring.application.name=example
spring.profiles.active=dev # 指定配置的后缀,支持 properties、yaml、yml,默认为 properties spring.cloud.nacos.config.file-extension=properties #spring.cloud.nacos.config.file-extension=yaml
# 对应group
#spring.cloud.nacos.config.group=test
详情参见: https://blog.csdn.net/zjcjava/article/details/88316190
5. 自动刷新Bean
- spring boot:
@NacosValue(value="${log.time}",autoRefreshed=true),会自动刷新其注解的属性,或运行其注解的方法,根据Bean注入规则进行刷新 Bean
- spring cloud
使用spring cloud 原生注解 @RefreshScope 和 @Value
@RefreshScope注解的方法Bean 和 类 会自动刷新,重新生成
注意:
使用@RefreshScope注解的Bean才会重新生成
如,类上注解
@Component @RefreshScope public class TestBean { @Value("${log.time}") private String time; public String getTest() { return time; } }
方法注解
@Configuration public class Conff { @Value("${log.time}") private String time; @Bean @RefreshScope public TestBean getString() { System.out.println("hello"); return new TestBean(time); } }
具体的依赖注入内容还需对spring进行深入学习,以及@RefreshScope原理的把握
注意: Nacos服务并不稳定,会出现更新异常或读取异常的现象,如果在开发过程中出现不解异常或现象,请怀疑Nacos服务(直接重启,因为有些可能是你想不到的Nacos现象,你觉得它没错,但它就是错了)
以上是关于SpringBoot与Nacos整合的主要内容,如果未能解决你的问题,请参考以下文章
springboot整合SpringCloud Nacos实现配置管理和服务发现
springboot整合SpringCloud Nacos实现配置管理和服务发现