Skip to main content

09小节:通过Nacos实现线程池参数配置

作者:程序员马丁

在线博客:https://nageoffer.com

note

热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。

通过 Nacos 实现线程池参数配置,元数据信息:

©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。


内容摘要:本节主要讲解了当 Nacos 配置发生变更时,监听器接收到的是完整的配置文件字符串内容(如 YAML 格式)。由于这类字符串无法直接使用,我们需要对其进行解析,转换成可操作的 Java 对象(如 BootstrapConfigProperties),以便后续动态刷新线程池配置。

课程目录如下所示:

  • 什么是 Nacos?
  • Nacos 如何完成配置监听?
  • 文末总结

什么是 Nacos?

该章节取自 Nacos 官网 Version 2.5,本章节重点使用的是 Nacos 动态配置服务,如已了解可跳过该小节。

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以**“服务”**为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

1. 产品功能

1.1 服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用原生SDK、OpenAPI、或一个独立的 Agent 注册 Service 后,服务消费者可以使用 HTTP&API 查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

1.2 动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

1.3 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs 帮助您管理服务的关联域名和可用的 IP 列表。

1.4 服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

2. 产品优势

  • 易于使用:Nacos 经历几万人使用反馈优化,提供统一的服务发现和配置管理功能,通过直观的 Web 界面和简洁的 API,为开发和运维人员在云原生环境中带来了便捷的服务注册、发现和配置更新操作。
  • 特性丰富:Nacos 提供了包括服务发现、配置管理、动态 DNS 服务、服务元数据管理、流量管理、服务监控、服务治理等在内的一系列特性,帮助您在云原生时代,更轻松的构建、交付和管理微服务。
  • 极致性能:Nacos 经过阿里双十一超快伸缩场景的锤炼,提供高性能的服务注册和发现能力,以及低延迟的配置更新响应,确保在大规模分布式系统中的高效率和稳定运行。
  • 超大容量:Nacos 诞生自阿里的百万实例规模,造就支持海量服务和配置的管理,能够满足大型分布式系统对高并发和高可用性的需求。
  • 稳定可用:Nacos 通过自研的同步协议,配合生态中应用广泛的 Raft 协议,确保了服务的高可用性和数据的稳定性,保证阿里双十一系统的高可用稳定运行。
  • 开放生态:Nacos 拥有活跃的开源社区、广泛的生态整合和持续的创新发展,不仅大量兼容了 Spring Cloud、Dubbo 等大受欢迎的开源框架、还提供了丰富的插件化能力,帮助用户在云原生时代,提供可定制满足自身特殊需求的独有云原生微服务系统。

3. 设计理念

我们相信一切都是服务,每个服务节点被构想为一个星球,每个服务都是一个星系。Nacos 致力于帮助建立这些服务之间的连接,助力每个面向星辰的梦想能够透过云层,飞在云上,更好的链接整片星空。

Nacos希望帮助用户在云原生时代,在私有云、混合云或者公有云等所有云环境中,更好的构建、交付、管理自己的微服务平台,更快的复用和组合业务服务,更快的交付商业创新的价值,从而为用户赢得市场。正是基于这一愿景,Nacos的设计理念被定位为易于使用面向标准高可用方便扩展

3.1 易于使用

易于使用是 Nacos 的一个核心理念,它通过提供用户友好的 Web 界面和简洁的 API 来简化服务的注册、发现和配置管理过程。开发者可以轻松集成 Nacos 到他们的应用中,无需投入大量时间在复杂的设置和学习上。

3.2 面向标准

Nacos 采用面向标准的设计理念,遵循云原生应用开发的最佳实践和标准协议,以确保其服务发现和配置管理功能与广泛的技术栈和平台无缝对接。

3.3 高可用

为了满足企业级应用对高可用的需求,Nacos 实现了集群模式,确保在节点发生故障时,服务的发现和配置管理功能不会受影响。集群模式也意味着 Nacos 可以通过增加节点来水平扩展,提升系统的整体性能和承载能力。

3.4 方便扩展

Nacos 还注重易于扩展,它采用了模块化的设计使得各个组件都可以独立地进行扩展或替换。这也为社区贡献者提供了方便,使他们能够针对特定的需求开发新的功能或者改善现有功能,进一步推动 Nacos 的生态发展。

通过上述设计理念的实现,Nacos 为用户提供了一个强大而灵活的平台,以支持不断变化的业务需求,加速业务创新和数字转型,最终帮助用户在竞争激烈的市场中占据有利地位。

Nacos 如何完成配置监听?

由于 Nacos 的完整配置变更监听机制涉及到模板方法、观察者模式等进阶设计模式,整体流程相对复杂。为了让大家更容易理解和循序渐进地掌握相关原理,马哥将拆分为多个章节讲解。期间如果你看到文档某些类名后缀带有 V1、V2 等字样,代表这是演进过程中的阶段性版本代码,方便大家跟进理解。

本章节的重点内容集中在两个模块:common-spring-boot-starternacos-cloud-spring-boot-starter

从整体上看,动态线程池参数变更的流程其实并不复杂,可以类比为“把大象装进冰箱”的三步走:

  1. 监听配置变更:SpringBoot 注册了监听器,一旦检测到 Nacos 配置文件发生变更,立即获取最新的配置信息;
  2. 参数绑定:将接收到的最新配置内容,绑定到 BootstrapConfigProperties 对象中,完成字符串 → Java 对象的转换;
  3. 更新线程池:通过 BootstrapConfigProperties 与当前线程池参数进行比对,发现变更则执行更新操作,无变更则跳过,避免无意义刷新。

为了帮助大家快速理清流程,这里先放上一张时序图,帮助大家对整体执行过程有个初步的理解:

1. 注册 Nacos Listener

从 Nacos 提供的配置中心抽象接口中,我们可以看到其核心方法之一是 addListener,用于注册配置变更监听器。

public interface ConfigService {
// ......
/**
* Add a listener to the configuration, after the server modified the configuration, the client will use the
* incoming listener callback. Recommended asynchronous processing, the application can implement the getExecutor
* method in the ManagerListener, provide a thread pool of execution. If not provided, use the main thread callback, May
* block other configurations or be blocked by other configurations.
*
* @param dataId dataId
* @param group group
* @param listener listener
* @throws NacosException NacosException
*/
void addListener(String dataId, String group, Listener listener) throws NacosException;
// ......
}

下面是 addListener 方法的注释翻译,方便大家更好理解它的作用:

向配置添加监听器,当服务端修改配置后,客户端会通过传入的监听器进行回调。推荐使用异步处理,应用可以在 ManagerListener 中实现 getExecutor 方法,提供一个用于执行的线程池。如果没有提供,将使用主线程进行回调,这可能会阻塞其他配置,或被其他配置阻塞。

接下来就是在什么时机进行添加监听呢?毕竟你写个添加监听方法总要被调用才能生效。这里使用 SpringBoot 扩展接口 ApplicationRunner 实现,一个启动时自动回调的“钩子”接口。

解锁付费内容,👉 戳