Linux中部署Java jar 包 shell 脚本

Linux中部署Java jar 包 shell 脚本

#!/bin/bash
set -e# 基础
# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181
# export PATH=PATH=$PATH:$JAVA_HOME/bin
# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE=$(date +%Y%m%d%H%M)
# 基础路径
BASE_PATH=/data/product/java/smart_factory
# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
SOURCE_PATH=$BASE_PATH/jar
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=smart_factory
# 环境
PROFILES_ACTIVE=test
# 健康检查 URL
HEALTH_CHECK_URL=http://127.0.0.1:8989/actuator/health/# heapError 存放路径
HEAP_ERROR_PATH=$BASE_PATH/heapError
# JVM 参数
JAVA_OPS="-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪
JAVA_AGENT=# 备份
function backup() {# 如果不存在,则无需备份if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"# 如果存在,则备份到 backup 目录下,使用时间作为后缀elseecho "[backup] 开始备份 $SERVER_NAME ..."cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jarecho "[backup] 备份 $SERVER_NAME 完成"fi
}# 最新构建代码 移动到项目环境
function transfer() {echo "[transfer] 开始转移 $SERVER_NAME.jar"# 删除原 jar 包if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"elseecho "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"rm $BASE_PATH/$SERVER_NAME.jarfi# 复制新 jar 包echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHecho "[transfer] 转移 $SERVER_NAME.jar 完成"
}# 停止
function stop() {echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')# 如果 Java 服务启动中,则进行关闭if [ -n "$PID" ]; then# 正常关闭echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"kill -15 $PID# 等待最大 60 秒,直到关闭完成。for ((i = 0; i < 60; i++))dosleep 1PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; thenecho -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'breakfidone# 如果正常关闭失败,那么进行强制 kill -9 进行关闭if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服务未启动,则无需关闭elseecho "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"fi
}# 启动
function start() {# 开启启动前,打印启动参数echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"echo "[start] JAVA_OPS: $JAVA_OPS"echo "[start] JAVA_AGENT: $JAVA_AGENT"echo "[start] PROFILES: $PROFILES_ACTIVE"# 开始启动BUILD_ID=dontKillMe nohup /data/soft/jdk-17.0.10/bin/java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
}
# 健康检查
function healthCheck() {# 如果配置健康检查,则进行健康检查if [ -n "$HEALTH_CHECK_URL" ]; then# 健康检查最大 60 秒,直到健康检查通过echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";for ((i = 0; i < 60; i++))do# 请求健康检查地址,只获取状态码。result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`# 如果状态码为 200,则说明健康检查通过if [ "$result" == "200" ]; thenecho "[healthCheck] 健康检查通过";break# 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试elseecho -e ".\c"sleep 1fidone# 健康检查未通过,则异常退出 shell 脚本,不继续部署。if [ ! "$result" == "200" ]; thenecho "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";tail -n 10 nohup.outexit 1;# 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。elseecho "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";sleep 60echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";tail -n 50 nohup.outfi
}# 部署
function deploy() {cd $BASE_PATH# 备份原 jarbackup# 停止 Java 服务stop# 部署新 jartransfer# 启动 Java 服务start# 健康检查healthCheck
}deploy

脚本语法


