• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

cat异步埋点 hytrix feign调用原理

然后cat埋点原理 一个是aop一个feign的拦截器

aop主要服务的是服务的提供者 拦截器主要服务的是服务发送者

坑啊 一直不成功 然后本地的注册不到cat测试环境 咋回事呢

cat 看源码logRemoteCallClient 客户端cat埋点 logRemoteCallServer 服务端cat埋点

logRemoteCallClient 会生成唯一的id

这些id通过context来传递

代码流程是先走到logRemoteCallServer 然后如果是根节点,生成根节点的Id 然后存入context
然后走到logRemoteCallClient 取CatContext中存的值

目前因为是Hystrix的feign的调用 这个feign的调用会生成新的线程来发起调用

那么CatContext这个基于线程本地变量的就没用了 如果不把他变成线程本地变量的行不行

显然不行 因为如果是这样的话 内存很容易溢出

然后Cat.Context.PARENT,ctx.getProperty(Cat.Context.PARENT)

如果没有会重新生成一个

ThreadLocal 的原理是每个线程有个 ThreadLocalMap get的时候获取当前线程 然后取这个threadlocalmap

因为现在hystrix是异步实现 所以thradlocal就没用了

所以把catcontext和DefaultMessageManager 换掉肯定就行了

cat使用Plexus 这个Ioc容器来实现注入 而不是spring 掌握这个东西的规律就可以把我们自己实现的

messageMannger

ComponentsConfigurator 这个东西有个main方法 然后会启动

这个东西的资料太少了 有点难整

然后***的建议是不改cat源码 因为cat本身就是基于threadlocal

➕ 但是看下来也就DefaultMessageManager这个里面有 别的地方都是引用他来取上下文的 把这个改成InheritableThreadLocal应该就行了 现在想办法把自己的messageManager注入 然后优先级高一些

那么来看下这个feign怎么是怎么实现的 为什么是异步的 如果他是异步的 那我在线程启动前后把他赋值给下个线程就行了

第一步

FeignClientsConfiguration

feign的配置类 如果配置文件里面指定了feign.hystrix.enabled 那么会使用hystrix的hystrixfeign

HystrixTargeter 的target 是干嘛的后面说

第二步

[email protected] 代表使用声明式feign调用, [email protected] 然后注册FeignClientFactoryBean 注意这个是factoryBean 是spring的拓展点

第三步

有了factoryBean就要知道他是如何getObject()的 拓展了什么

[email protected]

然后其实就是spring的依赖加载过程

g还是要看看FeignClientFactoryBean 在做什么

有了factoryBean就要知道他是如何getObject()的 拓展了什么

[email protected]

然后其实就是spring的依赖加载过程

g还是要看看FeignClientFactoryBean 在做什么

取上下文 然后构造 然后loadBanlance 这个loadBanlance就比较重要了

可以看到代码还是到了hystrixTagretar 的 target 这里就是前面注册的东西

这个里面顺序是 看是不是hystrix的builder 然后强转为hystrix的builder

再看有没有触发fallback 如果配置了fallback那么执行targetWithFallback,通过设定动态代理实现集成Hystrix应用,

没有fallback的话 就会执行feign.target(target) 这是一个典型的策略模式,根据前面制定的build来执行build的newInstance(target)

可以看到上述配置定义的SetterFactory在此处通过构造函数传入HystrixInvocationHandler实例中,HystrixInvocationHandler是JDK动态代理的实现,通过切面技术对待执行方法实现HystrixCommand的应用,重写实现fallback功能,

这这里面会生成一个新的hystrixCommand 这个东西会启动一个新的线程 来invoke来发生调用!!!(
hystrixCommand.execute() 这里!!!


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址