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

}

  腳本執行效果:

相關文章
相關標籤/搜索