#注意事项
#Linux 命令大全 https://www.runoob.com/linux/linux-command-manual.html
#1.在linux中,&和&&,|和||介绍如下:
#	&  表示任务在后台执行,如要在后台运行redis-server,则有  redis-server &
#	&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'    
#	|  表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
#	|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
#
#2.shell一次性执行多条命令
#	2.1.每个命令之间用;隔开   说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
#	2.2.每个命令之间用&&隔开    说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
#	2.3.每个命令之间用||隔开    说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
#
#3.linux shell 中判断文件、目录是否存在的方法  https://www.jb51.net/article/186273.htm
#	判断运算 https://www.runoob.com/linux/linux-shell-basic-operators.html
#	多个条件判断  if [ $1 ] || [ $2 ] ;if [ $1 ] && [ $2 ] 
#	多个条件判断  if [ -n "$1" -o -n "$2" ]  -o表示or ; if [ -n "$1" -a -n "$2" ] -a表示and  参数必须加”“
#	Shell 基础 -- 总结几种括号、引号的用法 https://www.cnblogs.com/tongye/p/10646211.html
#
#4.Shell中的$0、$1、$2、$(命令)的含义
#	 $$ Shell本身的PID(ProcessID)
#	 $! Shell最后运行的后台Process的PID
#	 $? 最后运行的命令的结束代码(返回值)比如shell运行一个命令,然后你在敲入$?, 就会打印上个命令的执行结果,就是上个命令的返回结果)
#	 $- 使用Set命令设定的Flag一览
#	 $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
#	 $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
#	 $# 添加到Shell的参数个数
#	 $0 就是你写的shell脚本本身的名字,
#	 $1 是你给你写的shell脚本传的第一个参数,
#	 $2 是你给你写的shell脚本传的第二个参数
#    $(命令) 是执行括号内的命令 例如$(pwd)  返回当前目录
#	 示例:
#		#!/bin/sh
#		echo "shell脚本本身的名字: $0"
#		echo "传给shell的第一个参数: $1"
#		echo "传给shell的第二个参数: $2"
#	保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2
#	结果为:
#		shell脚本本身的名字: Test.sh
#		传给shell的第一个参数: 1
#		传给shell的第二个参数:  2
#
#5.执行cp或mv时,总是会提示overwrite,如何不提示呢?
#	在命令行输入alias或者打开~/.bashrc文件看linux中的别名
#	默认cp执行的是cp -i,所以每次用cp的时候都会显示cp: overwrite `..,  解决 可以在使用\cp sourcefile destfile  即命令前加\
#	同理 mv rm 等
#
#6.shell脚本中cd命令无效的解决方法 source xxx.sh或者. ./xxx.sh     注意前面. ./xxx.sh .和.中间有个空格!
#	fork	例 ./xxx.sh			新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。
#	exec	例 exec xxx.sh		在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了
#	source	例 source xxx.sh	在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行。
#	source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行
#
#7.shell脚本日志输出https://www.runoob.com/linux/linux-shell-io-redirections.html
#	command < file	将输入重定向到 file。
#	command > file	将输出重定向到 file。
#	command >> file	将输出以追加的方式重定向到 file。
#	/dev/null    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 例 command > /dev/null
#		如果希望屏蔽 stdout 和 stderr,可以这样写: command > /dev/null 2>&1
#	关于2>&1的含义:将标准错误输出重定向到标准输出;符号>&是一个整体,不可分开,分开后就不是上述含义了;写成2&>1也是不可以的
#	为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?   
#		不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
#		本来1----->屏幕 (1指向屏幕)
#		执行>log后, 1----->log (1指向log)
#		执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
#
#8.linux命令tee:将信息同时输出到屏幕和文件 例 | tee -a ./xxx.log 2>&1    或   例 | tee -a xxx.log 2>&1         
#	-a 是为了追加日志追加输出,避免日志被覆盖
#
#9.shell 也可以包含外部脚本 https://www.runoob.com/linux/linux-shell-include-file.html  注:被包含的文件 test1.sh 不需要可执行权限。
#
#10.给多个脚本赋权限 chmod a+x liqiang-2.sh liqiang-3.sh liqiang-4.sh    或者chmod a+x *.sh  或 chmod +x xxx.sh 或 chmod u+x xxx.sh 
#	u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
#	+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
#	r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
#11.-bash: ./xxx.sh: /bin/sh^M: bad interpreter: No such file or directory  编码方式是windows编辑的,必须转化格式为unix格式    
#   操作  vim xxx.sh 按ESC键,再次执行下面命令(冒号是命令) :set ff=unix  再  :x
#
#12.外部执行shell脚本 第一步 source ./xxx.sh		例  source ./xxx.sh
#					  第二步 方法名 参数1 参数2 	例	pull username  password
#13.外部执行shell脚本同时将日志信息输出到屏幕和文件 
#	方法名 参数1 参数2 | tee -a ./xxx.log 2>&1
#	例	pull username  password | tee -a ./pullcode.log 2>&1 
#14.外部执行shell脚本的函数并同时将日志信息输出到屏幕和文件 
#	source xxx.sh && 方法 | tee -a ./xxx.log 2>&1
#	例	source xxx.sh && pull | tee -a ./pull.log 2>&1
#15.echo -e 参数
#	-e  若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
#   	\a   发出警告声;
#   	\b  删除前一个字符;
#   	\c  最后不加上换行符号;
#   	\f  换行但光标仍旧停留在原来的位置;
#   	\n  换行且光标移至行首;
#   	\r  光标移至行首,但不换行;
#   	\t  插入tab;
#   	\v  与\f相同;
#   	\\  插入\字符;
#   	\nnn 插入nnn(八进制)所代表的ASCII字符;
#	在echo -e 后,对“\c” 的解释是:produce no further output  不产生进一步的输出   ----》自己理解是在\c 后,这一行后面的内容都不会输出
#	例	echo -e ".\c"   只输出"."
#
#16.shell获取当前工作目录绝对路径,最简单$(pwd)
#    不行尝试 $(cd "$(dirname "$0")";pwd)
#
#17.如何在vi和vim上查找字符串
#    17.1 命令模式下,/要搜索的字符串或者字符   例如 输入/echo
#    17.2 按下回车之后,可以看到vim已经把光标移动到该字符处和高亮了匹配的字符串(vi没高亮,因为它没有颜色)
#    17.3 查看下一个匹配呢?按下n(小写n),一直按n到最后,红色的字提示BOTTOM(已经到底了,尽头了),说明匹配的字符串已经到此处是最后一个。再按n会回到TOP(第一个匹配成功的字符串)
#    17.4 如何跳转到上一个匹配呢?按下N(大写N)。你可以按下Caps Lock键切换大小写,也可以在小写状态按下Shift + n
#    17.5 如果想从文件的结尾往开始处搜索呢 命令模式下,?要搜索的字符串或者字符  例如 输入?echo
#18 退出vi/vim
#    :w            - 保存文件,不退出 vim
#    :w file  -将修改另外保存到 file 中,不退出 vim
#    :w!          -强制保存,不退出 vim
#    :wq          -保存文件,退出 vim
#    :wq!        -强制保存文件,退出 vim
#    :q            -不保存文件,退出 vim
#    :q!          -不保存文件,强制退出 vim
#    :e!          -放弃所有修改,从上次保存文件开始再编辑
#
#
#19 linux 清空文件内容命令
#    1. > test.log
#    2. cat /dev/null  test.log
#    3. echo "" >test.log
#
#20.查看java进程pid
#	jps -l
#21.根据pid查询java进程的启动时间
#	axo:选项
#	pid:进程id
#	comm:命令
#	pmen: 进程占用的内存
#	lstart: 进程启动时间
#	grep: 文本搜索
#	ps axo pid,ppid,comm,pmem,lstart | grep pid
#	例:39230     1 java             4.0 Sat Mar 12 13:28:50 2022
#22 cat 追加内容用 >>,覆盖内容用 >
#	1.cat创建文件
#	格式:cat > 文件名 <<结束标记
#	或者直接用:cat >文件名
#	cat如果找不到文件,则直接创建文件,创建了文件,输入内容最后Ctrl + C退出。
#	例1   cat > 1.txt 回车 输入内容  最后Ctrl + C退出
#	例2 以D作为结束标记 输入内容 最后以D结束输入
#		cat > 1.txt <<D
#		123
#		D
#	2.cat文件追加
#	格式:cat >> 文件名 <<结束标记
#	例1   cat >> 1.txt 回车 输入内容  最后Ctrl + C退出
#	例2 以D作为结束标记 输入内容 最后以D结束输入
#		cat >> 1.txt <<D
#		123
#		D
#	3.cat文件清空
#	清空文件内容,可以直接输入结束标记,这样便向文件中写入0字符,文件即被清空了。
#	例1 直接输入结束标记,向文件中写入0字符
#		cat > 1.txt <<D
#		D
#	4.以EOF作为结束标记
#	cat <<EOF和cat <<-EOF两个都是获取stdin,并在EOF处结束stdin,输出stdout。
#	<<和<<-的区别
#	<<:结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入
#	<<-:最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束
#	# 往文件1.txt写入追加内容 123
#		cat >> 1.txt <<EOF
#		123
#		EOF
#	# 往文件1.txt写入覆盖内容 123
#		cat >> 1.txt <<EOF
#		123
#		EOF
#23.less 
#less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。
#	-b <缓冲区大小> 设置缓冲区的大小
#	-e 当文件显示结束后,自动离开
#	-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
#	-g 只标志最后搜索的关键词
#	-i 忽略搜索时的大小写
#	-m 显示类似more命令的百分比
#	-N 显示每行的行号
#	-o <文件名> 将less 输出的内容在指定文件中保存起来
#	-Q 不使用警告音
#	-s 显示连续空行为一行
#	-S 行过长时间将超出部分舍弃
#	-x <数字> 将"tab"键显示为规定的数字空格
#	/字符串:向下搜索"字符串"的功能
#	?字符串:向上搜索"字符串"的功能
#	n:重复前一个搜索(与 / 或 ? 有关)
#	N:反向重复前一个搜索(与 / 或 ? 有关)
#	b 向上翻一页
#	d 向后翻半页
#	h 显示帮助界面
#	Q 退出less 命令
#	u 向前滚动半页
#	y 向前滚动一行
#	空格键 滚动一页
#	回车键 滚动一行
#	[pagedown]: 向下翻动一页
#	[pageup]: 向上翻动一页
#操作示例如下
#	less log.log
#	shift + g 命令到文件尾部 
#	然后输入?加上(不要加空格)你要搜索的关键字,例如  ?1213
#	然后输入/加上(不要加空格)你要搜索的关键字,例如  /1213
#	n:发现下一个搜索(与/或?有关)
#	N:发现上一个搜索(与/或?有关)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…

