zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
    

      脚本执行效果:

      

           

  • 相关阅读:
    node.js学习二---------------------同步API和异步API的区别
    node.js学习一---------------------模块的导入
    ES6函数的特性(箭头语法)
    10分钟了解Android的Handler机制
    10分钟了解Android的事件分发
    SwipeRefreshLayout,用最少的代码定制最美的上下拉刷新样式
    手把手教你React Native 实战之开山篇《一》
    Android 组件化方案探索与思考
    2018谷歌I/O开发者大会8大看点汇总 新品有哪些
    Glide高级详解—缓存与解码复用
  • 原文地址:https://www.cnblogs.com/emars/p/12221887.html
Copyright © 2011-2022 走看看