最权威的做网站优化价格/石家庄限号
jvm-sandbox-repeater 仅仅提供了录制回放的能力,如果需要完成
业务回归
、实时监控
、压测
等平台,后面须要有一个数据中心
负责采集数据的加工、存储、搜索,repeater-console提供了简单的demo示例;一个模块管理
平台负责管理JVM-Sandbox各模块生命周期;一个配置管理
平台负责维护和推送jvm-sandbox-repeater采集所须要的各种配置变更在阿里集团淘系技术质量内部,已有一套完整的体系在持续运行,从17年开始支持了淘系技术质量部的CI、建站、系统重构等多方面质量保障任务,后续如有需要也会考虑把更多的东西开源回馈社区
注意:目前项目代码默认启动standalone模式,不需要依赖任何服务端和存储,能够简单快速的实现单机的录制回放, 控制单机模式的开关在
~/.sandbox-module/cfg/repeater.properties
配置文件的repeat.standalone.mode=true
,开启或关闭单机工作模式,关闭单机模式后,配置拉取/消息投递等都依赖repeater.properties中配置的具体url;如不想通过http拉取和消息投递的也可以自己实现Broadcaster
和ConfigManager
。稍后我们会公布一份录制回放所需的完整架构图以及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
[root@k8s-worker27-65 jvm-sandbox-repeater]# ls bin/
bootstrap.sh install-local.sh package.sh repeater-logback.xml sandbox-1.3.3-bin.tar
health.sh install-repeater.sh repeater-config.json repeater.properties
standalone模式,repeat.standalone.mode=true
[root@k8s-worker27-65 jvm-sandbox-repeater]# git cloen https://github.com/alibaba/jvm-sandbox-repeater.git[root@k8s-worker27-65 jvm-sandbox-repeater]# pwd
/root/work/traffic/jvm-sandbox-repeater
[root@k8s-worker27-65 jvm-sandbox-repeater]# cat bin/repeater.properties
# 录制消息投递地址
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save# 回放结果投递地址
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save# 回放消息取数据地址
repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s# 配置文件拉取地址
repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s# 心跳上报配置
repeat.heartbeat.url=http://127.0.0.1:8001/module/report.json# 是否开启脱机工作模式
repeat.standalone.mode=true# 是否开启spring advice拦截
repeat.spring.advice.switch=false;
由于https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar 下载费劲,我先现在了然后改成一下脚本不用每次下载
[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_msg
exit_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}/* ${HOME}/.sandbox-module || exit_on_err 1 "permission denied, can not copy module to ~/.sandbox-module"
快速开始
1. 本地standalone工作(剥离服务端和存储,本机实现录制/回放)
step0 安装sandbox/启动bootstrap
[root@k8s-worker27-65 jvm-sandbox-repeater]# cd bin
[root@k8s-worker27-65 jvm-sandbox-repeater]# ./bootstrap.sh
安装后的结构:
[root@k8s-worker27-65 .sandbox-module]# ls /root/sandbox/
bin cfg example install-local.sh lib module provider sandbox-module
[root@k8s-worker27-65 .sandbox-module]# ls /root/.sandbox-module/
cfg plugins repeater-bootstrap.jar repeater-module.jar
启动命令:也可以自己手动启动
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -javaagent:/root/sandbox/lib/sandbox-agent.jar=server.port=8820\;server.ip=0.0.0.0 -Dapp.name=jettopro -Dapp.env=sit -jar /root/.sandbox-module/repeater-bootstrap.jar
java
-javaagent:${HOME}/sandbox/lib/sandbox-agent.jar=server.port=${repeater 启动端口}\;server.ip=0.0.0.0 \
-Dapp.name=${录制应用名} \
-Dapp.env=${录制环境} \
-jar application.jar
正常启动的是这个应用程序:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar /root/.sandbox-module/repeater-bootstrap.jar
录播:
[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">JAVA是世界上最好的语言!</h1>
回放
curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId-X=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">Python是世界上最好的语言!</h1>
此时回放是有问题的,因为没有监听自己的repeater-bootstrap.jar这个应用,监听方式有两种方
1.javaagent方式
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -javaagent:/root/sandbox/lib/sandbox-agent.jar=server.port=8820\;server.ip=0.0.0.0 -Dapp.name=jettopro -Dapp.env=sit -jar /root/.sandbox-module/repeater-bootstrap.jar
2.attach方式,先获取pid然后监听
[root@k8s-worker27-65 ~]# ps -ef |grep java
root 16713 13435 99 10:55 pts/1 00:00:33 java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar /root/.sandbox-module/repeater-bootstrap.jar
监听:
[root@k8s-worker27-65 ~]# cd ~/sandbox/bin/
[root@k8s-worker27-65 bin]# ls
sandbox.sh
[root@k8s-worker27-65 bin]# ./sandbox.sh -p 16713 -P 12580
cat: /root/.sandbox.token: 没有那个文件或目录NAMESPACE : defaultVERSION : 1.3.3MODE : ATTACHSERVER_ADDR : 0.0.0.0SERVER_PORT : 12580UNSAFE_SUPPORT : ENABLESANDBOX_HOME : /root/sandbox/bin/..SYSTEM_MODULE_LIB : /root/sandbox/bin/../moduleUSER_MODULE_LIB : /root/sandbox/sandbox-module;~/.sandbox-module;SYSTEM_PROVIDER_LIB : /root/sandbox/bin/../providerEVENT_POOL_SUPPORT : DISABLE
然后就是可以开始录制和回放了
step1 开始录制
[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">C#是世界上最好的语言!</h1>[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">C++是世界上最好的语言!</h1>[root@k8s-worker27-65 ~]#
是不是看到了C++是世界上最好的语言;我们希望让这一刻永远定格;访问链接时,repeater插件通过Repeat-TraceId=127000000001156034386424510000ed,唯一追踪到了这一次请求,后台服务返回了
C++是世界上最好的语言!
,repeater把画面定格在了这一秒并将结果和127000000001156034386424510000ed绑定
step2 开始回放
[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId-X=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">C++是世界上最好的语言!</h1>[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId-X=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">C++是世界上最好的语言!</h1>[root@k8s-worker27-65 ~]# curl -s 'http://127.0.0.1:8001/regress/slogan?Repeat-TraceId-X=127000000001156034386424510000ed'
<h1 align="center" style="color:red;margin-top:300px">C++是世界上最好的语言!</h1>[root@k8s-worker27-65 ~]#
无论我们多少次访问这个地址,都将返回Repeat-TraceId=127000000001156034386424510000ed绑定的录制信息
C++是世界上最好的语言!
;如果重新访后又会将最新的返回结果绑定到Repeat-TraceId=127000000001156034386424510000ed(为了快速演示,将链路追踪的标志提到参数中进行透传了)
RegressController中提供了更多的测试用例,包括异步servlet、多线程调用、复杂结构返回对象,可以根据slogan类似的方式进行测试。
简单揭秘:
/regress/slogan
接口调用了RegressServiceImpl#slogan
方法
private AtomicInteger sequence = new AtomicInteger(0);private String[] slogans = new String[]{"JAVA", "Python", "PHP", "C#", "C++", "Javascript", "GO"};public String slogan() {return slogans[sequence.getAndIncrement() % slogans.length] + "是世界上最好的语言!";
}
仔细查看该方法代码会发现,每次请求时都会返回不同的语言,为什么回放时每次都返回同样的结果呢?原因很简单,我们对
RegressServiceImpl#slogan
进行了mock,在回放时开启了mock能力,调用slogan的BEFORE
事件时找到了合适值,直接利用ProcessControlException.throwReturnImmediately
进行了直接返回,RegressServiceImpl的第72行代码在mock回放时永远不会走到。得益于在repeater-config.json中开启了java插件并且默认拦截了RegressServiceImpl#slogan方法,录制slogan时同时录制java子调用
想要知道应用层面发生了什么吗?请看《Slogan Demo究竟发生了什么》
不编译非源码部署:
[root@k8s-worker27-65 bin]# ls sandbox-1.3.3-bin.tar repeater-stable-bin.tar
repeater-stable-bin.tar sandbox-1.3.3-bin.tar
1. sandbox-1.3.3-bin.tar:https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/sandbox-1.3.3-bin.tar
1.1)这个是官网下载的解压后:
[root@k8s-worker27-65 ~]# ls sandbox
bin cfg example install-local.sh lib module provider sandbox-module
1.2 )配置文件:
[root@k8s-worker27-65 sandbox]# cat cfg/sandbox.properties |grep -v "#" |grep -v "^$"
user_module=/root/sandbox-module;
server.charset=UTF-8
unsafe.enable=true
user_module=/root/sandbox-module; 配置为sandbox-module所在的路径即可
2. repeater-stable-bin.tar 自己编译或官网下载都可以
https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/repeater-stable-bin.tar
2.1)解压之后:
[root@k8s-worker27-65 ~]# ls sandbox-module/
cfg plugins repeater-bootstrap.jar repeater-data repeater-module.jar
2.2)配置文件:
[root@k8s-worker27-65 cfg]# cat repeater.properties |grep -v "#" |grep -v "^$"
broadcaster.record.url=http://127.0.0.1:8001/facade/api/record/save
broadcaster.repeat.url=http://127.0.0.1:8001/facade/api/repeat/save
repeat.record.url=http://127.0.0.1:8001/facade/api/record/%s/%s
repeat.config.url=http://127.0.0.1:8001/facade/api/config/%s/%s
repeat.heartbeat.url=http://127.0.0.1:8001/module/report.json
repeat.standalone.mode=true
repeat.spring.advice.switch=false;
repeat.standalone.mode=true
【1】true:就是本地模式不需要数据库存在录播文件,在本地目录中存储[root@k8s-worker27-65 sandbox-module]# ls sandbox-module/repeater-data/record/127000000001156034386424510000ed【2】false:需要数据库mysql进行存储
录制自己的应用:
[root@k8s-worker27-65 aaaa]# cat repeater/cfg/repeater-config.json
{"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" ]
}
自己应用的pid:26362
[root@k8s-worker27-65 target]# ps -ef |grep java
root 26200 13435 11 14:20 pts/1 00:01:00 java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -javaagent:/opt/aaaa/sandbox/lib/sandbox-agent.jar=server.port=8820;server.ip=0.0.0.0 -Dapp.name=jettopro -Dapp.env=sit -jar /opt/aaaa/repeater/repeater-bootstrap.jar
root 26362 13398 5 14:21 pts/0 00:00:22 java -jar gs-rest-service-0.1.0.jar
1)attach自己的pid进行监听
[root@k8s-worker27-65 bin]# pwd
/opt/aaaa/sandbox/bin
[root@k8s-worker27-65 bin]# ./sandbox.sh -p 26362 -P 12501NAMESPACE : defaultVERSION : 1.3.3MODE : ATTACHSERVER_ADDR : 0.0.0.0SERVER_PORT : 12501UNSAFE_SUPPORT : ENABLESANDBOX_HOME : /opt/aaaa/sandbox/bin/..SYSTEM_MODULE_LIB : /opt/aaaa/sandbox/bin/../moduleUSER_MODULE_LIB : /opt/aaaa/sandbox/sandbox-module;/opt/aaaa/repeater;SYSTEM_PROVIDER_LIB : /opt/aaaa/sandbox/bin/../providerEVENT_POOL_SUPPORT : DISABLE
2)测试自己的服务是否可以录制:因为是录制id一直在增加
[root@k8s-worker27-65 repeater]# pwd
/opt/aaaa/repeater
[root@k8s-worker27-65 repeater]# ls
cfg plugins repeater-bootstrap.jar repeater-module.jar
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId=127000000001156034386424510000ea'
{"id":25,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId=127000000001156034386424510000eb'
{"id":26,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId=127000000001156034386424510000ec'
{"id":27,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId=127000000001156034386424510000ed'
{"id":28,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId=127000000001156034386424510000ee'
{"id":29,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# ls
cfg plugins repeater-bootstrap.jar repeater-data repeater-module.jar有这个 repeater-data 目录说明录制成功
回放:多次执行一直都是id为25没有增加,说明定在了id为25这个条目上,可以对id=25进行多次回放,也可以选在id进行回放。但是id没有进行录制过的进行回放是回放不了的如id是30的
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ea'
{"id":25,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000eb'
{"id":26,"content":"Hello, jettech01!"}
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ec'
{"id":27,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ed'
{"id":28,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ee'
{"id":29,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ef'
{"id":30,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
[root@k8s-worker27-65 repeater]# curl -s 'http://localhost:8080/greeting?name=jettech01&Repeat-TraceId-X=127000000001156034386424510000ea'
{"id":25,"content":"Hello, jettech01!"}[root@k8s-worker27-65 repeater]#
https://github.com/alibaba/jvm-sandbox-repeater/blob/master/docs/user-guide-cn.md#2-%E5%BF%AB%E9%80%9F%E5%BD%95%E5%88%B6%E8%87%AA%E5%B7%B1%E5%BA%94%E7%94%A8
相关文章:

jvm-sandbox-repeater 精简版部署之standalone模式
jvm-sandbox-repeater 仅仅提供了录制回放的能力,如果需要完成业务回归、实时监控、压测等平台,后面须要有一个数据中心负责采集数据的加工、存储、搜索,repeater-console提供了简单的demo示例;一个模块管理平台负责管理JVM-Sandb…...

【JavaWeb笔记】单选框,结合Servlet
各个部分的作用 jsp部分 form action"...":表单标签,供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio":输入类型为单选框。把name设置为一样的,这样效果上就是单选ÿ…...

Docker 与 Podman:揭示容器编排的最佳 25 大常见问题解答
让我们告诉你一件事。 这不仅仅是这两个强大平台之间的普通比较。 相反,我们分析并列出了有关 Docker 与 Podman 的最紧迫问题。 但这里有一件事——这些问题不仅被技术角度所包围。 我们还深入研究了业务环境,因为我们知道这不仅仅是关于代码。这是…...

Spark分布式内存计算框架
目录 一、Spark简介 (一)定义 (二)Spark和MapReduce区别 (三)Spark历史 (四)Spark特点 二、Spark生态系统 三、Spark运行架构 (一)基本概念 &#x…...

安装python第三方库后,在pycharm中不能正常导入
python小白学习opencv,使用pip安装完opencv库后import cv2报错,按照如下设置解决: 需要正确设置python解释器路径...

从“食”到“用”,燕之屋的未来增长价值几何?
12月12日,燕窝行业头部企业燕之屋在港交所上市。 作为新消费的热门赛道,近年滋补品的关注度一直比较高。“领头燕”登陆资本市场,是消费者健康养生意识不断提高,滋补品成为营养补充主流的一个积极信号。 长期以来,中…...

C++使用策略模式,减少使用switch...case...
目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…...

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
WebAppDbTest 项目准备 项目准备1、.net cli 创建项目2、nuget 包引用和项目结构2.1、项目添加相关 nuget 包2.2、WebAppDbTest 项目结构 3、项目代码说明3.1、CSharp/C# 类文件说明3.2、json 配置文件说明 4、项目运行预览 数据库 .db 文件准备1、创建 SQLite 数据库1.1、在 W…...

2024 年,新程序员如何与AI共赢!!
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

Debian 系统镜像下载
最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载,在官网看一下 有个 11.8 的版本我无法下载,提示被最新的 debian-12.4.0 所代替,于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…...

数据结构和算法(全)
1.了解数据结构和算法 1.1 二分查找 二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半,然后比较目标值与中间元素的大小关系,从而确定应该在左半部分还是右半部分继续查找。这个…...

Vue项目中WebSocket封装
WEBSOCKET 封装引入初始化使用 封装 utils下建立WebSocketManager.js class WebSocketManager {constructor() {this.url null;this.websocket null;this.isConnected false;this.listeners {onopen: [],onmessage: [],onclose: [],onerror: [],};this.reconnectionOptio…...

018 OpenCV 人脸检测
目录 一、环境 二、分类器原理 2.1、概述 2.2、工作原理 三、人脸检测代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、分类器原理 CascadeClassifier是OpenCV(开源计算机视觉库)中的一个强大的类…...

Etcd实战(一)-部署etcd集群
1 概述 etcd是一个高可用的分布式键值存储系统,是CoreOS(现在隶属于Red Hat)公司开发的一个开源项目。它提供了一个简单的接口来存储和检索键值对数据,并使用Raft协议实现了分布式一致性。etcd广泛应用于Docker、Kubernetes等分布…...

Python绘制一个简单的圣诞树
在Python中,你可以使用基本的打印语句和循环来绘制一个简单的圣诞树。以下是一个例子: def draw_christmas_tree(height):for i in range(height):print( * (height - i - 1) +...

【CANoe】CANoe中使用RS232
文章目录 1、CANoe中自带示例2、示例讲解2.1CANoe自带Port A和Port B通讯2.2CANoe自带Port A和串口助手通讯 1、CANoe中自带示例 我使用的事CANoe12,RS232路径如下: C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 12.0.75\IO_HIL\RS23…...

Springboot内置Tomcat线程数优化
Springboot内置Tomcat线程数优化 # 等待队列长度,默认100。队列也做缓冲池用,但也不能无限长,不但消耗内存,而且出队入队也消耗CPU server.tomcat.accept-count1000 # 最大工作线程数,默认200。(4核8g内存…...

vue+django 开发环境跨域前后端联调配置
vue环境是127.0.0.1:8080,django环境是127.0.0.1:8000 要解决url相对路径和Axios跨域权限问题。 注意:程序发起了一个 POST 请求,但请求的 URL 没有以斜杠结尾。Django 默认设置是无法执行重定向到带斜杠 URL的。例如:url http:/…...

Apache+mod_jk模块代理Tomcat容器
一、背景介绍 最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法. 百度百科是这么描述AJP协议的: AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输…...

Nginx访问FTP服务器文件的时效性/安全校验
背景 FTP文件服务器在我们日常开发中经常使用,在项目中我们经常把FTP文件下载到内存中,然后转为base64给前端进行展示。如果excel中也需要导出图片,数据量大的情况下会直接返回一个后端的开放接口地址,然后在项目中对接口的参数进…...

【VSCode】自定义配置
VSCode自定义配置 Visual Studio Code (VSCode) 是一个强大的开源代码编辑器,支持丰富的自定义配置。下面是一些常见的自定义配置选项,你可以根据个人喜好和工作流程进行调整: 1. 主题和配色方案: 在 “settings.json” 中设置:…...

SpringBoot整合Kafka (一)
📑前言 本文主要讲了SpringBoot整合Kafka文章⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句:努力一点,优秀一点 目录 文章目录 &…...

随机分词与tokenizer(BPE->BBPE->Wordpiece->Unigram->sentencepiece->bytepiece)
0 tokenizer综述 根据不同的切分粒度可以把tokenizer分为: 基于词的切分,基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三种分词模型。其中WordPiece可以认为是一种特殊的BPE。完…...

成都工业学院Web技术基础(WEB)实验四:CSS3布局应用
写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考,前端变化比较大,按照要求,只能做到像,不能做到一模一样 3、图片和文字仅为示例,需要自行替换 4、如果代码不满足你的要求,请寻求其他的…...

TikTok科技趋势:平台如何引领数字社交革命?
TikTok作为一款颠覆性的短视频应用,不仅改变了用户的娱乐方式,更在数字社交领域引领了一场革命。本文将深入探讨TikTok在科技趋势方面的引领作用,分析其在数字社交革命中的关键角色,以及通过技术创新如何不断满足用户需求…...

【上海大学数字逻辑实验报告】六、时序电路
一、 实验目的 掌握同步二进制计数器和移位寄存器的原理。学会用分立元件构成2位同步二进制加计数器。学会在Quartus II上设计单向移位寄存器。学会在Quartus II上设计环形计数器。 二、 实验原理 同步计数器是指计数器中的各触发器的时钟脉冲输入端连接在一起,接…...

docker版zerotier-planet服务端搭建
1:ZeroTier 介绍2:为什么要自建PLANET 服务器3:开始安装 3.1:准备条件 3.1.1 安装git3.1.2 安装docker3.1.3 启动docker3.2:下载项目源码3.3:执行安装脚本3.4 下载 planet 文件3.5 新建网络 3.5.1 创建网络4.客户端配置 4.1 Windows 配置 4.2 加入网络4.2 Linux 客户端4.…...

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解
目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》ÿ…...

node.js和浏览器之间的区别
node.js是什么 Node.js是一种基于Chrome V8引擎的JavaScript运行环境,可以在服务器端运行JavaScript代码 Node.js 在浏览器之外运行 V8 JavaScript 引擎。 这使得 Node.js 非常高效。 浏览器如何运行js代码 nodejs运行环境 在浏览器中,大部分时间你所…...

【python并发任务的几种方式】
文章目录 1 Process:2 Thread:3 ThreadPoolExecutor:4 各种方式的优缺点:5 线程与进程的结束方式5.1 线程结束的几种方式5.2 进程的结束方式 6 应用场景效率对比 在Python中,有几种方法可以处理并行执行任务。其中,Process、Thread和ThreadPo…...