Nacos配置中心遇到的问题

简介

最近在自己搭建的单机nacos使用中遇到的配置中心问题,这里做一个总结。

参考

SpringCloud Alibaba 2021版 nacos 配置中心教程

SpringBoot使用spring.config.import多种方式导入配置文件

解决 Spring Cloud 2021.0.5 版本,使用 nacos 做配置中心,报 No spring.config.import property has been defined 的问题

SpringCloud + Nacos 配合maven,进行环境(配置文件)的切换,dev/ prod/ test 三种环境

nacos从1.x升级到2.x需要注意的地方

Nacos使用2.0.1版本启动出现9848端口错误的解决方式(亲测有效)

放在最前

spring-cloud-alibaba版本说明

在使用spring-cloud-alibaba之前一定要了解的版本说明,一定要使用官方推荐的版本对应关系,避免出现异常问题。

问题根源

本质上一句话:版本兼容

简单概括:1.x版本nacos-client能访问2.x版本nacos-server,但是2.x版本nacos-client不能访问1.x nacos-server

nacos2.x1.x的变化还是挺大的,尤其是我在使用配置中心功能时,折磨我两天,怎么也没找到问题解决方法。更我奇怪的是之前学习nacos时搭的一个项目能正常启动,注册并访问到配置文件,然而新搭建的项目就是各种问题,Could not resolve placeholderConnection refused: no further information: xxxxx:9848等等报错,更关键的是我使用maven管理项目环境,通过@@的方式配置的配置文件,期间还一直怀疑是这个的原因。总之,查了许多博客,看了很多解决方案,也都尝试了,最终还是解决了。

问题总结

声明:我没有细抠本质,或是说源码,只是说我遇到问题的解决,帮助其他人避免这些问题。

版本统一

这个是必须的,一定要按照官方的版本对应关系引入,不然第一步就错了。

明确版本

明确版本后就是用对应的使用方式,nacos2.x1.x,前面提到我怀疑过是因为maven对环境配置所以导致我使用nacos产生问题的,后来排查出不是它,也就不带maven讨论了,SpringCloud + Nacos 配合maven,进行环境(配置文件)的切换,dev/ prod/ test 三种环境感兴趣的看这篇文章。

新特性及其使用(引用)

  • 支持 spring.config.import 这里假设有一个配置文件(bootstrap.yml),升级到新版本应该怎么配置呢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# bootstrap.yml
spring:
cloud:
nacos:
config:
name: test.yml
group: DEFAULT_GROUP
server-addr: 127.0.0.1:8848
extension-configs:
- dataId: test01.yml
group: group_01
- dataId: test02.yml
group: group_02
refresh: false

这两个配置是等价的

1
2
3
4
5
6
7
8
9
10
11
12
13
# application.yml
spring:
cloud:
nacos:
config:
group: DEFAULT_GROUP
server-addr: 127.0.0.1:8848
config:
import:
- optional:nacos:test.yml # 监听 DEFAULT_GROUP:test.yml
- optional:nacos:test01.yml?group=group_01 # 覆盖默认 group,监听 group_01:test01.yml
- optional:nacos:test02.yml?group=group_02&refreshEnabled=false # 不开启动态刷新
- nacos:test03.yml # 在拉取nacos配置异常时会快速失败,会导致 spring 容器启动失败

注意事项:

如果使用 spring.config.import 就不能使用 bootstrap.yml/properties 引入配置的方式了 !!!

如果引入了spring-cloud-starter-alibaba-nacos-config,并且使用 import 方式导入配置,项目启动时会自动检测是否引入了 nacos:条目,如果没有 import nacos 条目,会出现如下错误:

1
2
3
4
5
The spring.config.import property is missing a nacos: entry
Action:
Add a spring.config.import=nacos: property to your configuration.
If configuration is not required add spring.config.import=optional:nacos: instead.
To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.

你可以手动通设置 spring.cloud.nacos.config.import-check.enabled=false 关闭它,但是不建议这么做,这个功能可以帮助你检查是否引入多余依赖

假如想保留以前的使用方式 (bootstrap引入配置),你只需要添加依赖 pring-cloud-starter-bootstrap 依赖,不需要修改一行代码

新版的配置方式是有些不同的,我的建议还是使用新版就遵循新版。

端口开放与配置建议

新版nacos除了需要开放8848外还需要98489849端口。

生产建议的话,除了严格限制源ip注册访问到nacos外,建议有需要的加上权限访问配置,另外关于namespacegroupdataid,建议如下:

namespace:建议与git常驻分支一致,如devtestpreprod,一个命名空间下有着一整套类同于生产的服务和配置。

group:建议与团队组织架构一致,如:技术研发部、中台研发部、后台研发部、客户端研发部、数据研发部等等,取其英文简称即可

dataid:建议与项目名称一致,一般格式是xxx-xxx-xxx,这个就自由一点了,约定一下就好,问题不大

Nacos naming推送失败/failedPush异常指标激增

Nacos naming推送失败数 · Issue #6841

Nacos集群failedPush异常指标激增 · Issue #8676

因为我是使用官网nacos单节点docker-compose部署方式部署的,另外带了prometheusgrafana,而且配置了nacos监控和钉钉报警,所以也一直被这个问题困扰。

如有类似疑问,先看上面Issue,其实上面的没有给我太多帮助,反而将nacos重启一下就没问题,我猜测很有可能是之前错误注册后读取配置失败次数太多有关,我暂时也不想深究了。