Jenkins部署与自动化构建
Jenkins笔记
文章目录
- Jenkins笔记
- @[toc]
- 一、安装Jenkins
- docker 安装 Jenkins
- Java启动war包直接安装
- 二、配置maven+Git自动构建jar包
- 三、自动化发布到测试服务器运行
- 超时机制
- 数据流重定向
- 编写清理Shell脚本
- 四、构建触发器
- 1. 生成API token
- 2. Jenkins项目配置触发器
- 3. 远程Git仓库配置WebHooks
- 4. 几种构建方式
- 5. 定期构建cron表达式
- 6. Poll SCM(轮询)
- 五、配置邮箱接收构建信息
- 1. 设置管理员邮箱(发件邮箱)
- 2. Jenkins邮件设置配置
- ==**3.邮件设置中的坑**==
文章目录
- Jenkins笔记
- @[toc]
- 一、安装Jenkins
- docker 安装 Jenkins
- Java启动war包直接安装
- 二、配置maven+Git自动构建jar包
- 三、自动化发布到测试服务器运行
- 超时机制
- 数据流重定向
- 编写清理Shell脚本
- 四、构建触发器
- 1. 生成API token
- 2. Jenkins项目配置触发器
- 3. 远程Git仓库配置WebHooks
- 4. 几种构建方式
- 5. 定期构建cron表达式
- 6. Poll SCM(轮询)
- 五、配置邮箱接收构建信息
- 1. 设置管理员邮箱(发件邮箱)
- 2. Jenkins邮件设置配置
- ==**3.邮件设置中的坑**==
一、安装Jenkins
docker 安装 Jenkins
-
拉取稳定版Jenkins镜像
注意:docker拉取镜像的时候要拉取 jenkins/jenkins 而不是jenkins 要装稳定版,否则后面会有很多插件装不上docker pull jenkins/jenkins:lts -
挂载对应的容器卷
#给需要挂载的文件夹授权 mkdir jenkins_home chmod 777 /docker/jenkins_home/#启动容器 docker run -d -p 8090:8080 -p 8091:50000 --privileged=true --name jenkins_8090 -v /docker/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime 55860ee0cd73-d 后台运行镜像 -p 8090:8080 将镜像的8080端口映射到服务器的8090端口。 -p 8091:50000 将镜像的50000端口映射到服务器的8091端口 -v /data/jenkins_home:/var/jenkins_home /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /data/jenkins_home目录 -v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。 –name jenkins_8090 给容器起一个别名 http://mirror.esuni.jp/jenkins/updates/update-center.json -
修改插件下载镜像源为清华镜像(可以先直接尝试一下是否可以安装成功)
# 修改xml vim jenkins_home/hudson.model.UpdateCenter.xml #将 <url>https://updates.jenkins.io/update-center.json</url>替换为 <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url> http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json# 修改jenkins/updetes/default.json文件 ①把:“http://www.google.com/” 改成 “http://www.baidu.com/” ②把:“https://updates.jenkins.io/download” 全部替换成 “http://mirrors.tuna.tsinghua.edu.cn/jenkins”sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json sed -i 's#https://www.google.com#https://www.baidu.com#g' default.jsonsed -i 's#https://updates.jenkins.io/download#https://mirrors.huaweicloud.com/jenkins#g' default.json && sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json http://ip:9090/pluginManager/advanced https://cdn.jsdelivr.net/gh/jenkins-zh/update-center-mirror/tsinghua/current/update-center.json# 重启服务docker stop jenkins_8090docker start jenkins_8090 -
访问web页面 http://IP:8090/

-
去查看第一次登录的密码
#查看输出日志 docker logs jenkins_8090#在日志中会有一段密码 Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation:800c8b5201284979a1ea16c1893358d5This may also be found at: /var/jenkins_home/secrets/initialAdminPassword#或者也可以去它上面给的地址中查看密码 将密码填入上面的文本框中 -
等待一会后,开始安装插件
我这里选择的是按照推荐安装

-
后续需要通过maven来构建我们的项目,所以需要在容器内安装mavne
# 将maven下载好后解压 unzip /mavne/apache-maven-3.8.6 -d ./# 修改maven的镜像源 vim /mavne/apache-maven-3.8.6/conf/setting.xml#将里面的镜像换为阿里云镜像 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>#增加软连接 (不需要进入到原来的路径也可以验证Maven安装) ln -s /maven/apache-maven-3.8.6/bin/mvn /usr/local/bin/mvn#验证是安装成功 mvn -v
Java启动war包直接安装
-
下载适合的war包 https://mirrors.jenkins.io/war-stable/
我这里用的jdk1.8 所以下载的版本为jenkins 2.346.1
-
利用java命令启动
touch temp.txt # 这种方式会在后台运行 不会被关闭 nohup java -jar jenkins.war --httpPort=8090 >temp.txt & -
访问 ip:8090 后续操作同上4⃣️
二、配置maven+Git自动构建jar包
-
安装maven插件

