动态脚本实现 :
参考文档:https://github.com/chaosblade-io/chaosblade/wiki/%E5%8A%A8%E6%80%81%E8%84%9A%E6%9C%AC%E5%AE%9E%E7%8E%B0-Java-%E5%AE%9E%E9%AA%8C%E5%9C%BA%E6%99%AF
进阶文档解决问题:
-
脚本结构解析
-
三方工具类引用
-
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(Mapparams) 方法 params 对象中包含目标方法参数 key 是参数索引下标 params.get("0") //调试脚本的时候添加log.info() 日志打印在对应目标服务的日志中 public class ChaosController { //打印日志便于调试、定位问题 private final static Log log = Log.get(HttpUtils.class); public Object run(Map params) { ArrayList 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 > 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 staticT getBean(Class clazz) { return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static T getBean(String name, Class 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(Mapparams) { 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; } }
脚本执行效果: