nacos 无法拉取拉取前言 之前在和同学一起买了个云服务器,在上面安装了nacos,于是这几天就做个demo学一下呢,
前言
之前在和同学一起买了个云服务器,在上面安装了nacos,于是这几天就做个demo学一下呢,按照官方文档一步两步的来,发现启动就报错。无奈啊,不知道啥原因。下面一起一步两步的来分析吧。
问题描述
启动的时候直接抛
Could not resolve placeholder 'me.user' in value "${me.user}"
从日志上看没有发现nacos
报错,只是没有读取到配置,导致的属性注入失败,从而引起createBean error 导致程序无法启动。
启动环境: JDK11 、nacos-config-spring-boot-starter:0.2.12、springboot:2.4.5、nacos:2.4.1(standalone)
排查步骤
先去官网看看吧,官网并没有nacos
界面上操作的步骤,会不会是我配置有问题:
因为官网上的配置步骤,直接通过调用接口的形式,然后我使用官网中提供的查询接口在本地浏览器执行了一下
确认配置能获取到。
然后百度搜索,没有找到觉得靠谱的答案。既然网上没啥靠谱的答案,那我就跟一下源码吧。
-
查看关键日志 有两个warn日志,从第一个
warn
中得出获取到得配置文件内容为空 -
定位打印这行的代码 从上面第一个
warn
日志中可以找到是AnnotationNacosPropertySourceBuilder
类输出,但是我们通过搜索There is no content
没有搜索到。还好我已经不是菜鸟了,既然本类没有那就肯定是有继承的父类,通过调用父类方法打印出来。 没错和我想的一样,这个日志是在其父类AbstractNacosPropertySourceBuilder
中有日志打印 -
定位到问题代码开始debug,看看能不能通过源码去找到问题的所在,继续深入load方法,中间步骤省略。
上图主要有的两行代码用红色方框框起来了,第一行是首先从本地缓存获取,第二行的逻辑就是通过接口调用了。所以项目启动从本地缓存没有获取到文件,我们就继续深入dubug第二行从服务器获取配置。
-
反复debug终于让我找到关键问题所在了
错误解读:
实际建立连接的时候,是把我的8848端口加了一个偏移量的端口,最终建立连接的端口是9848端口。正确解读: 看到这儿我还以为拉取配置的端口就是偏移后的端口,这个端口相当于一个监控端口。仔细看302行servercheck
顾名思义服务监测。功夫不负有心人啊,最后还是找到问题的关键所在,原来我本地能telnet 8848端口,却不能访问9848端口,官网上也没有看到关于这方面的说明啊。。。。。
解决方案
因为我的nacos是部署到云服务器的,并且我的9848端口没有开放出来的,所以访问不到,难受啊。打开9848的端口就可以了
集群模式和单机模式的偏移量还不一样。所以小伙伴在学习nacos的时候要注意了,nacos有两个端口,一个拉取配置的端口就是我们配置文件的端口,另一个端口就是偏移之后的接口;
总结
主要要是不了解nacos
运行机制吧,除了我们配置的端口,还有一个经过偏移计算的监测端口。
并且nacos
会把配置放到本地缓存、如果本地存在缓存,同时我们的监测端口访问不到,我们配置也不会更新。
出现这个问题还有一部分原因是因为没有阅读官方文档的部署手册概览
其实官网也对偏移端口进行了说明的。
监测端口主要作用
在微服务架构中,不同服务之间可能会有大量的实例并发运行,使用偏移后的端口可以有效管理这些实例。 在云原生环境中,服务的生命周期是动态的,使用动态端口能够更好地适应服务的伸缩需求。
- 服务注册与发现: Nacos 支持动态端口,可以在服务启动时随机选择一个可用的端口进行注册。这对于需要多个实例或多个服务共享同一 IP 地址的情况非常重要。
- 避免端口冲突: 在容器化环境(如 Docker 或 Kubernetes)中,多个服务可能会尝试在相同的主机上运行。动态端口可以帮助避免端口冲突,确保每个服务实例都能正常运行。
- 负载均衡: Nacos 在服务发现时可以根据偏移后的端口提供负载均衡。通过注册不同端口的服务实例,Nacos 可以实现更灵活的负载均衡策略。
- 高可用性: 当某个服务实例的固定端口不可用时,使用动态端口可以快速切换到其他可用端口,增强系统的高可用性。 灵活性与扩展性: 动态端口使得在不同环境中部署服务时更加灵活,尤其是在开发、测试和生产环境之间的迁移。
ps:所以还是得搞个云服务器模拟生产环境,需要的联系我更便宜
转载自:https://juejin.cn/post/7415800060913877042