从零开始带你上手体验Sermant自定义插件开发

sermant · 浏览次数 : 0

小编点评

本文详细介绍了华为云社区中的Sermant自定义插件开发体验,从下载示例、执行打包、启动项目到动态配置验证,再到插件的加载和拦截原理,最后总结了整个开发过程。 1. **研究缘由**: - 作者所在行业为汽车行业,需要进行云服务迁移。 - 使用Sermant中的相关插件,为了深入了解其开发机制,从零开始体验Sermant自定义插件的开发。 2. **下载Sermant-example**: - 下载sermant-example的demo,以便开始研究。 3. **执行打包**: - 对first-plugin-demo执行打包,得到包含项目和插件模板的项目结构。 4. **启动项目**: - 使用java -javaagent:sermant-agent.jar -jar Application.jar启动项目。 - 访问controller方法以查看拦截效果。 5. **动态配置验证**: - 配置中心为zookeeper,启动zookeeper作为配置中心。 - 开启动态配置开关,并在监听节点下创建配置项进行测试。 6. **全流程中的参数argsMap**: - 调试后发现argsMap中加载了配置信息和插件内的配置信息。 - ConfigManager.initialize(argsMap)用于解析配置,支持YAML和Properties等格式。 7. **插件的加载**: - 插件通过plugins.yaml文件配置,指定需要加载的插件。 - 精准转换和installOn操作基于此配置进行。 8. **拦截原理**: - 插件通过字节码操作,在需要拦截的方法前后的特定方法执行织入逻辑。 - 通过debug观察调用情况,理解拦截器的具体实现。 总的来说,本文通过实际操作和调试,深入了解了Sermant自定义插件的开发流程,包括插件加载、配置处理、动态配置以及拦截器实现等关键技术点,为后续的插件开发提供了宝贵的经验和理解。

正文

本文分享自华为云社区《Sermant自定义插件开发上手体验》,作者:华为云开源。

一、研究缘由

由于目前我们所处的行业是汽车行业,项目上进行云服务的迁移时使用到了Sermant中的相关插件, 为了加深对Sermant开发和运行机制的了解,我们从零开始体验Sermant自定义插件的开发。

下面我们就Sermant-example中的first-plugin-demo来进行研究说明。

二、下载Sermant-example

首先我们下载sermant-example的demo:

下载完成之后,我们从最简单的自定义插件开始,也即first-plugin-demo。

三、执行打包

对first-plugin-demo执行打包,打完包的结构:

可以看到我们的项目和对应的插件模板项目都在里面了。

四、启动项目

java -javaagent:sermant-agent.jar -jar Application.jar

然后访问controller方法

从而可以看到拦截的效果:

可以看到启动的过程中,完成了拦截的效果。

也即它走了拦截器的前置和后置方法。

五、动态配置验证

配置的动态配置里面配置的配置中心是zookeeper,因此我们在启动项目前需要启动一个zookeeper作为配置中心,同时开启动态配置开关。

完成之后,我们需要在相应的监听节点下创建一个配置项,来测试动态配置的功能:

再次进行访问,可以在控制台看到如下效果:

也即完成了动态配置的功能。而我们可以看到

其实质是创建了配置监听器,实现了配置处理的process方法,其中DynamicConfigEvent就是监听到的配置更改的事件,包含了配置的group,key,content等配置信息。实现动态配置的相关实现是调用了自己实现的process方法,基于map对配置进行存储和处理,从而实现配置切换。

六、全流程中的参数argsMap到底是什么

之前一直很好奇配置里面的信息到底是什么,最近debug之后有所发现。

我们可以看到加载的argMap里面的相关参数:

我们可以看到argsMap里面的参数基本上和上面的配置,同时会加载插件里面的配置信息。完成这些操作之后,就可以在全流程中去完成对应信息的加载了。

ConfigManager.initialize(argsMap) ,主要是解析一些配置,由于配置存在yaml和properties等不同的形式,因此这里采用策略模式来进行解析。主要的相关配置信息可以参考BaseConfig这个接口的实现。

