10月,Sermant社区正式发布了1.2.0 release版本,距离上一次的大版本发布仅三个月。本次新版本带来了多个令人兴奋的新特性,主要包含Sermant Agent框架能力的优化和提升以及新增了流量标签透传插件,将极大地提升用户和开发者的体验,帮助大家将Sermant运用到更多的流量治理场景中。
(Sermant官网:Sermant)
一、Sermant Agent框架能力提升
1.2.0 release版本中,对诸多能力进行了优化或新增,包括支持Sermant Agent框架和插件的动态安装和动态卸载、支持动态配置服务对接Nacos配置中心、更好的类隔离能力、JDK11和JDK17的兼容等。在框架加持这些新版本特性后,可以使Sermant的开发和体验更加友好,同时也拓展出更多的Sermant的使用场景。
1.1 Sermant Agent框架以及插件的动态安装/卸载
新版本中,Sermant将原本默认的通过premain来启动Sermant Agent的方式改进为支持premain和agentmain两种方式启动,其中premain方式与此前版本使用方式一致。
新增的agentmain启动方式是为了支持Agent和插件的热部署方式,premain方式需要在应用程序启动时挂载Agent,而agentmain可以在应用程序运行时进行动态挂载Agent,也可以在运行时动态地卸载Sermant,在故障注入等需要动态进行字节码增强的场景中起到非常重要的作用。动态安装/卸载插件和动态安装/卸载Agent一样,用于服务治理场景中需要在应用运行时动态添加或移除额外功能的场景,例如在故障注入场景中通过动态地挂载不同的插件来实现注入不同的故障类型。
下图为Sermant的热插拔能力的示意图,在初始状态可以通过动态挂载Agent的能力安装字节码增强框架,然后可以通过动态挂载/卸载插件的能力在运行态增减所需服务治理能力,也可以直接将整个Agent进行卸载。
图 - Sermant Agent框架和插件的热插拔示意图
此项关键能力的更新使得Sermant的部署形态更加多样,适用场景更加广泛,使用者不再仅限于在启动时再挂载Sermant,业务可以实现不停机注入服务治理能力。
1.2 支持动态配置服务对接Nacos配置中心
动态配置中心为Sermant动态配置服务的配套组件,动态配置服务允许Sermant从动态配置中心拉取配置以实现丰富多样的服务治理能力。以往版本Sermant的支持的动态配置中心有Zookeeper和Kie,新版本适配了nacos的数据模型,支持从nacos下发配置并监听。
- Sermant动态配置模型基于Nacos配置中心的实现方式
Nacos自身的数据模型如下,通过Namespace、Group、Date ID能够定位到一个配置集:
图 - Nacos数据模型
Sermant动态配置的Group(分组信息):将Nacos的Namespace(命名空间)和配置分组(Group)组合起来作为Sermant的动态配置模型的分组信息。
Sermant动态配置的Key(配置项名称): Nacos的配置集ID(Data Id)作为Sermant的动态配置模型的配置项名称。
配置集(Data Id)可以通过不同的Namespace(命名空间)和配置分组(Group)进行隔离,不同的Namespace(命名空间)和配置分组(Group)下可以存在名称相同的配置集(Data Id)。保证Sermant通过不同的Group(分组信息)来对配置项进行隔离,同一个Group(分组信息)下可以有相同Key(配置项名称)。
- 使用Nacos作为Sermant的动态配置中心
将Sermant 1.2.0 release包中的/agent/config/config.properties配置文件中的相关配置修改如下,即可使用Nacos作为动态配置中心:
- # 指定配置中心的服务端地址,修改为nacos的地址
- dynamic.config.serverAddress=127.0.0.1:8848
- # 指定动态配置中心类型, 取值范围为NOP(无实现)、ZOOKEEPER、KIE、NACOS
- dynamic.config.dynamicCnotallow= NACOS
Sermant中动态配置的模型和接口是统一抽象的,开发者对于动态配置节点的监听器的开发与此前版本保持一致。动态配置中心在Sermant中的角色和作用可以阅读相关博客《如何利用动态配置中心在JavaAgent中实现微服务的多样化治理》。
1.3 更好的类隔离能力
Sermant在1.2.0版本中对此前的类隔离框架和机制做了全面的优化,不仅保证了不向宿主服务引入类冲突问题,避免在开箱即用时对宿主服务造成负面影响,同时也了保障框架与插件、插件与插件之间不会引入类冲突问题,避免插件开发者因为和其他服务治理插件产生类冲突问题而苦恼。
- 新版本的类隔离结构
图 – Sermant的类隔离结构
- SermantClassLoader,破坏双亲委派,用于加载Sermant框架核心逻辑,并在AppClassLoader下隔离出Sermant的类加载模型。避免受到宿主服务自身复杂类加载结构的影响,减少应对不同类加载结构服务的适配需求。
- FrameworkClassLoader,破坏双亲委派,主要作用是隔离Sermant核心能力所引入的三方依赖,避免向宿主服务及服务治理插件引入类冲突问题。目前的主要场景 ①用于隔离Sermant的日志系统,避免对宿主服务的日志系统产生影响 ②隔离Sermant框架的核心服务(心跳、动态配置、统一消息网关)所需三方依赖。
- PluginClassLoader,遵循双亲委派,主要用于隔离Sermant各服务治理插件,避免不同服务治理插件之间产生类冲突问题。
- ServiceClassLoader,破坏双亲委派,主要用于隔离插件中的依赖,通过该类加载器加载插件服务的相关lib(插件服务会在插件加载时被Sermant初始化),开发者可任意引入三方依赖,无需关心对插件主逻辑的影响。
其中的PluginClassloader和ServiceClassloader不仅在类隔离中起到至关重要的作用,更是一种长远的考虑,为每个插件设计独立的类加载器,使得Sermant可以平滑的进行插件动态安装&卸载以及插件热更新。更详细的类隔离机制的介绍可以参阅相关博客《Sermant类隔离架构解析——解决JavaAgent场景类冲突的实践》。
二、插件能力提升
2.1 流量标签透能力
在微服务架构中,流量标签用于对流量进行标记和分类,能够在微服务之间实现更精细的路由、负载均衡和流控等流量治理能力。Sermant新版本插件部分本次主要新增了流量标签透传插件。该插件着手于解决流量标签在各种不同传媒介中(通信协议、进程内外)进行透传的问题,基于此能力可以实现全链路灰度发布、基于流量标签的流量控制等高阶服务治理功能。
- 流量标签透传插件简介
Sermant对于流量标签透传分为两大类:跨进程透传和进程内透传。跨进程透传是指在不同的服务实例进程中传递流量标记,例如http请求的客户端和服务端。进程内透传是指在一个服务实例的进程内传递流量标签,包括线程内传递和跨线程传递。
图 – Sermant中http/rpc请求的标签透传过程
图 – Sermant中消息队列的标签透传过程
新版本发布的流量标签透插件实现了上述两类标签的透传,并且支持了http协议、rpc协议、消息队列中间件,目前支持的组件包括Apache HttpClient、OKHttp、Dubbo、GRPC、Kafka等。
- 流量标签透传插件使用方式
该插件的使用支持静态配置和动态配置,只需将需要透传的流量标签做好配置,标签即可在全链路中进行透传,具体使用方式可参考官网使用文档。
流量标签透传作为JavaAgent中进行流量治理的基础能力,可以将其运用在全链路灰度发布、标签流控等复杂的流量治理场景,相关介绍可以参阅相关博客《
三、总结
本次更新主要带来了Sermant Agent框架和插件的动态挂载/卸载的支持、动态配置服务对nacos的支持、类隔离机制的优化以及流量标签透传能力的支持等。基于上述能力,Sermant可以在诸如故障注入、流量治理、动态配置等服务治理的场景发挥更关键的作用。
结束语
Sermant作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。
- Sermant 官网:Sermant
- GitHub 仓库地址:https://github.com/huaweicloud/Sermant
- 扫码加入 Sermant 社区交流群