-
Notifications
You must be signed in to change notification settings - Fork 1.4k
如何在异步场景下使用探针Agent
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的实现类
插件获取方式有两种方式
- 通过https://github.com/Nepxion/DiscoveryAgent/releases下载最新版本的Discovery Agent
- 编译https://github.com/Nepxion/DiscoveryAgent产生discovery-agent目录
① 使用示例
- 通过如下-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所在的目录,需要对应到实际的目录上
-
-D
thread.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
IDEA DebugAgent支持Reactive Streams的Reactor调试,如果开启会使DiscoveryAgent的Reactor模块失效,所以必须关闭IDEA的Reactor调试模式
2017-2050 ©Nepxion Studio Apache License
- 如何对接Foundation基础平台实施收敛集成
- 如何对接DevOps运维平台实施流量管控
- 如何部署对接DevOps运维平台的控制台
- 如何对接DevOps运维平台执行半自动化蓝绿灰度发布
- 如何使用DevOps运维平台对接的公共接口
- 如何设计全链路智能编排高级蓝绿灰度发布界面
- 如何实现Windows10下GraalVM本地镜像化
- 蓝绿灰度发布
- 流量染色
- 隔离路由
- 故障转移
- 多活单元化
- 限流熔断降级权限
- 网关动态路由
- 可观测监控
- 如何操作配置中心
- 如何理解框架开关配置
- 如何理解规则策略里内容格式配置
- 如何操作网关和服务的蓝绿灰度发布规则策略配置
- 如何操作网关动态路由规则策略配置
- 如何操作Sentinel规则策略配置
- 如何实施规则策略配置和业务配置在配置中心的合并和分离
- 如何理解自动扫描目录
- 如何自定义流量管控
- 如何自定义实现组合式的防护
- 如何自定义高级配置订阅功能
- 如何自定义订阅框架事件
- 如何自定义解决业务自身跨线程上下文切换的问题
- 如何自定义重用框架内置的Swagger模块
- 如何自定义Header全链路传递
- 如何遵循Nepxion Discovery网关标准实现对其它网关全链路流量管控的二次开发
- 如何遵循Nepxion Discovery服务标准实现对消息队列等其它中间件全链路流量管控的二次开发