springboot-gulimall-d10
上一级页面:springboot-gulimall
前言
决心要记一下学习谷粒商城过程中的笔记,为了防止以后忘个干净,由于不知道是我学习的第几天,而且是从今天才开始记录,为了防止以后索引出现错乱,直接从day10开始计数,之前的部分再根据回忆满满的补起来
nacos启动的一些注意点
见前面一天的笔记,nacos现在默认不是单机模式启动,而是集群模式启动,所以启动命令要指定用单机模式启动
nacos做配置中心
首先查看官方的文档和示例
首先按照官方文档进行,出现的坑
由于教程里使用的是旧版本的nacos,那时候springboot还自动加载了bootstrap的依赖,所以视频里使用bootstrap.properties
做为nacos配置中心的配置文件。
而我使用较新版本的springboot和nacos,已经不自动加载bootstrap的依赖项,并且也不需要这个依赖项了。
所以我尝试跟着官方文档的新方案,结果出问题了。
如果你在配置文件中写入一下内容,可能会遇到报错
spring:
cloud:
nacos:
# 配置中心
# 也可以写做 server-addr
serverAddr: 127.0.0.1:8848
# 发现中心
discovery:
server-addr: 127.0.0.1:8848
config:
import:
#naco做配置中心
- nacos:gulimall-coupon.properties?refresh=true
application:
name: gulimall-coupon
这里关键的一句是
- nacos:gulimall-coupon.properties?refresh=true
其中,gulimall-coupon.properties
是告诉springboot,我这个模块使用哪个配置文件,
nacos默认使用[applicationName].properties
作为配置文件,我这里的applicationName是gulimall-coupon,所以对应的配置文件是gulimall-coupon.properties
。
在较新的nacos版本中,也可以自己指定配置文件名称,办法就是修改这条语句.
- nacos:gulimall-coupon.properties?refresh=true
另外,这里的?refresh=true
本意是开启配置的自动刷新,
但是又遇到一个尴尬的问题,就是在非常新的springboot版本中,它会报错。
原因应该是你项目的springboot版本太新了,
当初设计nacos的时候,强绑定springboot2.4 spring.config.import功能,没做好防腐。
version:spring boot 2.7.3 nacos 2.1.1(我也是这个版本)
解决方案是,暂时按照谷粒商城视频那样,改用bootstrap的方案
谷粒商城使用的旧方案:依赖项和配置文件
教程里使用的是旧版本的nacos,那时候springboot还自动加载了bootstrap
的依赖,所以视频里使用bootstrap.properties
做为nacos配置中心的配置文件。
(网上查资料发现,这个bootstrap
方案从2020年开始就已经过时了。。。后来又发现现在公司还在普遍用这个方案)
较新版本的springboot已经不自动加载bootstrap的依赖项,所以这里手动引入bootstrap的依赖。
手动引入bootstrap的依赖也防止未来由于缺乏依赖出现奇怪报错
common模块里的pom.xml引入依赖
<!-- nacos 做配置中心 需要的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- bootstrap.properties 需要的依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<!-- <version>4.0.3</version>-->
</dependency>
在要使用nacos的具体的模块中,
添加一个配置文件,例如coupon模块
新建bootstrap.properties
,内容如下
# 应用的名称,nacos会自动读取,对应nacos配置列表里的gulimall-coupon.properties
spring.application.name=gulimall-coupon
# nacos server的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
使用方式
在nacos的配置列表里加入`[applicationName].properties',
我的applicationName是gulimall-coupon
,则新增配置文件的dataid是gulimall-coupon.properties
无法自动刷新?
在需要动态获取配置的类中,添加注解,
@RefreshScope
这样可以自动刷新配置文件,网上也有其他的一些注解方案,也能实现自动刷新。见Nacos修改配置,数据不刷新问题 - 张亮java - 博客园 (cnblogs.com)
但是遇到问题了,我这边死活不能自动刷新,它可以读取到nacos里定义的配置文件没错,但是他就是不能自动刷新。
自己去读springboot的控制台日志
![../../../images/Pasted image 20230715201915.png](https://webdav-1309345210.file.myqcloud.com/images/Pasted image 20230715201915.png)
coupon.user.age: 28, type=properties
2023-07-15 20:14:38.147 INFO 25852 --- [-127.0.0.1_8848] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848] [notify-context] dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, md5=3b8fd07dbde87a929cb987affd9f2263
2023-07-15 20:14:45.427 INFO 25852 --- [-127.0.0.1_8848] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname
2023-07-15 20:14:45.490 INFO 25852 --- [-127.0.0.1_8848] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2023-07-15 20:14:45.690 WARN 25852 --- [-127.0.0.1_8848] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[gulimall-coupon] & group[DEFAULT_GROUP]
2023-07-15 20:14:45.701 INFO 25852 --- [-127.0.0.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon,DEFAULT_GROUP'}]
2023-07-15 20:14:45.710 INFO 25852 --- [-127.0.0.1_8848] o.s.boot.SpringApplication : No active profile set, falling back to 1 default profile: "default"
2023-07-15 20:14:45.752 INFO 25852 --- [-127.0.0.1_8848] o.s.boot.SpringApplication : Started application in 7.595 seconds (JVM running for 712.099)
2023-07-15 20:14:45.973 INFO 25852 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [coupon.user.age]
2023-07-15 20:14:45.974 INFO 25852 --- [-127.0.0.1_8848] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848] [notify-ok] dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, md5=3b8fd07dbde87a929cb987affd9f2263, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@601a3eaf
2023-07-15 20:14:45.974 INFO 25852 --- [-127.0.0.1_8848] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848] [notify-listener] time cost=7827ms in ClientWorker, dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, md5=3b8fd07dbde87a929cb987affd9f2263, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@601a3eaf
注意这句
2023-07-15 20:14:45.973 INFO 25852 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [coupon.user.age]
控制台日志告诉我已经刷新了。。。我现在再去刷新一下网页,发现真的刷新了。。。
总结就是,nacos更新配置后需要等一会儿,你直接看日志,日志告诉你刷新好了就行了。
如果还不行,可以先尝试无缓存模式刷新网页
![../../../images/Pasted image 20230715202448.png](https://webdav-1309345210.file.myqcloud.com/images/Pasted image 20230715202448.png)
打开控制台->网络->禁用缓存,然后刷新网页
如果还不行,那就是nacos、spring cloud、springboot的版本兼容问题,这个就麻烦了,你得上网查一下版本对应关系。
建议这时候你直接跟着谷粒商城教程里的版本来,初学者别折腾版本问题了。这个很麻烦的
在公司的实际业务里也会遇到这种版本号问题,一搞就是半天,只能靠查资料和不断尝试。
引申
如果你使用共享配置,不自动刷新,见这篇Nacos-Config自动刷新无效的排查 - 掘金 (juejin.cn)