動態腳本實現 :
進階文檔解決問題:
-
腳本結構解析
-
三方工具類引用
-
SpringBoot管理Bean 手動引入
腳本結構解析:
package com.alibaba.csp.monkeyking.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.alibaba.csp.monkeyking.demo.model.Pet;
import com.alibaba.csp.monkeyking.model.PetVO;
import com.alibaba.csp.monkeyking.model.Result;
//包名沒有限制可以隨意
//依賴的類,必須是目標應用所具備的類或者JDK自帶的
//必須添加 public Object run(Map<String, Object> params) 方法 params 對象中包含目標方法參數 key 是參數索引下標 params.get("0")
//調試腳本的時候添加log.info() 日志打印在對應目標服務的日志中
public class ChaosController {
//打印日志便於調試、定位問題
private final static Log log = Log.get(HttpUtils.class);
public Object run(Map<String, Object> params) {
ArrayList<PetVO> petVOS = new ArrayList<>();
log.info("測試難受啊!!!!!!!!!!!!!!!!!");
for (int i = 0; i < 3; i++) {
Pet pet = new Pet();
pet.setName("test_" + i);
PetVO petVO = PetVO.from(pet);
petVOS.add(petVO);
}
Result<List<PetVO>> results = Result.success(petVOS);
return results;
}
}
調試腳本具體方法:
(1)、 用戶目錄下日志: /用戶/logs/chaosblade/chaosblade.log

(2)、進入chaosblade.log 日志查看腳本執行是否生效:

(3)、查看目標服務的日志:

這就是最基本動態腳本實現。
三方工具類引用
動態腳本的實現往往會根據不同的場景來實現,但是有很多時候工程內的工具類無法滿足需求。這個時候我們的動態腳本還需要用
如何實現呢?? 例如我要生成隨機身份證、姓名、電話號(我自己的jar包工具類用於測試)
解決方案:
將對應的jar包工具類放入jdk中 這樣JVM啟動的時候就會掃描到你的工具類
(1)、查找jdk位置

(2)、將工具類jar包 方法放入/opt/soft/packet/jdk/jre/lib/ext
注意:你的工具類放入jdk中可能會引起其他服務的jar包沖突,如果其他服務無法啟動。先把你放入jdk中的jar包刪除。待服務啟動后 再放入即可
SpringBoot管理Bean 手動引入
為什么要手動引入Bean呢?現在大部分代碼都是通過Spring 管理的Bean的。我們腳本要使用Bean呢。首先明確一點 動態腳本中不能使用 Spring bean
自動注入。如果我們要使用對應的Bean 就需要手動獲取Bean。
(1) 、對應的工程中要有手動注入Bean放入工具類
package com.test.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanUtils.applicationContext = applicationContext;
}
private static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通過name獲取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
(2)、動態腳本中手動獲取Bean
package com.test.controller;
import com.test.utils.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ChaosController {
private final static Log log = Log.get(HttpUtils.class);
//Chaosblade腳本入口
public Object run(Map<String, Object> params) {
BeanUtils applicationContext = new BeanUtils();
//獲取Bean類
log.info("測試難受啊 !******************************************************");
Test test= applicationContext.getBean("***", ***.class);
log.info("測試"+ test.toString());
Test2 test2= applicationContext.getBean("***", ***.class);
log.info("測試難受啊 !"+test2.toString());
return 0;
}
}
腳本執行效果:

