Skip to content

如何在异步场景下使用探针Agent

HaojunRen edited this page Aug 11, 2024 · 9 revisions

DiscoveryAgent不仅适用于Discovery框架,也适用于一切具有类似使用场景的基础框架(例如:Dubbo)和业务系统

Discovery框架存在着如下全链路传递上下文的场景,包括

  • 策略路由Header全链路从网关传递到服务
  • 调用链埋点全链路从网关传递到服务
  • 业务自定义的上下文的传递

上述上下文会在如下异步场景中丢失,包括

  • WebFlux Reactor响应式异步
  • Spring异步,@Async注解异步
  • Hystrix线程池隔离模式异步
  • 线程,线程池异步
  • SLF4J日志异步

通过DiscoveryAgent,解决上述痛点。Discovery框架利用DiscoveryAgent字节码增强技术,完美解决各种调用场景下的异步,包括

  • Spring Cloud Gateway过滤器中的上下文传递
  • Zuul过滤器中的上下文传递
  • Feign拦截器中的上下文转发
  • RestTemplate拦截器中的上下文转发
  • WebClient拦截器中的上下文转发

异步场景

由于Nepxion Discovery使用ThreadLocal来透传上下文,在策略路由Header和调用链埋点在异步场景下传递会丢失,那么可以通过DiscoveryAgent解决该问题

涵盖所有Java框架的异步场景,解决如下9个异步场景下丢失线程ThreadLocal上下文的问题

  • WebFlux Reactor
  • @Async
  • Hystrix Thread Pool Isolation
  • Runnable
  • Callable
  • Supplier
  • Single Thread
  • Thread Pool
  • SLF4J MDC

需要注意,DiscoveryAgent不支持含有Lambda语法的异步代码。使用Lambda去实现的Runnable类会生成一个匿名内部类,这个匿名内部类和DiscoveryAgent使用的是不同的类加载器,导致DiscoveryAgent无法去修改Lambda表达式生成的Runnable的实现类

异步跨线程DiscoveryAgent获取

插件获取方式有两种方式

异步跨线程DiscoveryAgent使用

① 使用示例

  • 通过如下-javaagent启动,基本格式,如下
-javaagent:C:/opt/discovery-agent/discovery-agent-starter-${discovery.agent.version}.jar -Dthread.scan.packages=com.nepxion.discovery.guide.service.feign

② 参数说明

  • C:/opt/discovery-agent:Agent所在的目录,需要对应到实际的目录上
  • -Dthread.scan.packages:Runnable/Callable/Thread/ThreadPool等异步类所在的扫描目录,该目录下的异步类都会被装饰
    • 扫描目录最好精细和准确,目录越详细,越可以减少被装饰的对象数,从一定程度上可以提高性能
    • 扫描目录如果有多个,用“;”分隔
    • 扫描目录如果含有“;”,可能会在某些操作系统中无法被识别,请用""进行引入,例如,-Dthread.scan.packages="com.abc;com.xyz"
    • 扫描目录下没有Runnable/Callable/Thread/ThreadPool等异步类存在,那么thread.scan.packages也不需要配置,最终启动命令行简化为-javaagent:C:/opt/discovery-agent/discovery-agent-starter-${discovery.agent.version}.jar

③ 安装校验

Spring Cloud 20xx版的应用上支持如下配置,一般通过-Dspring.application.strategy.agent.validation.enabled=true或者false来启动和关闭

# 启动和关闭DiscoveryAgent安装校验,一旦启动,如果未安装DiscoveryAgent,则抛错退出应用,该配置只适用于Spring Cloud 202x版。缺失则默认为true
# spring.application.strategy.agent.validation.enabled=true

异步跨线程DiscoveryAgent冲突

IDEA DebugAgent支持Reactive Streams的Reactor调试,如果开启会使DiscoveryAgent的Reactor模块失效,所以必须关闭IDEA的Reactor调试模式




2017-2050 ©Nepxion Studio Apache License

           

Total visits

讲义篇

集成篇

概念篇

实践篇

功能篇

配置篇

扩展篇

测试篇

升级篇

贡献篇

Clone this wiki locally