本文主要介绍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 repeat.repeat.url
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
↙↙↙阅读原文可查看相关链接,并与作者交流