类似微信的以文搜图功能实现

通过PaddleOCR识别图片中的文字&#xff0c;将识别结果报存到es中&#xff0c;利用es查询语句返回结果图片。 技术逻辑 PaddleOCR部署、es部署创建mapping将PaddleOCR识别结果保存至es通过查询&#xff0c;返回结果 前期准备 PaddleOCR、es部署请参考https://blog.csdn.net…

stm32之基本定时器的使用

在上文我们使用到了HAL库的自带的延时函数&#xff0c;HAL_Delay&#xff08;&#xff09;&#xff1b;我们来看一下函数的原型 __weak void HAL_Delay(uint32_t Delay) {uint32_t tickstart HAL_GetTick();uint32_t wait Delay;/* Add a freq to guarantee minimum wait */…

iOS object-c self关键字总结

在Objective-C中&#xff0c;self 关键字是一个指向当前对象的指针。它是对象自身实例的别名&#xff0c;通常在对象内部的方法中使用&#xff0c;以提供一个指向当前对象的引用。使用 self 可以帮助你访问对象的属性和方法&#xff0c;特别是在处理消息传递和方法调用时。 以…

【SQL】1587. 银行账户概要 II

题目描述 leetcode题目&#xff1a;1587. 银行账户概要 II Code 写法一 select name, sum(amount) as balance from Users U left join Transactions T on U.account T.account group by U.account having sum(amount) > 10000写法二 select Users.name, balance from…

