从零开始带你上手体验 Sermant 自定义插件开发
![从零开始带你上手体验Sermant自定义插件开发](https://static001.geekbang.org/infoq/72/7254da6ab4dc80efc3223e7f63aa3fe1.jpeg)
本文分享自华为云社区《Sermant自定义插件开发上手体验》,作者:华为云开源。
一、研究缘由
由于目前我们所处的行业是汽车行业,项目上进行云服务的迁移时使用到了 Sermant 中的相关插件, 为了加深对 Sermant 开发和运行机制的了解,我们从零开始体验 Sermant 自定义插件的开发。
下面我们就 Sermant-example 中的 first-plugin-demo 来进行研究说明。
二、下载 Sermant-example
首先我们下载 sermant-example 的 demo:
![](https://static001.geekbang.org/infoq/58/58dca3658e6a91bb7b9a21cfa76f0aef.png)
下载完成之后,我们从最简单的自定义插件开始,也即 first-plugin-demo。
三、执行打包
对 first-plugin-demo 执行打包,打完包的结构:
![](https://static001.geekbang.org/infoq/26/26ffe66ced64ac2ca1efcae4dc46a8b7.png)
可以看到我们的项目和对应的插件模板项目都在里面了。
四、启动项目
然后访问 controller 方法
![](https://static001.geekbang.org/infoq/22/22f50b1a3d34b49f3d11f40651bbaff7.png)
从而可以看到拦截的效果:
![](https://static001.geekbang.org/infoq/72/7250683dbd3f4ca28a9f58226bfd90e3.png)
可以看到启动的过程中,完成了拦截的效果。
也即它走了拦截器的前置和后置方法。
![](https://static001.geekbang.org/infoq/15/1584e918aaff75b82986187846fb1f88.png)
五、动态配置验证
![](https://static001.geekbang.org/infoq/a9/a96b32b061ce6ae512a5275e31669b0a.png)
配置的动态配置里面配置的配置中心是 zookeeper,因此我们在启动项目前需要启动一个 zookeeper 作为配置中心,同时开启动态配置开关。
完成之后,我们需要在相应的监听节点下创建一个配置项,来测试动态配置的功能:
![](https://static001.geekbang.org/infoq/70/707e9533617ca2284db45a257c1b5bcd.png)
再次进行访问,可以在控制台看到如下效果:
![](https://static001.geekbang.org/infoq/25/25a16cde7552f2f2655dfbe775f439ff.png)
也即完成了动态配置的功能。而我们可以看到
![](https://static001.geekbang.org/infoq/12/1286bf22444385e0b04955100dc218bd.png)
其实质是创建了配置监听器,实现了配置处理的 process 方法,其中 DynamicConfigEvent 就是监听到的配置更改的事件,包含了配置的 group,key,content 等配置信息。实现动态配置的相关实现是调用了自己实现的 process 方法,基于 map 对配置进行存储和处理,从而实现配置切换。
六、全流程中的参数 argsMap 到底是什么
之前一直很好奇配置里面的信息到底是什么,最近 debug 之后有所发现。
我们可以看到加载的 argMap 里面的相关参数:
![](https://static001.geekbang.org/infoq/ae/ae158bdb15d9859859c32c29d75423f7.png)
我们可以看到 argsMap 里面的参数基本上和上面的配置,同时会加载插件里面的配置信息。完成这些操作之后,就可以在全流程中去完成对应信息的加载了。
ConfigManager.initialize(argsMap) ,主要是解析一些配置,由于配置存在 yaml 和 properties 等不同的形式,因此这里采用策略模式来进行解析。主要的相关配置信息可以参考 BaseConfig 这个接口的实现。
七、插件的加载是在 plugins.yaml
插件的加载是在 plugins.yaml 里面配置的,比如我们自定义的插件:
![](https://static001.geekbang.org/infoq/db/db8d99d9a1877ecf9bf7781c8abbc062.png)
而实现插件的关键在于 plugins.yaml 中配置了哪些插件。因为这些插件正是后续进行拦截的基础。也即它告诉了程序,需要加载哪些插件,不需要加载哪些插件。有了这个基础,才会进行后面精准的转换、installOn 操作。
八、拦截原理
我们可以看到上面控制台打印的拦截信息,那如何实现拦截的呢?
可以看到我们执行 first-plugin-demo 这个示例的时候:会发现我们执行业务方法的时候,它就会进行织入拦截器,执行对应的 onMethodEnter 和方法执行完后的 onMethodExit 方法。
![](https://static001.geekbang.org/infoq/60/60016b387db8f5fbbdd1e56a6cb3e83c.png)
这两个方法和 byte-buddy 中的使用实现的功能是类似的。在需要拦截的方法中执行织入的逻辑。
同时可以从控制台 debug 中的信息可以看到调用的情况:
![](https://static001.geekbang.org/infoq/19/19dd2268ce08b2c4a8cdf421dc9e33e5.png)
完成上面的调用之后,我们便可以看到控制台输出的信息了。
这里我们以进入方法为例,来进行说明:
![](https://static001.geekbang.org/infoq/a3/a3030d8411c4c3a93515846457e77a08.png)
可以看到进入对应的织入方法之后,最终会走到我们需要进行扩展的迭代器中,来实现迭代。
![](https://static001.geekbang.org/infoq/64/6473840b1327156709d1b9c3d0a0fb41.png)
可以看到进入了 first-plugin-demo 中的插件拦截:
![](https://static001.geekbang.org/infoq/7e/7e8a98da8b23168a08c44448b8159ea4.png)
完成拦截进入到业务方法中,实现拦截功能的织入。然后进入后置拦截,完成 after 的拦截逻辑。
参考:
仓库地址:https://github.com/sermant-io/Sermant
Demo 仓库:https://github.com/sermant-io/Sermant-examples
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/95800aad0699485cdafdc2228】。文章转载请联系作者。
评论