動態腳本實現 :
進階文檔解決問題:
-
腳本結構解析
-
三方工具類引用
-
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 git
(2)、進入chaosblade.log 日誌查看腳本執行是否生效:github
(3)、查看目標服務的日誌:spring
這就是最基本動態腳本實現。app
三方工具類引用
動態腳本的實現每每會根據不一樣的場景來實現,可是有不少時候工程內的工具類沒法知足需求。這個時候咱們的動態腳本還須要用ide
如何實現呢?? 例如我要生成隨機身份證、姓名、電話號(我本身的jar包工具類用於測試)工具
解決方案:測試
將對應的jar包工具類放入jdk中 這樣JVM啓動的時候就會掃描到你的工具類spa
(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; } }
腳本執行效果: