本文主要介绍 jvm-sandbox-repeater 项目中各个配置文件,包括其字段说明、配置文件作用以及修改生效的方法。

系列文章导航:
[jvm-sandbox-repeater 学习笔记][入门使用篇] 1 安装与启动
[jvm-sandbox-repeater 学习笔记][入门使用篇] 2 配置说明(本文)
[jvm-sandbox-repeater 学习笔记][入门使用篇] 3 现有接口说明
[jvm-sandbox-repeater 学习笔记][入门使用篇] 4 录制、回放与调试

2.1 录制回放配置

如果需要针对自己的项目进行录制入口和配置的调整,则需要进行录制回访配置的调整。

2.1.1 录制回放配置字段说明

这个配置的解读,主要依赖com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig类以及调用到这个类中方法的逻辑的说明。

配置名 配置含义 参数说明 备注
pluginIdedentities 录制所使用的插件列表,配置了相应的插件名称,才能启用对应类别插件类别的录制 插件名称
有效值有:"http", "java-entrance", "java-subInvoke", "mybatis", "redis","ibatis","dubbo-consumer","dubbo-provider"
1、插件配置生效还需要~/.sandbox-module/plugins/有对应的插件 jar 包。
2、该参数有效值字段对应的取值是源码中实现了InvokePlugin的类的identity方法。
repeatIdentities 回放所使用的插件列表,配置了对应的插件,才能进行对应类别的回放 插件名称
有效值有:"http", java", "dubbo"
1、插件配置生效还需要~/.sandbox-module/plugins/有对应的插件 jar 包。
2、该参数有效值字段对应的取值是源码中实现了Repeater的类的identity方法。
httpEntrancePatterns 需要录制和回放的 http 接口
需要同时在 pluginIdedentities 和 repeatIdentities 中都配置了http这个配置才生效
链接的路径 参数支持正则表达式:"^/alertService/.*$"
javaSubInvokeBehaviors 需要录制和 mock 的 java 方法的配置
需要 pluginIdedentities 配置了java-subInvoke这个配置才生效
类名、方法名、以及是否包含子方法(若为 true,则匹配该类下的所有子类或者实现类,实际是否可用,有待验证),支持正则表达式 如下配置的意思就是 com.test.server.utils 包下所有类和所有方法
{
"classPattern": "com.test.server.utils.*",
"methodPatterns": [ "*" ],
"includeSubClasses": false
}
javaEntranceBehaviors 需要录制和回放的 java 方法的入口
需要同时在 pluginIdedentities 配置了java-entrance以及 repeatIdentities 配置了java这个配置才生效
类名、方法名、以及是否包含子方法(若为 true,则匹配该类下的所有子类或者实现类,实际是否可用,有待验证),支持正则表达式 如下配置的意思就是 com.test.utils 包下所有类和所有方法
{
"classPattern": "com.test.utils.*",
"methodPatterns": [ "*" ],
"includeSubClasses": false
}
如果该入口方法在某个 http 入口的调用链路下,可能不会被录制到,如 com.test.controller.hello() 方法,本身对应着 “/hello 的访问路径,则录制时无法录制到以这个 hello 方法为入口的 java 录制记录”
pluginsPath 插件路径 String,默认填 null 即可 默认填 null 即可
exceptionThreshold 异常发生阈值;默认 1000 当ExceptionAware感知到异常次数超过阈值后,会降级模块 Integer,默认填 1000 即可 当前只使用过 1000,未出现过降级情况。
当出现降级则不再进行任何录制。
涉及的关键方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access
degrade 开启之后,不进行录制,只处理回放请求 boolean,默认填 false 即可 当前只使用过 false
按照字面理解就是当这个改为 true 之后,不再进行录制。
涉及的关键方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access
useTtl 是否开启 ttl 线程上下文切换
开启之后,才能将并发线程中发生的子调用记录下来,否则无法录制到并发子线程的子调用信息
原理是将住线程的 threadLocal 拷贝到子线程,执行任务完成后恢复
boolean,默认填 true 即可 默认使用 true,开启线程跟踪
sampleRate 采样率;最小粒度万分之一 Integer 默认填 10000 即可 当前只使用过 10000,可以结合这个方法理解com.alibaba.jvm.sandbox.repeater.plugin.core.trace.TraceContext#inTimeSample

2.1.2 在哪里调整录制回放配置

在非 standalone 模式下,会从 repeater-console 的 /facade/api/config/${appName}/${env}接口中拉取配置。

在 standalone 模式下则读取~/.sandbox-module/cfg/repeater-config.json下的配置。

2.1.2.1 非 standalone 模式下

按照官方提供的例子,修改为com.alibaba.repeater.console.start.controller.ConfigFacadeApi#getConfig方法,重新组装RepeaterConfig对象。

PS:修改之后,repeater-console 获取配置的接口需要重启后才能返回修改后的配置内容。

 package com.alibaba.repeater.console.start.controller;
/**
 * {@link ConfigFacadeApi} Demo工程;作为repeater录制回放的配置管理服务
 * <p>
 *
 * @author zhaoyb1990
 */
@RestController
@RequestMapping("/facade/api")
public class ConfigFacadeApi {

