• 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%AF

    进阶文档解决问题:

    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 

            

             (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;
        }
    
    }
    

      脚本执行效果:

      

           

  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/emars/p/12221887.html
Copyright © 2020-2023  润新知