DevOps工程技术价值流:Jenkins驱动的持续集成与交付实践
一、Jenkins系统概述
Jenkins:开源CI/CD引擎的佼佼者
Jenkins,作为一款基于Java的开源持续集成(CI)与持续交付(CD)系统,凭借其强大的插件生态系统,成为DevOps实践中不可或缺的核心引擎。这些插件覆盖了从构建、部署到自动化的全方位需求,使得Jenkins能够灵活适应从小型团队到大型企业级的各类项目。特别是Pipeline插件,为项目流水线的建立提供了无限可能,无论项目使用何种语言或源代码仓库,Jenkins都能轻松实现自动化构建、测试和部署。
二、Jenkins应用场景详解
2.1 持续集成:提升开发效率与质量
-
背景:在缺乏自动化工具的时代,开发人员需要手动运行验证任务,随着代码提交频率的增加,集成错误频发且难以及时发现。
-
Jenkins解决方案:通过自动化构建触发器和与版本控制系统的紧密集成,Jenkins能够在代码提交后自动运行验证任务,迅速发现集成错误并反馈,从而显著提高开发效率和代码质量。
2.2 持续部署:实现高效、稳定的发布
-
背景:传统的手动或通过Shell脚本进行的应用部署过程容易出错,且发布时间不稳定。
-
Jenkins解决方案:Jenkins将部署脚本集成到Pipeline中,实现了部署过程的可视化和参数化。通过复用发布步骤并传递环境参数,Jenkins能够自动化地将应用程序部署到不同环境中,大大降低了人工错误和发布时间的不确定性。
2.3 持续测试:增强测试的透明度和可追溯性
背景:测试人员在本地通过命令行运行测试用例,缺乏统一管理和可视化展示。
Jenkins解决方案:Jenkins允许将测试用例和相关脚本存储到版本控制系统中,并通过自动化运行测试用例和测试插件将测试结果展示到页面上。这不仅提高了测试的透明度和可追溯性,还有助于及时发现和修复问题。
三、Jenkins系统安装与架构解析
3.1 基础必备
3.1.1 Jenkins架构深度剖析
-
分布式架构:Jenkins采用灵活且可扩展的分布式架构,由服务端(Master)节点和代理端(Agent/Slave)节点构成。
-
服务端(Master)节点:负责流水线作业的调度与管理,是Jenkins的中枢神经,需保持高度稳定和可靠。
-
代理端(Agent/Slave)节点:实际执行流水线作业中的任务,可根据需求动态添加或移除,以应对不同的工作负载。
-
-
部署建议:代理端节点通常部署于靠近代码仓库或目标部署环境的位置,以减少网络延迟并提高执行效率。
3.1.2 版本选择策略
-
Jenkins LTS版本:建议选择Jenkins的LTS版本,因这些版本经过更严格的测试和验证,具有更高的稳定性和可靠性。
-
JDK版本:自Jenkins LTS 2.346.x版本起,安装部署时最低版本要求为JDK 11。为确保兼容性和稳定性,建议使用JDK 11或更高版本。
-
避免JDK 8:尽管Jenkins在某些早期版本中支持JDK 8,但随着Jenkins和插件的不断更新,JDK 8可能会引发兼容性问题或性能下降,因此建议避免使用。
3.2 安装Jenkins
Jenkins的安装方式多样,但Docker以其轻量级、可移植性和易于管理的特性,成为现代DevOps实践中安装Jenkins的首选。本文重点介绍通过Docker安装Jenkins的优化步骤,确保安装过程既高效又稳定。
3.2.1 Docker环境准备
-
Docker安装:
-
确保系统已安装Docker,并按照官方文档正确配置启动选项和网络设置。
-
Docker安装链接:Docker官方文档
-
-
Docker Compose(可选):
-
如需管理多个Docker容器或服务,建议使用Docker Compose。
-
Docker Compose安装链接:Docker Compose官方文档
-
也可以参考: https://blog.csdn.net/heijunwei/article/details/128706198
3.2.2 Docker安装Jenkins步骤
1、拉取Jenkins镜像
docker pull jenkins/jenkins:{version}
2、编写docker-compose.yml(可选)
version: "3.1" // 指定 Docker Compose 文件的版本。这里使用的是版本 3.1
services: //是一个顶级键,用于定义多个服务。每个服务都是一个独立的容器。jenkins: //是服务的名称,表示我们将创建一个名为 jenkins 的服务。image: jenkins/jenkins:{version} // 指定了要使用的 Docker 镜像。container_name: jenkins // 指定了容器的名称。这里将容器命名为 jenkins。ports:- 8080:8080 // 表示将主机的 8080 端口映射到容器的 8080 端口。Jenkins 的 Web 界面通常运行在这个端口上。- 50000:50000 // 表示将主机的 50000 端口映射到容器的 50000 端口。这个端口用于 Jenkins 的代理通信。volumes:- ./data/:/var/jenkins_home/ //定义数据卷,将主机的目录挂载到容器的目录,Jenkins 的所有配置和构建历史都会存储在这个目录中。
3、设置data目录写权限
chmod -R a+w data/
4、下载地址设置为国内镜像站
# 修改数据卷中的hudson.model.UpdateCenter.xml文件
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>https://updates.jenkins.io/update-center.json</url></site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url></site>
</sites>
# 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
5、启动jenkins容器
docker-compose up -d
如果不用docker compose 用下面的命令
docker run -d --name jenkins \ -p 8080:8080 -p 50000:50000 \ --restart=always \ -v /var/jenkins_home:/var/jenkins_home \ -e JENKINS_OPTS="--prefix=/jenkins" \ jenkins/jenkins:lts
6、查看密码登录Jenkins,并登录下载插件
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
注:此处安装插件失败概率比较大,没关系直接进入首页创建账户
3.3 Jenkins插件安装
3.3.1 常用插件简介
-
Git Plugin:与Git版本控制系统集成,允许Jenkins自动拉取代码库中的最新代码。
-
Pipeline Plugin:支持用户定义复杂的构建流程,包括分阶段构建、测试和部署等。
-
Docker Plugin:用于管理Docker容器,使应用能够在隔离的环境中运行,提高构建和部署的灵活性和安全性。
-
Blue Ocean:提供一个现代化的用户界面,简化了Jenkins的使用,改善了用户体验。
-
Parameterized Trigger:允许在不同构建任务之间传递参数,实现更灵活的构建触发和参数共享。
-
Git Parameter:基于Git的参数化构建插件,允许用户在构建时选择Git的分支、版本号、标签等参数。
-
Publish Over SSH:通过SSH连接到远程服务器,进行文件传输、执行shell脚本等操作,实现构建结果的远程部署。
-
Gitlab Plugin:基于Gitlab的WebHooks操作,可以触发Jenkins构建任务,实现Gitlab与Jenkins的自动化集成。
-
Chinese:将Jenkins界面汉化为中文,方便中文用户使用。
-
Role-based Authorization Strategy:通过基于角色的权限管理机制,支持创建全局角色、项目角色等,方便成员间的权限控制。
-
Maven Integration Plugin:支持Maven编译,方便Java项目的构建和依赖管理。
3.3.2 插件安装方法
1、设置更新站点
进入Jenkins管理界面(Manage Jenkins),选择“Manage Plugins”->“Advanced”,在最下面的“Update Site”中设置为国内镜像站点,如清华大学的镜像站点https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
,以提高插件更新的速度和稳定性。
2、修改服务器配置(可选)
如果需要进一步优化Jenkins的更新和访问速度,可以通过修改Jenkins配置文件中的默认更新站点和搜索引擎设置。这通常涉及到对Jenkins安装目录下的default.json
文件的编辑,也可以用命令操作。
sed -i 's/updates.jenkins-ci.org/download/mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json sed -i 's/www.google.com/www.baidu.com/g' default.json
3、通过Web界面安装插件
-
安装最新版本:在Jenkins首页左侧选择“Manage Jenkins”->“Manage Plugins”->“Available”,通过右上角的Filter过滤相关插件后选择进行安装。
-
安装指定版本:如果需要安装特定版本的插件,可以访问插件的wiki页面或Jenkins官方插件库,下载所需的插件版本,并通过“Manage Plugins”->“Advanced”->“Upload Plugin”进行上传安装。
4、手动安装插件
将下载好的.hpi
或.jpi
插件文件保存到Jenkins插件目录(如/var/lib/jenkins/plugins
),然后重启Jenkins服务。这种方法通常用于解决插件无法通过Web界面安装或更新的问题。
3.4 jenkins配置
由于Jenkins需要从Git拉取代码、需要本地构建、甚至需要直接发布自定义镜像到Docker仓库,所以Jenkins需要配置大量内容。
3.4.1 Agent节点配置(如果是小型项目,建议用Publish over SSH 方式)
jenkins的代理端主要用于运行Jenkins服务端所调度的流水线作业。它的部署方式与服务端一样是跨平台的。
1 配置节点
配置节点单击左侧“系统管理”进入“管理Jenkins”页面,在页面中可以看到“节点管理”选项
进入节点管理页面,可以看到已经在线的服务端master节点。单击左侧菜单中的“新建节点“
进入新建节点页面后,填写要创建的节点名称和Type(节点类型)。
单击Create按钮创建节点并进入节点的详细配置页
各个配置项的说明如下。
-
名字:填写节点的名称。
-
描述:填写节点的描述信息。
-
Number of executors:执行器的数量,默认每一个Jenkins作业会分配一个执行器。
-
远程工作目录:Agent节点的工作目录。
-
标签:可以对节点进行分组,便于流水线调度。
-
用法:哪些作业可以使用这些节点,选择“只允许运行绑定到这台机器的Job”或者“经常使用该节点”即可运行任意作业。
在Jenkins的生产环境中,常用的启动方式为SSH和JNLP。JNLP对应中文为“通过Java Web启动代理”。
提示:如果遇到“Either WebSocket mode is selected, or the TCP port for inbound agents must be enabled”错误提示,是因为在Jenkins新版本中,默认禁用了TCP端口。我们需要导航到“系统管理>管理Jenkins >安全>全局安全”配置开启TCP端口。
此端口作为后续Agent节点启动时与Server节点通信使用。
2 从节点上启动代理
以“Java Web”方式设置的代理节点,需要下载启动程序。参考下图单击节点进入节点信息页面,获取agent.jar的下载链接。启动节点的步骤如下。
# 创建工作目录(与页面新建节点时填写的一致)
mkdir -p /data/jenkins-agent
cd /data/jenkins-agent/
# 下载 openjdk-11 并解压,解压后的目录名为 jdk-11
wget https://d6.injdk.cn/openjdk/openjdk/11/openjdk-11+28_linux-x64_bin.tar.gz
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
rm -rf openjdk-11+28_linux-x64_bin.tar.gz
# 通过 Jenkins 页面提供的命令下载 agent.jar
curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar
# 启动 Java Web 代理
# 注意:jdk11没有配置环境变量,所以写全路径
/data/jenkins-agent/jdk-11/bin/java -jar agent.jar -jnlpUrl http://192.168.1.125:8080/manage/computer/worker2/jenkins-agent.jnlp -secret 2007cfd52553e6927c4a41966bd85ecf3acda559beda2a3d5e4ffd106fe01db1 -workDir "/data/jenkins-agent/"
注意:curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar出现问题的概率很高。大部分情况都是网络问题导致的,例如检查Agent节点与Jenkins Server节点的50000端口和8080端口的连通性是否正常。当出现“Connected”关键字时查看节点管理页面,可以看到该Agent已经连接成功。刷新节点页面,如图所示。
3 将 Java Web 代理安装为系统服务
上一步中,我们通过 java -jar
的方式成功启动了agent.jar
,但是这种方式在SSH
连接断开后,应用也会停止,所以我们还需要将java -jar agent.jar ……
安装为系统服务。
一键安装脚本install-jenkins-agent.sh
,只需要修改CMD=''
为Jenkins
页面给出的启动命令后上传到服务器并执行即可
#!/bin/bash
CMD='将启动命令写到这里'
JNLPURL=$(echo $CMD | sed 's/.*jnlpUrl \(.*\)/\1/'| cut -d ' ' -f1 )
WORKDIR=$(echo $CMD | sed 's/.*workDir \(.*\)/\1/'| cut -d ' ' -f1 | sed 's/"//g')
if [[ "$CMD" =~ java && "$CMD" =~ jnlpUrl && "$CMD" =~ secret && "$CMD" =~ workDir ]];thenecho "开始配置jenkins-agent服务"
elseecho "ERROR:请将节点连接jenkins的java启动命令填入脚本CMD=''的引号中"exit 1
fi
mkdir -p $WORKDIR
wget ${JNLPURL%%manage*}jnlpJars/agent.jar -P ${WORKDIR}
chmod 755 ${WORKDIR}/agent.jarcat>/usr/lib/systemd/system/jenkins-agent.service<<EOF
[Unit]
Description=The Jenkins Agent Server[Service]
User=root
ExecStart=/usr/local/bin/jenkins-agent start
ExecReload=/usr/local/bin/jenkins-agent restart
ExecStop=/usr/local/bin/jenkins-agent stop
Restart=always[Install]
WantedBy=multi-user.targetEOFcat>/usr/local/bin/jenkins-agent<<EOF
#!/bin/bashstart()
{${CMD/agent.jar/$WORKDIR/agent.jar}
}case "\$1" in
start)start;;
stop)stop;;
restart)stopstart;;
*)echo "usage: \$0 start|stop|restart"exit 0;
esac
exit
EOFchmod 755 /usr/local/bin/jenkins-agent
systemctl daemon-reload
systemctl start jenkins-agent
systemctl enable jenkins-agent
result=$(systemctl is-active jenkins-agent)
if [[ $result == 'active' ]];thenecho "success"
elsenohup ${CMD/agent.jar/$WORKDIR/agent.jar} > /dev/null 2>&1 &
fi
查看jenkins-agent
系统服务状态并查看日志
# 查看服务状态 systemctl status jenkins-agent # 查看服务日志 journalctl -u jenkins-agent -f
3.4.2 从GitLab拉取、编译并通过SSH推送代码
1 构建任务
准备好GitLab仓库中的项目,并且通过Jenkins配置项目的实现当前项目的DevOps基本流程。
-
构建Maven工程发布到GitLab(Gitee、Github均可)
-
Jenkins点击左侧导航新建任务
-
选择自由风格构建任务
2 配置源码拉取地址
Jenkins需要将Git上存放的源码存储到Jenkins服务所在磁盘的本地
-
配置任务源码拉取的地址
-
Jenkins立即构建
3 配置Maven构建代码
代码拉取到Jenkins本地后,需要在Jenkins中对代码进行构建,这里需要Maven的环境,而Maven需要Java的环境,接下来需要在Jenkins中安装JDK和Maven,并且配置到Jenkins服务。
-
准备JDK、Maven压缩包通过数据卷映射到Jenkins容器内部
-
解压压缩包,并配置Maven的settings.xml
<!-- 阿里云镜像地址 -->
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>
<!-- JDK11编译插件 -->
<profile><id>jdk-11</id><activation><activeByDefault>true</activeByDefault><jdk>11</jdk></activation><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><maven.compiler.compilerVersion>11</maven.compiler.compilerVersion></properties>
</profile>
-
Jenkins配置JDK&Maven并保存
-
配置Jenkins任务构建代码
-
立即构建测试,查看target下的jar包
4 配置Publish发布&远程操作
jar包构建好之后,就可以根据情况发布到测试或生产环境,这里需要用到之前下载好的插件Publish Over SSH。
-
配置Publish Over SSH连接测试、生产环境
-
配置任务的构建后操作,发布jar包到目标服务
-
立即构建任务,并去目标服务查看
5 基于Docker服务运行
为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。
-
添加Dockerfile文件
-
添加docker-compose.yml文件
-
追加Jenkins构建后操作脚本命令
6 选取指定的发行版本
-
下载Git Parameter插件
-
设置项目参数化构建
-
任务构建时,采用Shell方式构建,拉取指定tag版本代码
-
基于Parameter构建任务,任务发布到目标服务器
四、 jenkins系统设置
4.1用户管理
Jenkins提供了多种用户管理方式,以适应不同规模和复杂度的企业团队需求。在小规模团队中,使用Jenkins本地用户管理是一个简单直接的选择。然而,当团队规模扩大时,本地用户管理可能会带来诸多不便,如维护成本增加、账号密码跨平台同步困难等。因此,对于大规模用户场景,推荐使用LDAP(轻量级目录访问协议)进行用户认证。
4.1.1 Jenkins本地用户管理
-
在Jenkins初始化时,会创建第一个管理员用户。
-
导航至全局安全配置,默认使用“Jenkins专有用户数据库”管理用户。
-
在管理用户页面,可新建用户,需填写用户名、密码、全名等信息。
4.1.2 LDAP认证集成
对于拥有大量用户的企业团队,LDAP认证集成是一个更加高效和安全的解决方案。以下是配置LDAP认证的步骤:
-
获取LDAP组织信息
-
与您的LDAP管理员或IT部门联系,获取LDAP集成所需的参数信息。
-
这些参数通常包括LDAP服务器的地址、用户组织信息(如域名、组织单元等)以及一个具有查询权限的用户账号。
-
插件配置
-
安装LDAP插件
-
启用LDAP认证
在“全局安全配置”页面中,将“Security Realm”设置为“LDAP”。然后,根据之前获取的LDAP参数信息,填写相关的配置字段,如LDAP服务器地址、用户搜索基础DN(Distinguished Name)、用户搜索过滤器等。
-
配置用户组
如果希望根据LDAP用户组来分配Jenkins角色,还需要配置LDAP用户组映射。这通常涉及到在Jenkins中定义一个或多个角色,并将这些角色与LDAP用户组相关联。
4.2权限管理
Jenkins的权限管理是一项至关重要的安全实践,旨在精确控制平台上不同租户对Jenkins项目的访问范围。当企业中有多个项目组共享同一个Jenkins实例进行CI/CD流程时,为每个项目组配置独立的权限显得尤为重要,以减少误操作和风险。
4.2.1安装Role-based插件
安装Role-based Authorization Strategy插件,并重启Jenkins。
4.2.2全局安全配置
在全局安全配置中,启用Role-based策略
4.2.3 创建角色
-
在“Manage Jenkins”页面中点击“Manage Roles”(管理角色)链接。
-
将看到三种角色类型:Global roles(全局角色)、Item roles(项目角色)和Node roles(节点角色)。
-
创建Global roles:
-
点击“Global roles”下的“Add role”(添加角色)按钮。
-
输入角色名,如“devopsdev”。
-
在“Permissions”部分选择开发人员常用的权限,如“Build”(构建)、“Configure”(配置)等。
-
保存角色。
-
-
创建Item roles:
-
点击“Item roles”下的“Add role”(添加角色)按钮。
-
输入角色名,如“devops”。
-
在“Pattern”字段中使用正则表达式设置权限作用范围,如
^devops-.*
以匹配所有以“devops-”开头的项目。 -
在“Permissions”部分选择所需的权限,如“Build”、“Cancel”、“Configure”、“Read”等。
-
保存角色。
-
4.2.4授权角色
完成角色创建后,需要将角色分配给相应的用户或用户组。
-
在“Manage Jenkins”页面中点击“Assign Roles”(分配角色)链接。
-
根据需要选择“Grant roles to users”(将角色授予用户)或“Grant roles to groups”(将角色授予用户组)。
-
在“Roles to assign”(要分配的角色)部分选择之前创建的角色。
-
在“Users/groups”(用户/用户组)部分选择要将角色分配给的用户或用户组。
-
保存分配。
4.2.5测试权限
最后,通过测试账号登录Jenkins来验证权限配置是否成功。
-
使用测试账号(已分配特定角色的用户)登录Jenkins。
-
检查该用户只能看到与其角色相关的项目。
-
尝试进行构建、配置等操作,确保权限正确分配且有效。
4.3凭据管理
在实施DevOps流程中,Jenkins作为核心自动化引擎,经常需要与其他系统(如代码仓库、构建工具、部署环境等)进行集成和交互。这些交互通常要求Jenkins提供目标系统的认证信息,例如用户名和密码、API密钥等。为了确保这些敏感信息的安全存储和便捷使用,Jenkins提供了凭据管理功能。
4.3.1安装凭据插件
4.3.2创建凭据
-
在凭据存储中,点击“添加凭据”。
-
选择凭据类型(如用户名和密码)。
-
填写凭据信息(如GitLab仓库的用户名和密码),并添加描述。
-
创建后,将生成凭据ID,供Pipeline引用。
五、Jenkins Pipeline实战
Jenkins Pipeline使用Groovy脚本语言来定义流水线,这些脚本可以访问Jenkins管理员配置的插件,并与外部系统(如版本控制系统、云平台等工具系统)集成。通过Jenkins Pipeline,用户可以在Jenkins环境中实现CI/CD工作流,并可以通过定义多个阶段和任务来实现自动化流程。具体可以参考https://jenkins.xfoss.com/pipeline.html
相关文章:
DevOps工程技术价值流:Jenkins驱动的持续集成与交付实践
一、Jenkins系统概述 Jenkins:开源CI/CD引擎的佼佼者 Jenkins,作为一款基于Java的开源持续集成(CI)与持续交付(CD)系统,凭借其强大的插件生态系统,成为DevOps实践中不可或缺的核心…...
el-select 修改样式
这样漂亮的页面,搭配的却是一个白色风格的下拉框 ,这也过于刺眼。。。 调整后样式为: 灯红酒绿总有人看着眼杂,但将风格统一终究是上上选择。下面来处理这个问题。 分为两部分。 第一部分:是修改触发框的样式 第二部…...
文本内容处理命令和正则表达式
文本内容处理命令 grep 用来过滤文本内容,以匹配要查询的结果。 -m 数字 匹配几次后停止: grep -m 1 /root/etc/passwd #查找包含root的行 -v 取反 -i 忽略字符的大小写,默认的,可以不加 -n 显示匹配的行号 -c 统计匹配的…...
【PlantUML系列】类图(一)
目录 一、类 二、接口 三、抽象类 四、泛型类 五、类之间的关系 六、添加注释 七、包图 八、皮肤参数 一、类 使用class关键字定义类,类名后跟大括号,声明类的属性和方法。 属性:格式为{visibility} attributeName : AttributeType…...
【Leetcode Top 100】21. 合并两个有序链表
问题背景 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 数据约束 两个链表的节点数目范围是 [ 0 , 50 ] [0, 50] [0,50] − 100 ≤ N o d e . v a l ≤ 100 -100 \le Node.val \le 100 −100≤Node.val≤100 l 1 l_1 …...
【真正离线安装】Adobe Flash Player 32.0.0.156 插件离线安装包下载(无需联网安装)
网上很多人声称并提供的flash离线安装包是需要联网才能安装成功的,其实就是在线安装包,而这里提供的是真正的离线安装包,无需联网即可安装成功。 点击下面地址下载离线安装包: Adobe Flash Player 32.0.0.156 for IE Adobe Fla…...
UG NX二次开发(C#)-如何进行NX多版本的编译
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、以删除对象为例3、解决方案1、前言 由于UG NX的版本不同,新版本与旧版本开发过程中,如果是在一个工程中,其会出现低版本不能编译高版本NX的问题,这是因为高版本会引入新的函数,或者…...
Spark优化--开发调优、资源调优、数据倾斜调优和shuffle调优等
针对Spark优化,我们可以从多个角度进行,包括开发调优、资源调优、数据倾斜调优和shuffle调优等。以下是一些具体的优化方法: 1. 开发调优 避免创建重复的RDD:对于同一份数据,只应该创建一个RDD,避免创建多…...
911事件反思:灾难通信和ddos之间的取舍
流量分析与监控 建立基线流量模型:在正常情况下监控和记录网络流量,建立正常流量的基线。这样,当突发请求发生时,可以更容易地识别出流量的异常变化。 实时流量监控:使用流量分析工具实时监控网络流量,快速…...
网络安全之IP伪造
眼下非常多站点的涉及存在一些安全漏洞,黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》(建议搞IT的都要看下)中。亚伦斯沃茨(真实人物,神一般的存在)涉…...
算法笔记:力扣24. 两两交换链表中的节点
思路: 本题最简单的就是通过递归的形式去实现 class Solution {public ListNode swapPairs(ListNode head) {if(head null || head.next null){return head;}ListNode next head.next;head.next swapPairs(next.next);next.next head;return next;} } 对于链…...
Shell脚本小练习
学习了这么长时间Shell脚本,总得来一次小小的练习吧,那么请看下文! 1.用Shell写一个小计算器。 通过read命令获取用户输入的表达式,表达式的格式设定为操作数1 运算符 操作数2,例如53,然后利用设计的脚本…...
Fastify装饰器:增强你的路由处理功能加入日志
Fastify以其出色的性能和扩展性脱颖而出。装饰器是Fastify提供的一个强大功能,它允许开发者在不修改核心代码的情况下,向请求(Request)和响应(Response)对象添加自定义属性和方法。本文将通过一个简单的示例…...
node.js基础学习-url模块-url地址处理(二)
前言 前面我们创建了一个HTTP服务器,如果只是简单的http://localhost:3000/about这种链接我们是可以处理的,但是实际运用中一般链接都会带参数,这样的话如果我们只是简单的判断链接来分配数据,就会报404找不到链接。为了解决这个问…...
Vue如何加载十万条数据
加载十万条数据到 Vue 应用中是一个相对复杂的问题,主要因为渲染大量数据可能会导致性能瓶颈,尤其是在前端性能较低的设备上。为了确保加载大量数据时,页面不会卡顿或崩溃,我们通常采取一些优化手段,以下是几种常用的方…...
重生之我在异世界学编程之C语言:二维数组篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 二维数组的创建1. 二维数组的…...
linux——进程间通信及管道的应用场景
linux进程的控制-CSDN博客 liunx——进程间通信(管道通信)-CSDN博客 文章目录 文章目录 前言 二、管道的应用 1.创建子进程 1、描述: 2.创建进程及管理 3、子进程接受任务 4、控制子进程 总结 前言 上篇博客我们学习了进程间通信&…...
深度学习基础3
目录 1.过拟合与欠拟合 1.1 过拟合 1.2 欠拟合 1.2 解决欠拟合 1.2.1 L2正则化 1.2.2 L1正则化 1.2.3 Dropout 1.2.4 简化模型 1.2.5 数据增强 1.2.6 早停 1.2.7 模型集成 1.2.8 交叉验证 2.批量标准化 2.1 实现过程 2.1.1 计算均值和方差 2.1.2 标准化 2.1.3…...
靶机dpwwn-01
靶机下载地址:https://download.vulnhub.com/dpwwn/dpwwn-01.zip 信息收集 扫描靶机的IP地址 arp-scan -l 获得靶机的IP地址:192.168.200.130 查看靶机的服务类型,端口信息 nmap -sS -sV -T4 -A -p- 192.168.200.130 开启了22…...
Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 养老机构管理 业主管理 社区安防管理 社区设施管理 车位…...
大语言模型微调与 XTuner 微调实战
1 大语言模型微调 1.1 什么是微调 大语言模型微调(Fine-tuning of Large Language Models)是指在预训练的大型语言模型基础上,使用特定任务的数据进一步训练模型,以使其更好地适应和执行特定任务的过程,用于使LLM&am…...
数据结构-查找(四)总结与对比
查找算法总结 文章目录 查找算法总结一、查找的基本概念二、顺序查找法适用场景 三、分块查找法适用场景 四、折半查找法(Binary Search)适用场景 五、树型查找1. 二叉搜索树(BST)2. 平衡二叉树(AVL)3. 红黑…...
c++总复习
一、什么是 C 中的函数对象?它有什么特点? 在 C 中,函数对象(Function Object)也称为仿函数(Functor),它是一个类的实例,该类重载了函数调用运算符(),使得这个…...
AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,
一、AJAX是什么 概念 : AJAX是一种与服务器(后端)通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…...
Python学习笔记
MJ大神的Python课,课堂笔记 int 和float运算结果是 float除法(/)的结果是float整除(//),向下取整(floor)int 和 int 进行整除(//),得到的结果是int 绘制一个填充色边框色 import …...
开源 - Ideal库 - Excel帮助类,TableHelper实现(三)
书接上回,我们今天继续讲解实现对象集合与DataTable的相互转换。 01、把表格转换为对象集合 该方法是将表格的列名称作为类的属性名,将表格的行数据转为类的对象。从而实现表格转换为对象集合。同时我们约定如果类的属性设置了DescriptionAttribute特性…...
ceph手动部署
ceph手动部署 一、 节点规划 主机名IP地址角色ceph01.example.com172.18.0.10/24mon、mgr、osd、mds、rgwceph02.example.com172.18.0.20/24mon、mgr、osd、mds、rgwceph03.example.com172.18.0.30/24mon、mgr、osd、mds、rgw 操作系统版本: Rocky Linux release …...
macOS 开发环境配置与应用开发指南
macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统,因其稳定性、优雅的用户界面和强大的开发支持,已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用,还是Web应用、跨平台程序,macOS都提…...
自动化是语法,智能化是语义与语用
自动化与智能化可以从语言学的角度来进行类比和探讨。 1. 自动化是语法 自动化可以类比为“语法”的部分,因为它关注的是操作过程的规则、结构和执行方式。语法是语言中关于词汇、句子结构和规则的系统,它提供了语言运作的框架和规范。类似地,…...
基于DHCP,ACL的通信
该问题为华为的学习资料 1.首先把所有的PC机全部设置为DHCP 2.配置地址 3.ospf 4.dhcp 5.acl AR1 dhcp en interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 dhcp select global interface GigabitEthernet0/0/1ip address 10.1.12.1 255.255.255.…...
Unity跨平台基本原理
Unity跨平台基本原理 Unity跨平台基本原理微软的.Net是什么微软做 .Net平台的目的如何实现的.Net跨语言?总结 .Net Framework.Net Framework的体系结构CLR总结 如何实现的跨平台?.Net Core.Net FrameWork 到 .Net CoreMonoMono如何实现跨平台总结如何实现…...
基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统
大家好,我是Java徐师兄,今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发,开发过程中采用了OpenCV框架,Sqlite db 作为数据库,系统功能完善 ,实用性强…...
IDEA的简易安装思路
IDEA(本身就是Java开发的):是目前为止开发Java效率最高的工具,但正版收费……(eclipse的话不好说,反正还是随主流吧) 使用IDEA的前提:必须先安装JDK【否则直接使用IDEA工具来运行程序是无效的,它…...
【实战】在Koa.js中实现文件上传的接口 (本地存储)
目录 环境准备 使用 koa-body 中间件获取上传的文件 使用 Postman 测试 使用 koa-static 中间件生成图片链接 编写前端页面上传文件 文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片、上传Excel等。那么在Node Koa应用中如何实现一个支持…...
flink学习(10)——allowedLateness/测道输出
allowedLateness(lateness: Time) 水印:短期延迟,达到条件后触发计算并且关闭窗口(触发关闭同时进行) 水印allowedLateness : 短期延迟 等待长期延迟效果 1、达到水印条件后,会触发窗口计算,但是不关闭窗口…...
微信小程序按字母顺序渲染城市 功能实现详细讲解
在微信小程序功能搭建中,按字母渲染城市会用到多个ES6的方法,如reduce,map,Object.entries(),Object.keys() ,需要组合熟练掌握,才能优雅的处理数据完成渲染。 目录 一、数据分析 二、数据处理 …...
openjdk17 jvm 对象 内存溢出 在C++源码体现
##java大对象类 public class MiBigObject {private String f1;private String f2;private String f3;private String f4;private String f5;private String f6;private String f7;private String f8;private String f9;private String f10;private String f11;private String…...
【软考速通笔记】系统架构设计师⑧——系统质量属性与架构评估
文章目录 一、前言二、软件系统质量属性2.1 开发期质量属性2.2 运行期质量属性 三、质量属性场景描述四、系统架构评估方法4.1 方法分类4.2 软件架构分析方法4.3 架构权衡分析法4.4 成本效益分析法 一、前言 笔记目录大纲请查阅:【软考速通笔记】系统架构设计师——…...
YOLO系列论文综述(从YOLOv1到YOLOv11)【第5篇:YOLOv3——多尺度预测】
YOLOv3 1 摘要2 YOLOv32.1 相对于v2的改进2.2 网络架构2.3 多尺度预测2.4 YOLOv3结果 YOLO系列博文: 【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇:YOLO系列论文、代码和主要优缺点汇总】【第3篇:YOLOv…...
HarmonyOS4+NEXT星河版入门与项目实战(25)------UIAbility启动模式(文档编辑案例)
文章目录 1、启动模式2、Specified启动模式实现步骤3、文档编辑案例1、文件创建2代码实现3、Statge 创建4、添加配置1、启动模式 Singleton启动模式: 每个 UIAbility 只存在一个实例,是默认的启动模式,任务列表中只会存在一个相同的 UIAbilityStandard启动模式: 每次启动 U…...
PyTorch张量运算与自动微分
PyTorch张量运算与自动微分 PyTorch由Facebook人工智能研究院于2017年推出,具有强大的GPU加速张量计算功能,并且能够自动进行微分计算,从而可以使用基于梯度的方法对模型参数进行优化,大部分研究人员、公司机构、数据比赛都使用P…...
在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程
在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili(哔哩哔哩)视频的完整和详细步骤如下,包括使用预编译二进制文件的安装方法: 1. 安装依赖 确保你的系统已安装 FFmpeg&…...
1.1 数据结构的基本概念
1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象:是具有相同性质的数据元素的集合&…...
【NebulaGraph】深入了解查询语句(二)
【NebulaGraph】深入了解查询语句 1. NebulaGraph 查询语句概述 1. NebulaGraph 查询语句概述 文档:https://docs.nebula-graph.com.cn/3.8.0/3.ngql-guide/7.general-query-statements/1.general-query-statements-overview/ NebulaGraph 的数据以点和边的形式存…...
Oracle—系统包使用
文章目录 系统包dbms_redefinition 系统包 dbms_redefinition 功能介绍:该包体可以实现将Oracle库下的表在线改为分区结构或者重新定义; 说明:在检查表是否可以重定义和开始重定义的过程中,按照表是否存在主键,参数 o…...
org.apache.commons.lang3包下的StringUtils工具类的使用
前言 相信平时在写项目的时候,一定使用到StringUtils.isEmpty();StringUtils.isBlank();但是你真的了解他们吗? 也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty/isNon…...
详细介绍Node.js的中间件及使用方法
在Node.js的生态中,中间件(Middleware)是一个不可或缺的概念,它为构建灵活而高效的应用程序提供了强大的支持。以下是对Node.js中间件的详细介绍: 中间件的概念与定义 中间件是一种软件架构的设计模式,用…...
VPC9527同步整流控制器,相对最大电压检测与强力自供电,与MP6908完全PIN TO PIN
VPC9527 是一款高性能的同步整流控制器,它兼容 CCM 和 DCM 两种模式,最大工作频率高达 700kHz;可 通过 SEL 引脚的逻辑电压来选择 400nS 或 800nS 两个关断检测的屏蔽时间;可通过 VLC 引脚来调整限压导通的 参数,以便与所选同步整流管的参数相匹配,获得适应的最优性能;它…...
【聚类】主成分分析 和 t-SNE 降维
1 主成分分析PCA PCA 是一种线性降维技术,旨在通过选择具有最大方差的特征方向(称为主成分)来压缩数据,同时尽可能减少信息损失。 1.1 原理 1.2 优缺点 from sklearn.decomposition import PCA import matplotlib.pyplot as plt…...
MyBatis框架-日志配置
MyBatis框架的日志配置 MyBatis作为一个封装好的ORM框架,其运行过程我们没有办法跟踪,为了让开发者MyBatis执行流程及执行步骤所完成的工作,MyBatis框架本身支持log4j日志框架,对运行的过程进行跟踪记录。我们只需对MyBatis进行相…...