    @RequestMapping("/config/{appName}/{env}")
    public RepeaterResult<RepeaterConfig> getConfig(@PathVariable("appName") String appName,
                                                    @PathVariable("env") String env) {
        // 自己存配置;目前直接Mock了一份
        RepeaterConfig config = new RepeaterConfig();
        List<Behavior> behaviors = Lists.newArrayList();
        config.setPluginIdentities(Lists.newArrayList("http", "java-entrance", "java-subInvoke", "mybatis", "ibatis"));
        // 回放器
        config.setRepeatIdentities(Lists.newArrayList("java", "http"));
        // 白名单列表
        config.setHttpEntrancePatterns(Lists.newArrayList("^/regress/.*$"));
        // java入口方法
        behaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "getRegress"));
        config.setJavaEntranceBehaviors(behaviors);
        List<Behavior> subBehaviors = Lists.newArrayList();
        // java调用插件
        subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "getRegressInner"));
        subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "findPartner"));
        subBehaviors.add(new Behavior("com.alibaba.repeater.console.service.impl.RegressServiceImpl", "slogan"));
        config.setJavaSubInvokeBehaviors(subBehaviors);
        config.setUseTtl(true);
        return RepeaterResult.builder().success(true).message("operate success").data(config).build();
    }

}

PS: 可以自行调整这个接口,改为读取文件的模式,这样可以做到修改配置不需要重启 repeater-console。

2.1.2.2 standalone 模式下

直接修改~/.sandbox-module/cfg/repeater-config.json文件中的内容。

PS:修改后,如果本地重新安装了 repeater 则会恢复到没有修改的情况。如果想知道怎么样重新安装都不会被重置,那就看看 bin 目录下的install-local.shpackage.sh了解下安装过程都干了啥。

2.1.3 调整配置后,如何生效

repeater 会在启动过程中拉取配置。

2.1.3.1 重启 repeater(可用)

参考1.4 repeater启动与关闭章节中的启动与关闭相关命令,进行 repeater 重启。启动过程将会重新从 repeater-console 拉取配置。standalone 模式下也会重新读取配置。

2.1.3.2 使用 repeaterModule 中的接口更新配置(不可用,repeater 有缺陷有待完善)

com.alibaba.jvm.sandbox.repeater.module.RepeaterModule类中,实现了推送配置更新的接口。

可通过访问http://${repeater.ip}:${repeater.port}/sandbox/default/module/http/repeater/pushConfig接口,将配置的内容序列化后传输过去。

PS:但是由于 repeater 插件中只有 JavaSubInvokePlugin 插件实现了 onConfigChange 方法,所以这个接口功能并不完善。

2.2 其他配置

2.2.1 repeater-logback.xml

该配置文件主要是控制 repeater 的日志打印路径地址以及打印等级。

一般会在需要调整日志等级的时候修改。

实际生效的配置是位于~/.sandbox-module/cfg 中的 repeater-logback.xml。

在项目的 bin 目录下也有一份 repeater-logback.xml,这份是在执行安装脚本的时候会被复制到~/.sandbox-module/cfg 下的。

每次修改这份配置,都需要重启 repeater 才能生效。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10000">

    <appender name="REPEATER-FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件地址-->
        <file>${user.home}/logs/sandbox/repeater/repeater.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--历史日志文件地址-->
            <FileNamePattern>${user.home}/logs/sandbox/repeater/repeater.log.%d{yyyy-MM-dd}</FileNamePattern>
            <!--历史日志最大保存天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <!--日志格式-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--日志等级-->
    <root level="info">
        <appender-ref ref="REPEATER-FILE-APPENDER"/>
    </root>

</configuration>

2.2.2 repeater.properties

该配置文件主要是 repeater 是否以 standalone 模式运行,以及以非 standalone 模式运行时与 repeater-console 交互的 url 路径。

一般会在需要调整 repeater-console 地址的时候进行修改。repeat.standalone.mode一般用 false,使用非 standalone 模式。

实际生效的配置是位于~/.sandbox-module/cfg 中的 repeater.properties。

在项目的 bin 目录下也有一份 repeater.properties,这份是在执行安装脚本的时候会被复制到~/.sandbox-module/cfg 下的。

每次修改这份配置,都需要重启 repeater 才能生效。

如下的配置,http://127.0.0.1:8001 为 repeater-console 的地址。

# 录制消息投递地址
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save

# 回放结果投递地址
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save

# 回放消息取数据地址
repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s

# 配置文件拉取地址
repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s

# 是否开启脱机工作模式
repeat.standalone.mode=false

2.2.3 repeater-console 的 application.properties

位于 jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/resources/application.properties。

就是普通 springboot 应用的 application.properties。这里有两点需要注意:

  1. 目前官方版本的 mysql 存储尚未完善,所以console.use.localCache只能选用 false,使用内存存储模式。使用内存存储模式意味着每一次重启 repeater-console 都会丢失所有记录。
  2. repeat.repeat.url对应的是 repeater 推送回放任务的地址,所以如果本地的 repeater 不是以 8820 端口启动,或者非本地的 repeater,需要相应修改这个地址的 ip 和端口。
spring.application.name=repeater-server
server.port=8001
mybatis.type-aliases-package=com.alibaba.repeater.console.dal.model
# 本地mysql数据源测试
spring.datasource.url=jdbc:mysql://localhost:13306/repeater?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 使用本地数据源进行测试
console.use.localCache=false
# 触发repeater执行回放任务的回放地址
repeat.repeat.url=http://127.0.0.1:8820/sandbox/default/module/http/repeater/repeat


↙↙↙阅读原文可查看相关链接,并与作者交流