流量回放repeater的原理分析二:repeater源码分析

本文详细分析了repeater的软件结构,包括代码角度和运行角度,着重探讨了流量录制和回放的实现。repeater基于jvm-sandbox的核心能力,通过加载和实现插件来记录和回放流量。流量录制涉及到入口调用插件和子调用插件的使用,而回放则依赖于不同类型的回放器,如http、dubbo和java回放器。文章还介绍了回放的整体流程,包括事件发布和订阅的过程。
摘要由CSDN通过智能技术生成

前言

在上文中我们分析了sandbox-jvm(以下简称sandbox)的核心源码,了解了sandbox实现类增强的原理。并且了解了sandbox的模块化加载能力,repeater作为一个独立的模块,其基于sandbox的能力实现了流量的录制和回放。下面我们从repeater的软件结构、录制过程、回放过程三个方面来分析其源码。

软件结构

代码角度

jvm-sandbox-repeater
  hessian-lite: 序列化服务
  repeater-aide: 辅助工具
  repeater-client: spring ApplicationContext获取工具
  repeater-console: 控制台能力
  repeater-module: 可以被sandbox加载的模块,用于流量录制与回放
  repeater-plugin-api:repeater可以实现和扩展的接口
  repeater-plugin-core:repeater插件的核心能力和管理能力
  repeater-plugins:repeater默认实现的插件

运行角度

repeater作为sandbox一个子模块加载,进行流量录制发送console,console存储流量并且,调用repeater将流量在目标jvm上回放
在这里插入图片描述

流量录制

插件的加载

代码结构中已经介绍到repeater-module负责流量的录制工作,我们从repeater-module模块中,RepeaterModule.class来进行分析。
RepeaterModule实现了ModuleLifecycle接口,在sandbox进行模块加载时,对于实现该接口的实例会一次执行其onLoad方法、onActive方法、onCompleted方法,一起来看下onCompleted方法:

  1. 在线程池中执行,配置拉取,pullConfig实际上就是调用console提供的接口能力
  2. 根据配置进行初始化
  3. 启动心跳检测
public void loadCompleted() {
   
        ExecutorInner.execute(new Runnable() {
   
            @Override
            public void run() {
   
                configManager = StandaloneSwitch.instance().getConfigManager();
                broadcaster = StandaloneSwitch.instance().getBroadcaster();
                invocationListener = new DefaultInvocationListener(broadcaster);
                RepeaterResult<RepeaterConfig> pr = configManager.pullConfig();
                if (pr.isSuccess()) {
   
                    log.info("pull repeater config success,config={}", pr.getData());
                    ClassloaderBridge.init(loadedClassDataSource);
                    initialize(pr.getData());
                }
            }
        });
        heartbeatHandler = new HeartbeatHandler(configInfo, moduleManager);
        heartbeatHandler.start();
    }

来看下初始化过程:

  • 根据配置装载插件,注意invokePlugin.watch的实现,这里最终就是调用了BuildingForBehavior.onWatch,如果看过上一篇文章就知道,sandbox就是在这个阶段实现类增强
String pluginsPath;
if (StringUtils.isEmpty(config.getPluginsPath())) {
   
    pluginsPath = PathUtils.getPluginPath();
} else {
   
    pluginsPath = config.getPluginsPath()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值