助力业务系统集成的Cloud Pak for Integration
心的你有木有感觉到,如果我们用个时间戳记录前后两次的时间,获取某个函数的执行时间就会非常容易。 前面两个简单的小例子算是抛砖引玉吧, AOP在做监控、日志方面来说功能还是非常强大的。 实现原理 整个AOP的实现是基于iOS的runtime机制以及libffi打造的trampoline函数为核心的。所以这里我也聊聊iOS runtime的一些东西。这部分对于很多人来说,可能比较熟悉了。 OC runtime里有几个基础概念:SEL, IMP, Method。
SEL block的参数定义非常有意思, 第一个参数是永恒的id target,这个selector被发送的对象,剩下的参数和selector保持一致。比如 "initWithConfig:" 有一个参数,类型是NSDNSDictionary *, 所以我们对 initWithConfig: 传递的是^(id target, NSDictionary *param),而dealloc是没有参数的,所以block变成了^(id target)。换句话说,在block回调当中,你可以拿到当前的对象,以及执行这个方法的参数上下文,这基本上可以为你提供了足够的信息。 对于返回值也很好理解,当你使用LokieHookPolicyReplace对原方法进行替换的时候,block的返回值一定和原方法是一致的。用其他两个flag的时候,无返回值,使用void即可。
另外我们可以对同一个方法进行多次hook,比如像这个样子: 这两个方法的参数是一样的,提供了对类方法和成员方法的切片化支持。
监控效果 拿一个场景来看看Lokie的威力。比如我们想监控所有的页面生命周期,是否正常。 比如项目中的 VC 基类叫 BasePageController,designated initializer 是 @selector(initWithConfig)。
我们暂时把这段测试代码放在application: didFinishLaunchingWithOptions中,AOP就是这么任性!这样我们在app初始化的时候对所有的BasePageController对象生命周期的开始和结束点进行了监控,是不是很酷? 通过这样的方式就有效地指定了业务逻辑执行前后需要执行的 slot,每个业务如果想在业务逻辑执行前后进行扩展,只要定义好自己的 slot 逻辑,在 xml 文件中指定此 slot 的位置即可生效。 嵌入式网关按以上思路实现后,就通过 jar 包分发到各个业务系统。好处是:稳定性提升,每个业务集成一个稳定版本的网关 Jar,某一个业务系统做网关 Jar 升级时,其他业务系统都不受干扰 总结
本文详细介绍了网关的实践思路,相信大家对反应式编程,dubbo filter 等应该有了一定的了解,首先 Java 核心网关作为承载所有流量的入口,必然对其性能有较高的要求,而使用反应式编程的异步非阻塞编程模型能很好地满足我们的需求(关于反应式编程的介绍如有不明白的,可以再看看文末的参考链接,介绍的清晰明了),其次不同业务在业务逻辑执行前后需要做各种各样的扩展,所以我们使用自定义的 filter 实现了这种需求,这种需求显然放在嵌入式网关实现更合理,而让嵌入式网关以 jar 包的形式嵌入业务服务中,做到了对业务层的无侵入,也有较强的可扩展性。 (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |