jvm-sandbox-repeater 精简版部署之非standalone模式

2023-12-09 16:45

本文主要是介绍jvm-sandbox-repeater 精简版部署之非standalone模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[root@k8s-worker27-65 jvm-sandbox-repeater]# pwd
/root/work/traffic/jvm-sandbox-repeater
[root@k8s-worker27-65 jvm-sandbox-repeater]# ls
bin   hessian-lite  pom.xml    repeater-aide    repeater-console  repeater-plugin-api   repeater-plugins  travis.sh
docs  LICENSE       Readme.md  repeater-client  repeater-module   repeater-plugin-core  target

1. 调整 repeater 模式配置,改为用 console

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat bin/repeater.properties  |grep -v '#' |grep -v '^$'
broadcaster.record.url=http://192.168.1.65:8001/facade/api/record/save
broadcaster.repeat.url=http://192.168.1.65:8001/facade/api/repeat/save
repeat.record.url=http://192.168.1.65:8001/facade/api/record/%s/%s
repeat.config.url=http://192.168.1.65:8001/facade/api/config/%s/%s
repeat.heartbeat.url=http://192.168.1.65:8001/module/report.json
repeat.standalone.mode=false
repeat.spring.advice.switch=false;

 2. 调整 console 工程中对应配置

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat repeater-console/repeater-console-start/src/main/resources/application.properties |grep data
spring.datasource.url=jdbc:mysql://192.168.1.65:3306/repeater?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456aA
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

3.初始化数据:

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat repeater-console/repeater-console-dal/src/main/resources/database.sql 
CREATE DATABASE IF NOT EXISTS repeaterDEFAULT CHARSET utf8COLLATE utf8_general_ci;
DROP TABLE IF EXISTS record;
CREATE TABLE record
(id             BIGINT(20)    NOT NULL AUTO_INCREMENT PRIMARY KEYCOMMENT '主键',gmt_create     DATETIME      NOT NULLCOMMENT '创建时间',gmt_record     DATETIME      NOT NULLcomment '录制时间',app_name       VARCHAR(255)  NOT NULLCOMMENT '应用名',environment    VARCHAR(255)  NOT NULLCOMMENT '环境信息',host           VARCHAR(36)   NOT NULLCOMMENT '机器IP',trace_id       VARCHAR(32)   NOT NULLCOMMENT '链路追踪ID',entrance_desc  VARCHAR(2000) NOT NULLCOMMENT '链路追踪ID',wrapper_record LONGTEXT      NOT NULLCOMMENT '记录序列化信息',request        LONGTEXT      NOT NULLCOMMENT '请求参数JSON',response       LONGTEXT      NOT NULLCOMMENT '返回值JSON'
)ENGINE = InnoDBCOMMENT = '录制信息'DEFAULT CHARSET = utf8AUTO_INCREMENT = 1;DROP TABLE IF EXISTS replay;
CREATE TABLE replay
(id              BIGINT(20)   NOT NULL AUTO_INCREMENT PRIMARY KEYCOMMENT '主键',gmt_create      DATETIME     NOT NULLCOMMENT '创建时间',gmt_modified    DATETIME     NOT NULLcomment '修改时间',app_name        VARCHAR(255) NOT NULLCOMMENT '应用名',environment     VARCHAR(255) NOT NULLCOMMENT '环境信息',ip              VARCHAR(36)  NOT NULLCOMMENT '机器IP',repeat_id       VARCHAR(32)  NOT NULLCOMMENT '回放ID',status          TINYINT      NOT NULLCOMMENT '回放状态',trace_id        VARCHAR(32)COMMENT '链路追踪ID',cost            BIGINT(20)COMMENT '回放耗时',diff_result     LONGTEXTCOMMENT 'diff结果',response        LONGTEXTCOMMENT '回放结果',mock_invocation LONGTEXTCOMMENT 'mock过程',success         BITCOMMENT '是否回放成功',record_id       BIGINT(20)COMMENT '外键')ENGINE = InnoDBCOMMENT = '回放信息'DEFAULT CHARSET = utf8AUTO_INCREMENT = 1;DROP TABLE IF EXISTS module_info;
CREATE TABLE module_info
(id           BIGINT(20)   NOT NULL AUTO_INCREMENT PRIMARY KEYCOMMENT '主键',gmt_create   DATETIME     NOT NULLCOMMENT '创建时间',gmt_modified DATETIME     NOT NULLcomment '修改时间',app_name     VARCHAR(255) NOT NULLCOMMENT '应用名',environment  VARCHAR(255) NOT NULLCOMMENT '环境信息',ip           VARCHAR(36)  NOT NULLCOMMENT '机器IP',port         VARCHAR(12)  NOT NULLCOMMENT '链路追踪ID',version      VARCHAR(128) NOT NULLCOMMENT '模块版本号',status       VARCHAR(36)  NOT NULLCOMMENT '模块状态'
)ENGINE = InnoDBCOMMENT = '在线模块信息'DEFAULT CHARSET = utf8AUTO_INCREMENT = 1;DROP TABLE IF EXISTS module_config;
CREATE TABLE module_config
(id           BIGINT(20)   NOT NULL AUTO_INCREMENT PRIMARY KEYCOMMENT '主键',gmt_create   DATETIME     NOT NULLCOMMENT '创建时间',gmt_modified DATETIME     NOT NULLcomment '录制时间',app_name     VARCHAR(255) NOT NULLCOMMENT '应用名',environment  VARCHAR(255) NOT NULLCOMMENT '环境信息',config       LONGTEXT     NOT NULLCOMMENT '配置信息'
)ENGINE = InnoDBCOMMENT = '模块配置信息'DEFAULT CHARSET = utf8AUTO_INCREMENT = 1;