前端大额计算,真正解决js精度丢失问题

1.解决前端大额计算导致精度丢失问题 2.从底层上解决这个问题&#xff0c;计算时不使用js 运行时计算。 使用rust语言来解决这个问题&#xff0c;因为是底层语言&#xff0c;不涉及到精度问题。 3.实现步骤 步骤 1: 安装工具 确保你已经安装了Rust工具链和wasm-pack&#x…

Unity自定义icon

Unity自定义icon 1. 新建文件夹 OfficeFabricIconSet2. 新建Iconset3. 新建子文件夹Textures并添加icon图片4. 向iconset添加Quad Icons5. 最终效果 教程来源处&#xff1a; https://365xr.blog/build-your-own-button-icon-set-for-microsoft-hololens-2-apps-with-mrtk-using…

Java RESTful API开发:搭建基于Spring Boot的轻量级API服务

引言&#xff1a; 在当今互联网时代&#xff0c;API&#xff08;Application Programming Interface&#xff09;已经成为了各种软件系统之间交互的重要方式。而REST&#xff08;Representational State Transfer&#xff09;则是一种设计风格&#xff0c;用于构建分布式系统中…

前视声呐目标识别定位(三)-部署至机器人

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 开发了多波束前视声呐目标识别定位模块后&#xff0c;自然期待能将声呐部署至AUV&#xff0c;实现AUV对目标的抵近观测。原本规划着定位模块不…

