Nacos for SpringBoot 3

Nacos for SpringBoot 3

Nacos /nɑ:kəʊs/ 是 Naming and Configuration Service 的首字母缩写,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。我们相信一切都是服务,每个服务节点被构想为一个星球,每个服务都是一个星系。Nacos 致力于帮助建立这些服务之间的连接,助力每个面向星辰的梦想能够透过云层,飞在云上,更好的链接整片星空。
随着 Spring Cloud Alibaba 对 SpringBoot 3 的逐步支持,Nacos 作为 Spring Cloud Alibaba 生态的重要成员之一(Spring Cloud Starter Alibaba Nacos Discovery 与 Spring Cloud Starter Alibaba Nacos Config)也急需支持 SpringBoot 3,已提供更强健、更前沿的技术支持。Nacos SpringBoot 3 的变动分为依赖变动、外部变动与内部变动部分,参考以下两个标题中的变动内容将协助 Nacos 使用者、Nacos 生态开发者进一步了解 Nacos SpringBoot 3 的变化。

依赖变动

Archive Old Version New Version Description
java 1.8 17 最低支持的 JDK 版本
spring-boot-dependencies 2.7.18 3.3.1 与 SpringBoot 相关的依赖
servlet-api 3.0 6.1.0 与 Servlet 相关的依赖
spring 5.3.34 6.1.10 与 Spring 相关的依赖
spring-security 5.7.12 6.3.1 与 Spring Security 相关的依赖
httpcomponents 4.1.5 5.3.1 与 Apache HTTP Components 相关的依赖
micrometer 1.9.17 1.12.8 与 Micrometer 相关的依赖
slf4j-api 1.7.26 2.0.13 与 slf4j 相关的依赖
logback 1.2.13 1.5.6 与 logback 相关的依赖
maven-pmd-plugin 3.8 3.15.0 与 pmd 代码格式相关的插件
p3c-pmd 1.3.0 2.1.1 与 p3c 代码格式相关的插件
maven-shade-plugin 3.2.4 3.6.0 与 Maven Shade 相关的打包插件
grpc-java 1.57.2 1.65.1 与 grpc 相关的依赖
grpc-util - 1.65.1 从 grpc 新版本中拆分出来的 util 模块
grpc-inprocess - 1.65.1 从 grpc 新版本中拆分出来的 inprocess 模块
findbugs-maven-plugin 3.0.4 - 因不再支持 JDK 17 被移除
soptbugs-maven-plugin - 4.8.6.2 在 JDK 17 中替代 findbugs

迁移指南

Nacos for SpringBoot 3 是基于 Nacos 2.4.0 进行升级改造的,如果您正在使用 Nacos 2.0 及以上版本基本可以最小破坏性的迁移与更新。迁移过程中可能存在的破坏性变动主要有以下几个方面:application.properties 健康监测配置项命名发生变动、Micrometer 的 nacos_monitor 相关指标发生变动。

配置变动

该破坏性变更取决于升级至 SpringBoot 3 后,Micrometer 依赖相关的配置项命名空间发生变化。配置的命名空间格式由原先的 management.metrics.export.<platform>.<argument>=<value> 变更为 management.<platform>.metrics.export.<argument>=<value> 。参考下面的案例可以快速迁移:

### OLD
### Metrics for elastic search
management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

### NEW
### Metrics for elastic search
management.elastic.metrics.export.enabled=false
#management.elastic.metrics.export.host=http://localhost:9200

或者您也可以参考最新的 Release 包中的 application.properties 配置文件进行修改。

健康监测命名变动

在旧的 Nacos 中(2.4.0 及以下),监控指标 nacos_monitor 同时来自于 SummaryGauge 两个度量类型,在升级至新版本的 Micrometer 后,若在客户端启用了 Prometheus(普罗米修斯)并访问端点 /nacos/actuator/prometheus 时该两种度量类型现在进行了区分。其中 Summary 度量类型数据由 nacos_monitor 命名变更为 nacos_monitor_summaryGauge 度量类型数据保持为 nacos_monitor,具体可见下面的参考:

# OLD
# HELP nacos_monitor  
# TYPE nacos_monitor gauge
nacos_monitor{module="naming",name="mysqlHealthCheck",} 0.0
nacos_monitor{module="naming",name="emptyPush",} 0.0
nacos_monitor{module="config",name="configCount",} 0.0
nacos_monitor_count{module="core",name="raft_read_from_leader",} 0.0
nacos_monitor_sum{module="core",name="raft_read_from_leader",} 0.0
nacos_monitor{module="naming",name="tcpHealthCheck",} 0.0
nacos_monitor{module="naming",name="serviceChangedEventQueueSize",} 0.0
nacos_monitor{module="core",name="longConnection",} 0.0
nacos_monitor{module="naming",name="totalPush",} 0.0
nacos_monitor{module="naming",name="serviceSubscribedEventQueueSize",} 0.0
nacos_monitor{module="naming",name="serviceCount",} 0.0
nacos_monitor{module="naming",name="httpHealthCheck",} 0.0
nacos_monitor{module="naming",name="maxPushCost",} -1.0
nacos_monitor{module="config",name="longPolling",} 0.0
nacos_monitor{module="naming",name="failedPush",} 0.0
nacos_monitor{module="naming",name="leaderStatus",} 0.0
nacos_monitor{module="config",name="publish",} 0.0
nacos_monitor{module="config",name="dumpTask",} 0.0
nacos_monitor_count{module="core",name="raft_read_index_failed",} 0.0
nacos_monitor_sum{module="core",name="raft_read_index_failed",} 0.0
nacos_monitor{module="config",name="notifyTask",} 0.0
nacos_monitor{module="config",name="fuzzySearch",} 0.0
nacos_monitor{module="naming",name="avgPushCost",} -1.0
nacos_monitor{module="config",name="getConfig",} 0.0
nacos_monitor{module="naming",name="totalPushCountForAvg",} 0.0
nacos_monitor{module="naming",name="subscriberCount",} 0.0
nacos_monitor{module="naming",name="ipCount",} 0.0
nacos_monitor{module="config",name="notifyClientTask",} 0.0
nacos_monitor{module="naming",name="totalPushCostForAvg",} 0.0
nacos_monitor{module="naming",name="pushPendingTaskCount",} 0.0
# HELP nacos_monitor_max  
# TYPE nacos_monitor_max gauge
nacos_monitor_max{module="core",name="raft_read_from_leader",} 0.0
nacos_monitor_max{module="core",name="raft_read_index_failed",} 0.0
# HELP nacos_monitor_seconds_max  
# TYPE nacos_monitor_seconds_max gauge
nacos_monitor_seconds_max{module="core",name="raft_apply_log_timer",} 0.0
nacos_monitor_seconds_max{module="core",name="raft_apply_read_timer",} 0.0
# HELP nacos_monitor_seconds  
# TYPE nacos_monitor_seconds summary
nacos_monitor_seconds_count{module="core",name="raft_apply_log_timer",} 0.0
nacos_monitor_seconds_sum{module="core",name="raft_apply_log_timer",} 0.0
nacos_monitor_seconds_count{module="core",name="raft_apply_read_timer",} 0.0
nacos_monitor_seconds_sum{module="core",name="raft_apply_read_timer",} 0.0
# NEW
# TYPE nacos_monitor summary
nacos_monitor_count{module="core",name="raft_read_from_leader"} 0
nacos_monitor_sum{module="core",name="raft_read_from_leader"} 0.0
nacos_monitor_count{module="core",name="raft_read_index_failed"} 0
nacos_monitor_sum{module="core",name="raft_read_index_failed"} 0.0
# HELP nacos_monitor
# TYPE nacos_monitor_gauge gauge
nacos_monitor{module="config",name="configCount"} 4.0
nacos_monitor{module="config",name="dumpTask"} 0.0
nacos_monitor{module="config",name="fuzzySearch"} 0.0
nacos_monitor{module="config",name="getConfig"} 0.0
nacos_monitor{module="config",name="longPolling"} 0.0
nacos_monitor{module="config",name="notifyClientTask"} 0.0
nacos_monitor{module="config",name="notifyTask"} 0.0
nacos_monitor{module="config",name="publish"} 0.0
nacos_monitor{module="core",name="longConnection"} 2.0
nacos_monitor{module="naming",name="avgPushCost"} -1.0
nacos_monitor{module="naming",name="emptyPush"} 0.0
nacos_monitor{module="naming",name="failedPush"} 0.0
nacos_monitor{module="naming",name="httpHealthCheck"} 0.0
nacos_monitor{module="naming",name="ipCount"} 1.0
nacos_monitor{module="naming",name="leaderStatus"} 0.0
nacos_monitor{module="naming",name="maxPushCost"} -1.0
nacos_monitor{module="naming",name="mysqlHealthCheck"} 0.0
nacos_monitor{module="naming",name="pushPendingTaskCount"} 0.0
nacos_monitor{module="naming",name="serviceChangedEventQueueSize"} 0.0
nacos_monitor{module="naming",name="serviceCount"} 1.0
nacos_monitor{module="naming",name="serviceSubscribedEventQueueSize"} 0.0
nacos_monitor{module="naming",name="subscriberCount"} 0.0
nacos_monitor{module="naming",name="tcpHealthCheck"} 0.0
nacos_monitor{module="naming",name="totalPush"} 0.0
nacos_monitor{module="naming",name="totalPushCostForAvg"} 0.0
nacos_monitor{module="naming",name="totalPushCountForAvg"} 0.0
nacos_monitor{module="unknown",name="longConnection"} 2.0
# HELP nacos_monitor_max  
# TYPE nacos_monitor_max gauge
nacos_monitor_max{module="core",name="raft_read_from_leader"} 0.0
nacos_monitor_max{module="core",name="raft_read_index_failed"} 0.0
# HELP nacos_monitor_seconds  
# TYPE nacos_monitor_seconds summary
nacos_monitor_seconds_count{module="core",name="raft_apply_log_timer"} 0
nacos_monitor_seconds_sum{module="core",name="raft_apply_log_timer"} 0.0
nacos_monitor_seconds_count{module="core",name="raft_apply_read_timer"} 0
nacos_monitor_seconds_sum{module="core",name="raft_apply_read_timer"} 0.0
# HELP nacos_monitor_seconds_max  
# TYPE nacos_monitor_seconds_max gauge
nacos_monitor_seconds_max{module="core",name="raft_apply_log_timer"} 0.0
nacos_monitor_seconds_max{module="core",name="raft_apply_read_timer"} 0.0

性能变化

SpringBoot 3 应用本身带来的性能提升相较于 SpringBoot 2 是尤为明显的,在 Mac(arm64 16G) 和 Win(i5-12490K 64G) 的环境下对启动时间进行了多次测试得到如下表所示的参考数据:

Mac Win
SpringBoot 2 启动耗时 4500 ± 200 ms 3220 ± 80 ms
SpringBoot 3 启动耗时 1250 ± 30 ms 2000 ± 200 ms
提升百分比 70.23% ~ 74.04% 29.94% ~ 45.45%

SpringBoot 3 更新带来的性能提升是肉眼可见的,Nacos 研发组决定使 Nacos 支持 SpringBoot 3 主要是考虑到现在的版本在云原生时代下启动时间过长带来了大量性能的损耗,借助于先进的 JDK 17 与 SpringBoot 3 优化使 Nacos 的启动性能更上一层台阶,与此,将在接下来的时间继续完成 Nacos Server 与 Nacos Client 对 GraalVM Native Image 的支持,欢迎各位开发者前往 Nacos 社区提供更多有用的建议。