本文主要介绍 jvm-sandbox-repeater 项目中各个配置文件,包括其字段说明、配置文件作用以及修改生效的方法。
系列文章导航:
[jvm-sandbox-repeater 学习笔记][入门使用篇] 1 安装与启动
[jvm-sandbox-repeater 学习笔记][入门使用篇] 2 配置说明(本文)
[jvm-sandbox-repeater 学习笔记][入门使用篇] 3 现有接口说明
[jvm-sandbox-repeater 学习笔记][入门使用篇] 4 录制、回放与调试
如果需要针对自己的项目进行录制入口和配置的调整,则需要进行录制回访配置的调整。
这个配置的解读,主要依赖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
|
在非 standalone 模式下,会从 repeater-console 的 /facade/api/config/${appName}/${env}
接口中拉取配置。
在 standalone 模式下则读取~/.sandbox-module/cfg/repeater-config.json
下的配置。
按照官方提供的例子,修改为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。
直接修改~/.sandbox-module/cfg/repeater-config.json
文件中的内容。
PS:修改后,如果本地重新安装了 repeater 则会恢复到没有修改的情况。如果想知道怎么样重新安装都不会被重置,那就看看 bin 目录下的install-local.sh
、package.sh
了解下安装过程都干了啥。
repeater 会在启动过程中拉取配置。
参考1.4 repeater启动与关闭
章节中的启动与关闭相关命令,进行 repeater 重启。启动过程将会重新从 repeater-console 拉取配置。standalone 模式下也会重新读取配置。
在com.alibaba.jvm.sandbox.repeater.module.RepeaterModule
类中,实现了推送配置更新的接口。
可通过访问http://${repeater.ip}:${repeater.port}/sandbox/default/module/http/repeater/pushConfig
接口,将配置的内容序列化后传输过去。
PS:但是由于 repeater 插件中只有 JavaSubInvokePlugin 插件实现了 onConfigChange 方法,所以这个接口功能并不完善。
该配置文件主要是控制 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>
该配置文件主要是 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
位于 jvm-sandbox-repeater/repeater-console/repeater-console-start/src/main/resources/application.properties。
就是普通 springboot 应用的 application.properties。这里有两点需要注意:
console.use.localCache
只能选用 false,使用内存存储模式。使用内存存储模式意味着每一次重启 repeater-console 都会丢失所有记录。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