安装好后进入新增item,出现小猫头鹰即安装成功

-
创建一个任务

-
选择Git ,此时下面会提示git连接错误

可以配置下凭证

-
安装git
yum install -y git # 安装完毕后验证一下 git --verison -
设置需要构建的分支

-
配置maven路径

配置安装的maven路径

-
设置需要构建的pom文件路径

-
保存后开始构建

可以在构建中看到控制台输出(
记得将maven的镜像地址换成阿里云地址)
三、自动化发布到测试服务器运行
-
安装服务器连接插件 Publish Over SSH

-
进入配置后管理界面


选择这个选项

-
配置测试服务器连接
因为我们需要增加一台远程服务器,所以我们需要做一些配置信息


-
添加一台远程服务器

-
此时在原先的地方就有了我们刚添加的服务器

配置相关数据
- 构建前Pre Steps

构建后Post Steps

超时机制
-
启动脚本问题会导致超时,从而导致启动不成功
可以设置超时时间为0 这样就可以不会因为超时而不成功
nohup java -jar /jenkins/build_jar/first1/*.jar &
# 这条语句会超时,原因是因为没有指明日志输出到哪里,控制台会一直等待#修改为如下
nohup java -jar /jenkins/build_jar/first1/*.jar >/jenkins/build_jar/first1/mylog.log 2>&1 &# 也可以简化为
nohup java -jar /jenkins/build_jar/first1/*.jar &>/jenkins/build_jar/first1/mylog.log &
数据流重定向
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方
# 标准输入:代码为0,使用<或者<<
# 标准输出:代码为1,使用>或者>>
# 标准错误输出:代码为2,使用2>或者2>>
# 若以>输出到一个已存在的文件中,那么这个文件会被覆盖
# > 覆盖写
# >> 追加写
编写清理Shell脚本
jps|grep -v Jps|awk '{print $1}'#将 xxxx写入xxx.txt
echo "xxxx">xxx.txt#!/bin/bash#获取程序运行的pid
ps -ef|grep jenkins_demo #会获取到两条记录 有一条是grep的数据#利用grep -v 再次过滤 grep -v 需要过滤掉的信息
ps -ef|grep jenkins_demo|grep -v grep#利用grep '需要的信息' 进行过滤
ps -ef|grep jenkins_demo|grep 'SNAPSHOT'#获取打印出来的信息的第二列数据PID
`ps -ef|grep jenkins_demo|grep 'SNAPSHOT'|awk '{printf $2}'`
部署前shell操作(删除原来的包,同时关闭上一次运行的pid)
#!/bin/bash
#删除原来的包
rm -rf /jenkins/build_jar/first1#传入一个参数
appname=$1
if [ -z $appname ]
thenappname='jenkins_demo'
fi
echo $appname#获取pid
pid=`ps -ef | grep $appname | grep 'java -jar' | awk '{printf $2}'`echo $pid#如果pid为空的话,提示一下,否则执行kill命令
if [ -z $pid ]
#使用-z来判断是否是空值
thenecho "$appname not started"
elsekill -9 $pidecho "$appname stoping..."
fi#再次精准匹配 查看是否已经kill完 -w是精准匹配
check=`ps -ef|grep -w $pid |grep java`
if [ -z $check ]
thenecho "$appname pid:$pid is stop"
elseecho "$appname stop Failed"
fi
-
配置构建前执行shell脚本

-
此时构建的话,Jenkins会自动帮我们删除以前的版本数据,同时kill掉以前运行的pid

四、构建触发器
触发器可以通过一些事件触发Jenkins的自动构建,如:上传代码,合并代码等。
1. 生成API token
-
1.1 进入jenkins安全设置,开启安全域及授权策略

配置开启

-
1.2 生成api token

2. Jenkins项目配置触发器
-
2.1 选择测试项目-配置-构建触发器,选择触发远程构建,将token粘贴在身份验证令牌处,保存

-
2.2 通过访问 JENKINS_URL
/job/first/build?token=TOKEN_NAME 观察项目是否进入构建队列
3. 远程Git仓库配置WebHooks
(GitLab GitHub)同理
-
3.1在Jenkins中安装Gitee插件(同上)
-
3.2在项目设置中配置Gitee令牌地址等


-
3.3增加webHooks管理

-
3.4添加post地址和token
这里的地址直接用上面Jenkins的链接,token则是刚才生成的密码
-
3.5尝试重新上传代码,可以发现现在会自动触发构建

4. 几种构建方式

1、快照依赖构建/Build whenever a SNAPSHOT dependency is built
- 当依赖的快照被构建时执行本job
2、触发远程构建 (例如,使用脚本)
- 远程调用本job的restapi时执行本job
3、job依赖构建/Build after other projects are built
- 当依赖的job被构建时执行本job
4、定时构建/Build periodically
- 使用cron表达式定时构建本job
5、向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling
- Github-WebHook出发时构建本job
6、定期检查代码变更/Poll SCM
- 使用cron表达式定时检查代码变更,变更后构建本job
5. 定期构建cron表达式
在构建中Build periodically与Poll SCM接收的参数都是cron表达式
与标准的cron表达式不同,没有秒字段
cron表达式网站
第一个 * 表示每个小时的第几分钟,取值0~590 */1 * * *
H:每小时0分执行一次第二颗 * 表示小时,取值0~23* 15 * * * 表示每天下午3点
* 1 * * * 表示每天凌晨1点第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * * 表示每月5日凌晨1点第四颗 * 表示第几月,取值1~12
* 15 5 1 * 表示每年一月5日15时的每一分钟执行第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日
H (hash散列)
-
hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间。
-
意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * * ,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行,减轻同一时间拉起的Job太多。
-
H的值也可以设置范围
-
H * * * *表示一小时内的任意时间*/10 * * * *每10分钟H/10 * * * *每10分钟,可能是7,17,27,起始时间定hash,后续不会变45 3 * * 1-6 每个周一至周六,凌晨3点45 执行1次45 3-5 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上45 3-5/2 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次45 0-6/2 * * * 0点开始,6点结束,每间隔2小时执行一次 0:45、2:45、4:45、6:45 -
如图 配置后会每天凌晨两点的某一分钟为我们构建
H 2 * * *
6. Poll SCM(轮询)
这个是由Jenkins服务发起对远程git仓库的访问,比较配置的分支上是否有新的内容,如果有则会发起一次构建,轮询频率控制是通过cron表达式控制。