C++算法——二分法查找

一、二分查找算法思想和模版 1.算法思想 2.细节处理 3.模板 二、二分查找 1.链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 先从最经典的题目去切入&#xff0c;思路就是二分查找&#xff0c;这里我们认为&#xff0c;目标值既可以看作为左部…

ES6参数默认值

1.参数是按顺序传递的&#xff0c;参数的默认值可以赋给任意位置的参数&#xff0c;给参数传undefined&#xff0c;参数才会使用默认值&#xff0c;例子如下&#xff1a; function foo(a, b 2, c 3) {console.log(a, b, c); } foo() //undefined 2 3 foo(1, null, undefined…

XSS 与 CSRF 攻击——有什么区别,如何加以防护

跨站脚本(XSS)和跨站请求伪造(CSRF)&#xff0c;它们将恶意脚本注入目标系统&#xff0c;以进一步利用技术栈或窃取用户数据。 什么是 XSS 和 CSRF? CSRF和XSS都是客户端攻击&#xff0c;它们滥用同源策略&#xff0c;利用web应用程序和受害用户之间的信任关系。XSS和跨站脚…

WPS二次开发系列:以自动播放模式打开PPT文档

在前面文章中 WPS SDK打开文档并实现保存回传 介绍了如何使用WPS SDK打开文档&#xff0c;那么我们是否能够实现在打开WPS 文档的时候能够传递一些参数来控制打开文档的行为呢&#xff0c;经过研究WPS SDK相关文档和API&#xff0c;最终实现了 以自动播放方式打开PPT文档功能。…

【RAG】内部外挂知识库搭建-本地GPT

大半年的项目告一段落了&#xff0c;现在自己找找感兴趣的东西学习下&#xff0c;看看可不可以搞出个效果不错的local GPT&#xff0c;自研下大模型吧 RAG是什么&#xff1f; 检索增强生成(RAG)是指对大型语言模型输出进行优化&#xff0c;使其能够在生成响应之前引用训练数据来…

Springboot集成token认证

一、引出session问题以及token、鉴权 session都是保存在内存中&#xff0c;认证用户增多&#xff0c;服务端开销明显增大。若是认证的记录保存在某台服务器内存中时&#xff0c;意味着用户的下次请求只能够在该服务器内存中进行认证。CSRF跨站攻击 token的鉴权机制&#xff1…

mysql--sql常用语句

通过profile命令来查看当前最主要的耗费时间的步骤。 mysql> select count(1) from t1; ---------- | count(1) | ---------- | 1 | ---------- 1 row in set (0.11 sec)mysql> show profiles; ----------------------------------------------- | Query_ID | Du…

Spring Cloud微服务入门(二)

微服务的技术栈 服务治理&#xff1a; 服务注册、发现、调用。 负载均衡&#xff1a; 高可用、集群部署。 容错&#xff1a; 避免雪崩、削峰、服务降级。 消息总线&#xff1a; 消息队列、异步通信&#xff0c;数据一致性。 网关&#xff1a; 校验路径、请求转发、服务集成…

Git 常用命令集

Git 常用命令集 符号说明&#xff1a; 尖括号&#xff08;< >&#xff09;表示需要替换成尖括号内文字描述的内容 方括号&#xff08;[ ]&#xff09;表示可选项 远程库名&#xff0c;形如 git.com 路径名&#xff0c;形如 D:\YouthGit\GitTest 或者 GitTest 1.初始化操…

【Web】2024红明谷CTF初赛个人wp(2/4)

目录 ezphp playground 时间原因只打了2个小时&#xff0c;出了2道&#xff0c;简单记录一下 ezphp 参考文章 PHP filter chains: file read from error-based oracle https://github.com/synacktiv/php_filter_chains_oracle_exploit 用上面的脚本爆出部分源码&#xff…

SSM项目转Springboot项目

SSM项目转Springboot项目 由于几年前写的一个ssm项目想转成springboot项目&#xff0c;所以今天倒腾了一下。 最近有人需要毕业设计转换一下&#xff0c;所以我有时间的话可以有偿帮忙转换&#xff0c;需要的私信我或&#xff0b;v&#xff1a;Arousala_ 首先创建一个新的spr…