[jvm-sandbox-repeater 學習筆記][入門使用篇] 2 配置說明

ELes發表於2019-10-16

本文主要介紹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

相關文章