五、配置邮箱接收构建信息
1. 设置管理员邮箱(发件邮箱)
-
1.1 登录163邮箱,进入邮箱协议设置

-
1.2 获取授权密码(ZSJRNM*********)

2. Jenkins邮件设置配置
-
在管理界面Configure System中

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2Cr5m0K-1680142247362)(/Users/lvhao/zixuexi/git学习/practice-and-learning/笔记/云原生/图片/邮件配置2.png)]](https://img-blog.csdnimg.cn/e987e0179b2f41ef932fec584519f72e.png)


此时可以点击下面的发送邮件测试是否能成功发送

-
在项目管理里配置构建后邮件通知

-
重新构建项目,可以看到已经有短信通知了
3.邮件设置中的坑
-
点击发送测试信息的时候,提示
**AuthenticationFailedException: 550 User has no permission**错误那就是授权出现了错误,此时就需要重新获取授权码再授权一次,但记得邮箱设置页面中已获得授权的设备一定要记得删除,防止自己的邮箱账号被盗
-
点击发送测试信息的时候,提示
MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout 60000;这个话是因为可能你使用的是Linux服务器,防火墙25端口没有开,有两种解决办法
1.开启防火墙25端口
注意:如果你和我一样使用的为阿里云服务器的话,阿里云为了安全考虑默认是关闭25端口的,如果你想要开启的话需要提交申请审批,大概需要3-5天2.使用SSL协议号
-
下面配上网易163邮箱的相关服务器信息:

我这里使用的是465端口,同时启用SSL协议
-
-
点击发送测试信息的时候,提示
MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF],则查看使用的端口是否需要使用SSL协议
-
用来发送的邮箱要和管理员设置的邮箱一致

这样就可以开开心心的发邮件啦!以上这些坑不幸的我都踩到了😭

相关文章:
Jenkins部署与自动化构建
Jenkins笔记 文章目录Jenkins笔记[toc]一、安装Jenkinsdocker 安装 JenkinsJava启动war包直接安装二、配置mavenGit自动构建jar包三、自动化发布到测试服务器运行超时机制数据流重定向编写清理Shell脚本四、构建触发器1. 生成API token2. Jenkins项目配置触发器3. 远程Git仓库配…...
网络编程三要素
网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip:设备在网络中的地址,是唯一的标识 端口号:应用程序在设备中的唯一标识 协议:数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip:IPv4和…...
如何编写一个自己的web前端脚手架
脚手架简介 脚手架是创建前端项目的命令行工具,集成了常用的功能和配置,方便我们快速搭建项目,目前网络上也有很多可供选择的脚手架。 一个"简单脚手架"的构成其实非常少,即 代码模板 命令行工具。其中代码模板是脚手…...
计算机网络第1章(概述)
文章目录1.1、计算机网络在信息时代的作用1.2、因特网概述1、网络、互连网(互联网)和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成1.3 三种交换方式1、电路交换(Circuit Switching)2、分组交换(…...
grid布局
一、概述 CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行。通过将 CSS 规则应用于 父元素 (成为 Grid Container 网格容器)和其 子元素(成为 Gri…...
博客平台打造出色的个人资料管理与展示:实用技巧与代码示例
个人资料管理与展示是博客平台的重要功能之一。本文将通过设计思路、技术实现和代码示例,详细讲解如何构建出色的个人资料管理与展示功能。结合CodeInsight平台的实践案例,帮助您深入了解个人资料管理与展示的设计原则和技术实现。 一、设计思路 在设计…...
【genius_platform软件平台开发】第九十三讲:串口通信(485通信)
485通信1. 485通信1.1 termios结构1.2 头文件1.3 函数讲解1.3.1 tcgetattr1.3.2 tcsetattr1.4 示例工程1.5 参考文献1.5.1 stty命令1.5.2 命令格式1.5.2 microcom命令1.5.2.1介绍1.5.2.2指令1.5.3 echo命令1.5.3.1 语法1.5.3.2 选项列表1.5.3.3 使用示例1.5.3.4 e cho > 输出…...
JavaScript动画相关讲解
JavaScript是一种非常流行的脚本语言,广泛应用于Web开发、游戏开发、移动应用开发等领域。在Web开发中,动画效果是非常重要的一部分,可以提高网站的用户体验和吸引力。JavaScript提供了一些基本的动画函数,但是这些函数往往不能满…...
InnoSetup制作安装包(EXE)
功能描述 1.666666.war为项目war包,666666.bat为启动war包脚本,通过InnoSetup将它们打包到安装包666666.exe 2.666666.exe安装包安装过程中将666666.bat注册为自启动服务,安装结束自动执行脚本启动项目666666.war --------------------------…...
CASE WHEN函数语句多条件下使用详解
目录 CASE 的两种格式: 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句,实现简单CASE函数和CASE搜索函数两种格式。同时配合 SUM以及COUNT方法的使用 CASE 的两种格式: 简…...
2.31、守护进程(2)
2.31、守护进程(2)1.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤 执行一个 fork(),之后父进程退出,子进程继续执…...
记录上传文件异常 /tmp/tomcat... (No space left on device)
一,问题描述 用postman调用上传接口,基本每两次调用会有一次报错,如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…...
无向连通图中长度为 n 的循环
给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …...
打造出ChatGPT的,是怎样一群人?
震惊世界的ChatGPT,要多少人才能开发出来?几百,还是几千? 答案是:87个人。 老实说,刚看到这个数字真是惊到我了,印象里,之前看媒体报道各大巨头人工智能人才储备时,动辄…...
数据结构——栈与队列相关题目
数据结构——栈与队列相关题目232. 用栈实现队列思路225. 用队列实现栈1.两个队列实现栈2.一个队列实现栈20. 有效的括号思路1047. 删除字符串中的所有相邻重复项思路155. 最小栈150. 逆波兰表达式求值思路239. 滑动窗口最大值单调队列347. 前 K 个高频元素思路232. 用栈实现队…...
Redhat6.7离线安装rabbitmq
一、下载资源文件(.rpm文件) 链接: https://pan.baidu.com/s/1j2Ze_Jjm0oMrP-r95PPCtA?pwdv3is 提取码: v3is 复制这段内容后打开百度网盘手机App,操作更方便哦 创建rabbit文件夹Mkdir rabbit 三、通过ftp上传文件 四、安装erlang环境 …...
EasyCVR平台基于GB28181协议的语音对讲配置操作教程
EasyCVR基于云边端协同,具有强大的数据接入、处理及分发能力,平台可支持海量视频的轻量化接入与汇聚管理,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…...
谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
文 | 智商掉了一地你有没有想过,让一台计算机诊断和修复自己生成的错误代码?一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术,通过在生成的代码中添加自解释的信息,让计算机像一个可以自己修复代码的程序员一样调试自己的…...
行为型模式-模板方法
行为型模式-模板方法 模板方法(Template Method)解决算法框架问题描述适用环境优点:缺点:违反原则:代码实现模板方法(Template Method) 解决算法框架问题 描述 定义了一个算法的骨架,并将某些步骤延迟到子类中进行实现,从而使得算法的具体实现能够在子类中自由变化…...
正则表达式识别日期
正则表达式识别日期 正则表达式识别各种格式的日期 import redef extract_dates(text):# 正则表达式,用于识别常见的日期格式date_pattern r"""(?P<date>(?P<year_only>\d{4}(?![\d年]))| # …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
