加入收藏 | 设为首页 | 会员中心 | 我要投稿 唐山站长网 (https://www.0315zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

助力业务系统集成的Cloud Pak for Integration

发布时间:2021-02-16 13:43:29 所属栏目:外闻 来源:互联网
导读:心的你有木有感觉到,如果我们用个时间戳记录前后两次的时间,获取某个函数的执行时间就会非常容易。 前面两个简单的小例子算是抛砖引玉吧, AOP在做监控、日志方面来说功能还是非常强大的。 实现原理 整个AOP的实现是基于iOS的runtime机制以及libffi打造的t

心的你有木有感觉到,如果我们用个时间戳记录前后两次的时间,获取某个函数的执行时间就会非常容易。

前面两个简单的小例子算是抛砖引玉吧, 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,比如像这个样子:

 

这两个方法的参数是一样的,提供了对类方法和成员方法的切片化支持。

  • selecctor_name:是你感兴趣的selector名称,通常我们可以通过NSStringFromSelector 这个API来获取。
  • block:是要具体执行的命令,block的参数和返回值我们稍后讨论。
  • policy:指定了想要在该selector执行前,执行后执行block,或者是干脆覆盖原方法。

监控效果

拿一个场景来看看Lokie的威力。比如我们想监控所有的页面生命周期,是否正常。

比如项目中的 VC 基类叫 BasePageController,designated initializer 是 @selector(initWithConfig)。

我们暂时把这段测试代码放在application: didFinishLaunchingWithOptions中,AOP就是这么任性!这样我们在app初始化的时候对所有的BasePageController对象生命周期的开始和结束点进行了监控,是不是很酷?

 

通过这样的方式就有效地指定了业务逻辑执行前后需要执行的 slot,每个业务如果想在业务逻辑执行前后进行扩展,只要定义好自己的 slot 逻辑,在 xml 文件中指定此 slot 的位置即可生效。

嵌入式网关按以上思路实现后,就通过 jar 包分发到各个业务系统。好处是:稳定性提升,每个业务集成一个稳定版本的网关 Jar,某一个业务系统做网关 Jar 升级时,其他业务系统都不受干扰

总结

本文详细介绍了网关的实践思路,相信大家对反应式编程,dubbo filter 等应该有了一定的了解,首先 Java 核心网关作为承载所有流量的入口,必然对其性能有较高的要求,而使用反应式编程的异步非阻塞编程模型能很好地满足我们的需求(关于反应式编程的介绍如有不明白的,可以再看看文末的参考链接,介绍的清晰明了),其次不同业务在业务逻辑执行前后需要做各种各样的扩展,所以我们使用自定义的 filter 实现了这种需求,这种需求显然放在嵌入式网关实现更合理,而让嵌入式网关以 jar 包的形式嵌入业务服务中,做到了对业务层的无侵入,也有较强的可扩展性。


(编辑:唐山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读