ChaosBlade--动态脚本实现 Java 实验场景

动态脚本实现 :

参考文档: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%AFjava

进阶文档解决问题:

  1. 脚本结构解析
  2. 三方工具类引用
  3. 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;
    }

}

  脚本执行效果:

相关文章
相关标签/搜索