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
同时来自于 Summary
与 Gauge
两个度量类型,在升级至新版本的 Micrometer 后,若在客户端启用了 Prometheus(普罗米修斯)并访问端点 /nacos/actuator/prometheus
时该两种度量类型现在进行了区分。其中 Summary
度量类型数据由 nacos_monitor
命名变更为 nacos_monitor_summary
,Gauge
度量类型数据保持为 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 社区提供更多有用的建议。