4.启动 console 和被测服务

启动被测服务:

4.1、下载示例项目:https://github.com/chenhengjie123/gs-rest-service
4.2、启动示例项目:

# 在示例项目 clone 后的根目录中运行
cd complete 
mvn install && java -jar target/*.jar

4.3、修复官方仓库里 console 一些代码问题。

4.3.1)把 repeater-console/repeater-console-start/src/main/resources/velocity 下面的所有文件,查找 #parse("/blocks ,统一改替换为 #parse("blocks 。原有代码最前面带上 / 会导致引用找不到报错

4.3.2)修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java 中的 return "/replay/detail"; ,改为 return "replay/detail"; ,去掉双引号里面第一个 /
 

4.3.3)修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java 中的 return "/regress/index"; ,改为 return "regress/index";,去掉双引号里面第一个 /

4.4修改配置

配置:bin/bootstrap.sh

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat  bin/bootstrap.sh
#!/usr/bin/env bash# exit shell with err_code
# $1 : err_code
# $2 : err_msgtypeset HOME=/opt/data/fllexit_on_err()
{[[ ! -z "${2}" ]] && echo "${2}" 1>&2exit ${1}
}PID=$(ps -ef | grep "repeater-bootstrap.jar" | grep "java" | grep -v grep | awk '{print $2}')expr ${PID} "+" 10 &> /dev/null# if occurred error,exit
if [ ! $? -eq 0 ] || [ "" = "${PID}" ] ;thenecho ""
elseecho "found target pid exist, pid is ${PID}, kill it..."kill -9 ${PID}
fiif [ ! -f "${HOME}/sandbox-module/repeater-bootstrap.jar" ]; thenecho "repeater-bootstrap.jar not found, try to install";sh ./install-local.sh || exit_on_err 1 "install repeater failed"
fi${JAVA_HOME}/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 \-javaagent:${HOME}/sandbox/lib/sandbox-agent.jar=server.port=8820\;server.ip=0.0.0.0 \-Dapp.name=gs \-Dapp.env=sit \-jar ${HOME}/sandbox/sandbox-module/repeater-bootstrap.jar

配置:bin/install-local.sh

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat  bin/install-local.sh
#!/usr/bin/env bash# repeater's target dir
REPEATER_TARGET_DIR=../target/repeater# exit shell with err_code
# $1 : err_code
# $2 : err_msgtypeset HOME=/opt/data/fll
typeset SANDBOX_HOME=/opt/data/fll/sandboxexit_on_err()
{[[ ! -z "${2}" ]] && echo "${2}" 1>&2exit ${1}
}# package
sh ./package.sh || exit_on_err 1 "install failed cause package failed"# extract sandbox to ${HOME}
#curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar | tar xz -C ${HOME} || exit_on_err 1 "extract sandbox failed"
cat sandbox-1.3.3-bin.tar | tar xz -C ${HOME} || exit_on_err 1 "extract sandbox failed"# copy module to ~/.sandbox-module
#mkdir -p ${HOME}/.sandbox-module || exit_on_err 1 "permission denied, can not mkdir ~/.sandbox-module"
cp -r ${REPEATER_TARGET_DIR}/* ${SANDBOX_HOME}/sandbox-module  || exit_on_err 1 "permission denied, can not copy module to ${SANDBOX_HOME}/sandbox-module"

 配置:bin/repeater.properties

[root@k8s-worker27-65 jvm-sandbox-repeater]# cat bin/repeater.properties
# 录制消息投递地址
broadcaster.record.url=http://192.168.1.65:8001/facade/api/record/save# 回放结果投递地址
broadcaster.repeat.url=http://192.168.1.65:8001/facade/api/repeat/save# 回放消息取数据地址
repeat.record.url=http://192.168.1.65:8001/facade/api/record/%s/%s# 配置文件拉取地址
repeat.config.url=http://192.168.1.65:8001/facade/api/config/%s/%s# 心跳上报配置
repeat.heartbeat.url=http://192.168.1.65:8001/module/report.json# 是否开启脱机工作模式
repeat.standalone.mode=false# 是否开启spring advice拦截
repeat.spring.advice.switch=false;

 编译且直接启动

[root@k8s-worker27-65 bin]# ./bootstrap.sh

 也可以编译不启动

4.5 启动 console:

编译
[root@k8s-worker27-65 bin]# ./install-local.sh启动[root@k8s-worker27-65 sandbox-module]# pwd
/opt/data/fll/sandbox/sandbox-module
[root@k8s-worker27-65 sandbox-module]# ls
cfg  plugins  repeater-bootstrap.jar  repeater-module.jar
[root@k8s-worker27-65 sandbox-module]# nohup java -jar repeater-bootstrap.jar &

我自己的在:

[root@k8s-worker27-65 .sandbox-module]# pwd
/root/.sandbox-module
[root@k8s-worker27-65 .sandbox-module]# ls
cfg  plugins  repeater-bootstrap.jar  repeater-module.jar[root@k8s-worker27-65 .sandbox-module]# nohup java -jar repeater-bootstrap.jar &
[1] 30357

5. 使用界面化的 console 进行录制回放

现在,借助界面来做一次录制回放吧。基本套路还是一样的:

5.1、在 console 增加配置,用于对接应用(注意这个和之前纯命令行有点不同,命令行是先完成第二步)
5.2、让 repeater 注入到被测应用,上报数据到 console
5.3、在 console 中操作,进行录制和回放

接下来,一步一步操作。

5.1、在 console 增加配置,用于对接应用

点击左侧的【配置管理】,添加如下配置:

应用名:gs
环境:sit
配置信息

{"useTtl" : true,"degrade" : false,"exceptionThreshold" : 1000,"sampleRate" : 10000,"pluginsPath" : null,"httpEntrancePatterns" : [ "^/greeting.*$" ],"javaEntranceBehaviors" : [],"javaSubInvokeBehaviors" : [ {"classPattern" : "hello.GreetingController","methodPatterns" : [ "greeting" ],"includeSubClasses" : false} ],"pluginIdentities" : [ "http", "java-entrance", "java-subInvoke", "mybatis", "ibatis" ],"repeatIdentities" : [ "java", "http" ]
}

应用名:jettopro
环境:dev

{"useTtl" : true,"degrade" : false,"exceptionThreshold" : 1000,"sampleRate" : 10000,"pluginsPath" : null,"httpEntrancePatterns" : [ "^/jettopro-basic/.*$" ],"javaEntranceBehaviors" : [],"javaSubInvokeBehaviors" : [ {"classPattern" : "com.cn.jettech.jettoprobasic.controller.basiccontroller02.BasicController201","methodPatterns" : [ "basichello20101" ],"includeSubClasses" : false} ],"pluginIdentities" : [ "http", "java-entrance", "java-subInvoke", "mybatis", "ibatis" ],"repeatIdentities" : [ "java", "http" ]
}

5.2、让 repeater 注入到被测应用 attach方式默认就是uknow

[root@k8s-worker27-65 bin]# ./sandbox.sh -p (ps -ef | grep "target/gs-rest-service-0.1.0.jar" | grep -v grep | awk '{print $2}') -P 12580

还可以agent方式:这种方式是指可以指定名字的

nohup  java -javaagent:/opt/data/fll/sandbox/lib/sandbox-agent.jar=server.port=12580\;server.ip=192.168.1.65 -Dapp.name=gs -Dapp.env=sit -jar gs-rest-service-0.1.0.jar &

这篇关于jvm-sandbox-repeater 精简版部署之非standalone模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474399

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听