从零开始带你上手体验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://github.com/sermant-io/Sermant
Demo仓库:https://github.com/sermant-io/Sermant-examples
从零开始带你上手体验Sermant自定义插件开发的更多相关文章
- 带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变
带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变 转 https://blog.csdn.net/qq_30993595/article/details/78915115 近期有 ...
- 带你走近AngularJS - 创建自定义指令
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- Android 7.0真实上手体验
Android 7.0真实上手体验 Android 7.0的首个开发者预览版发布了,支持的设备只有Nexus6.Nexus 5X.Nexus 6P.Nexus 9.Nexus Player.Pixel ...
- 小鸡G4工程款 上手体验
前言:之前只是抱着试一试的态度在小鸡活动贴下报名,说实话之前并没有抱希望能够没选中.所以非常感谢小鸡团队给我的这次机会.这应该是我第一次参与厂家的内测活动.希望能给小鸡团队,给广大玩家带来一片实用的上 ...
- Python 多线程、进程、协程上手体验
浅谈 Python 多线程.进程.协程上手体验 前言:浅谈 Python 很多人都认为 Python 的多线程是垃圾(GIL 说这锅甩不掉啊~):本章节主要给你体验下 Python 的两个库 Thre ...
- 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查
本文目录 使用EntityState枚举实现单个实体的增/删/改 增加:DbSet.Add = > EntityState.Added 标记实体为未改变:EntityState.Unchange ...
- 微信小程序从零开始开发步骤(四)自定义分享的功能
上一章节,实现了小程序的底部导航的功能,这一节开始实现一些简单的功能.本章节介绍的是小程序的自定义分享的功能. 可以分享小程序的任何一个页面给好友或群聊.注意是分享给好友或群聊,并没有分享到朋友圈.一 ...
- Cordova自定义插件开发
Cordova自定义插件开发 一.创建Cordova项目 在创建项目前请确保安装Cordova Cordova环境配置:https://www.w3cschool.cn/cordova/cordova ...
- ionic2踩坑之自定义插件开发及调用
关于ionic2自定义插件开发的文章,插件怎么调用的文章,好像网上都有,不过作为一个新手来说,从插件的开发到某个页面怎么调用,没有一个完整的过程的话,两篇没有关联的文章也容易看的迷糊.这里放到一起来方 ...
- 腾讯高级工程师带你完整体验Node.js开发实战
Node.js拥有广大的 JavaScript程序员基础并且完全开源,它被广泛地用在 Web服务.开发工作流.客户端应用等诸多领域.在 Web 服务开发这个领域,业界对 Node.js 的接受程度最高 ...
随机推荐
- Xcode编译WebKit
下载WebKit源码 1)进入https://webkit.org/ 2)点击页面的 Get Started 进入新页面,如下图所示 3)点击 Getting the code 进入新页面,如下图所示 ...
- 2019年最新前端面试题,js程序设计题
都说机会是留给有准备的人的. 一年之计在于春,面对众多的前端技术,需要时刻充电自己. 我现在整理一些前端js面试程序题. 1.判断一个字符串中出现最多的字符,并计算出现的次数? 2.用css伪类实现下 ...
- [Unity] 实现AssetBundle资源加载管理器
实现Unity AssetBundle资源加载管理器 AssetBundle是实现资源热更新的重要功能,但Unity为其提供的API却十分基(jian)础(lou).像是自动加载依赖包.重复加载缓存. ...
- RuoYi(若依)前后端分离版本,windows下部署(nginx)
摘自:https://blog.csdn.net/yueyekkx/article/details/105505490 上一篇用了tomcat部署(https://blog.csdn.net/yuey ...
- 009. gitlab备份和恢复
gitlab备份 #1. 创建添加配置文件 vim /etc/gitlab/gitlab.rb 文件尾添加: gitlab_reils['backup_path'] = '/data/backup/g ...
- C#笔记 线扫相机利用串口通信设置曝光
1. 串口通信 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电 ...
- vue3+vant 引入Dialog Toast都会失败报错not defined
今天在封装vant组件的时候,刚好要用到toast提示信息的组件,索性就按照官网提供的引入方法进行正常的引入,嘿,好家伙,一顿操作下来后发现竟然报Toast未定义,这就纳闷了,明明步骤都是对的啊,所以 ...
- navicat安装和破解
navicat16.0 下载地址: https://download.navicat.com.cn/download/navicat160_premium_cs_x64.exe 破解教程&破解 ...
- 查看SO KO 执行程序相关信息命令
1 查看SO 查看so库的方法__臣本布衣_新浪博客 (sina.com.cn) 1.nm -D libxxx.so 打印出符号信息. 一般这样用:nm -D libxxx.so |grep T $ ...
- JavaServlet和后端的搭建(以Tomcat为例)
目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...