七、插件的加载是在plugins.yaml

插件的加载是在plugins.yaml里面配置的,比如我们自定义的插件:

而实现插件的关键在于plugins.yaml中配置了哪些插件。因为这些插件正是后续进行拦截的基础。也即它告诉了程序,需要加载哪些插件,不需要加载哪些插件。有了这个基础,才会进行后面精准的转换、installOn操作。

八、拦截原理

我们可以看到上面控制台打印的拦截信息,那如何实现拦截的呢?

可以看到我们执行first-plugin-demo这个示例的时候:会发现我们执行业务方法的时候,它就会进行织入拦截器,执行对应的onMethodEnter和方法执行完后的onMethodExit方法。

这两个方法和byte-buddy中的使用实现的功能是类似的。在需要拦截的方法中执行织入的逻辑。

同时可以从控制台debug中的信息可以看到调用的情况:

完成上面的调用之后,我们便可以看到控制台输出的信息了。

这里我们以进入方法为例,来进行说明:

可以看到进入对应的织入方法之后,最终会走到我们需要进行扩展的迭代器中,来实现迭代。

可以看到进入了first-plugin-demo中的插件拦截:

完成拦截进入到业务方法中,实现拦截功能的织入。然后进入后置拦截,完成after的拦截逻辑。

 

参考:

官网:https://sermant.io

仓库地址:https://github.com/sermant-io/Sermant

Demo仓库:https://github.com/sermant-io/Sermant-examples

点击关注,第一时间了解华为云新鲜技术~

 

与从零开始带你上手体验Sermant自定义插件开发相似的内容:

从零开始带你上手体验Sermant自定义插件开发

本文对Sermant的自定义插件开发的流程进行了体验和探索,包括项目编译、运行、动态配置验证、插件拦截原理等内容,希望对初次体验Sermant高效开发插件的开发者有所帮助。

Go-Zero从0到1实现微服务项目开发(二)

继续更新GoZero微服务实战系列文章:上一篇被GoZero作者万总点赞了,本文将继续使用 Go-zero 提供的工具和组件,从零开始逐步构建一个基本的微服务项目。手把手带你完成:项目初始化+需求分析+表结构设计+api+rpc+goctl+apifox调试+细节处理。带你实现一个完整微服务的开发。

从零开始使用 Astro 的实用指南

在这个实用的Astro指南中,我将指导你完成设置过程,并告诉你如何构造你的文件。你将学习如何添加页面、交互式组件,甚至是markdown文章。我还会告诉你如何从服务器上获取数据,创建布局,并使用vanilla JavaScript和其他框架添加互动性。准备好享受一些动手的乐趣,因为我们将一起创建一个

Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!

**在这篇文章中,我将手把手地教你如何从零开始部署一个使用Django框架的Python服务。无论你是一个刚开始接触开发的新手,还是一个有经验的开发者想要快速了解Django,这篇教程都会为你提供一条清晰的路径。我们将从环境搭建开始,一步一步地创建一个可以处理GET和POST请求的服务,让你能在实践

如何从零开始实现TDOA技术的 UWB 精确定位系统(6)

这是一个系列文章《如何从零开始实现TDOA技术的 UWB 精确定位系统》第6部分。 重要提示(劝退说明): Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件编程的基础 Q:你的这些硬件/软件是开源的吗? A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文

手绘二维码

看到二维码,很容易猜到黑白相间的小方格就是二进制比特。那么这些比特是怎么得到的?小方格又是按照什么规则排布的?今天咱们就从零开始将一个 url 画成二维码。 考虑到大多数人可能不太了解二维码,所以先讲下基础概念。你也可以先看看左耳朵耗子写的二维码的生成细节和原理。 版本 二维码一共有 40 个尺寸,

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中,安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目,用于提供安全访问控制的功能。通过集成Spring Security,我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始,在Spring Boot项目中集成S

从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

本文为从零开始写 Docker 系列第十八篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实

从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实

从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”

本文为从零开始写 Docker 系列第十六篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。