持续集成与Jenkins安装使用教程
一、持续集成与Jenkins
持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。
它的核心措施是代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
通过持续集成,团队可以快速的从一个功能到另一个功能,简而言之,敏捷软件开发很大一部分都要归功于持续集成。
(一)持续集成的步骤
1.提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交。
2.测试(第一轮)
代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
3.构建
通过第一轮测试,代码可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、js脚本、图片)等等。
4.部署
过了测试和构建,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包存档,发到生产服务器。
5.回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改以下符号链接,指向上一个版本的目录。
(二)持续集成的组成要素
一个自动构建的过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预。
一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用SVN或Git。
一个持续集成服务器,jenkins就是一个配置简单和使用方便的持续集成服务器。
(三)持续集成的好处
1.降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少
2.对系统健康持续检查,减少发布风险带来的问题。
3.减少重复性工作
4.持续部署,提供可部署单元包
5.持续交付可供使用的版本
6.增强团队信心。
二、持续集成服务器Jenkins
Jenkins是一款流行的开源持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。
(一)环境准备
Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
因此,一个完善的持续集成体系包含一台Gitlab代码托管服务器,一台Jenkins持续集成服务器,一台测试服务器和一台生产服务器。
涉及到Gitlab安装、Jenkins安装、Maven安装、Tomcat安装。
(二)Gitlab安装
参考我的博客中gitlab安装教程
gitlab安装教程
(三)安装jdk
如果需要安装最新版本的Jenkins的话,是要下载JDK17的,当然,有时候项目使用jdk8的构建,所以两种版本都要会安装。
# 查看yum源可以安装的jdk版本
yum list | grep jdk
# 可以很方便安装jdk8
yum install -y java-1.8.0-openjdk
# 如果yum源支持jdk17的话,按下列命令安装
yum install -y java-17-openjdk-devel
目前国内yum源最多支持到jdk11,多数情况还是需要手动下载jdk17的压缩包。
# 为避免手动配置环境变量,直接下载rpm包
wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.rpm
# 安装rpm包
rpm -ivh jdk-17.0.12_linux-x64_bin.rpm
该安装包会把程序安装在/usr/java/
目录下。
然后检查jdk的版本,查看是否成功安装
# 查看版本
java -version
安装完成后,应该在“Dashboard - Manage Jenkins - Tools”中将JDK加入到全局配置中。
(四)Jenkins安装
1.Centos安装Jenkins
官方网站下载地址:https://www.jenkins.io/download/
不建议在官方网站下载Jenkins.war包,因为还得上传到服务器并且安装tomcat。
# 添加Jenkins的yum仓库
sudo wget -O /etc/yum.repos.d/jenkins.repo \https://pkg.jenkins.io/redhat/jenkins.repo
# 导入Jenkins的GPG密钥
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key
# 更新yum仓库
sudo yum upgrade
# 安装依赖
sudo yum install fontconfig
# 安装Jenkins
sudo yum install jenkins
然后就可以启动jenkins了
# 启动jenkins
systemctl start jenkins
# 查看jenkins状态
systemctl status jenkins
启动成功后,接着就可以访问http://服务器IP:8080
的jenkins网页了。
如果还不能访问,可以检查下防火墙设置。
# 检查防火墙端口
firewall-cmd --zone=public --list-ports
# 如果8080端口不在列表中,可以添加它
firewall-cmd --permanent --zone=public --add-port=8080/tcp
# 重新加载防火墙规则
firewall-cmd --reload
2.docker安装jenkins
如果公司有很多开发人员,每个人都想用不同版本的jenkins或者使用不同的插件,那么推荐使用docker安装jenkins。
# 在宿主机的某个目录下创建一个"jenkins_home"目录,用于后面jenkins容器挂载,这里我是在home目录下创建的
# 修改jenkins目录的访问权限
mkdir -p /home/jenkins_home
chmod 777 /home/jenkins_home
# 拉取镜像,这里我们使用的是带有lts标签的镜像,它代表最新的长期支持版本。
docker pull jenkins/jenkins:lts
# 启动Jenkins容器
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-master -v /home/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
使用docker安装Jenkins的话,需要不断更新维护自有版本的镜像文件配置,有点麻烦,不过如果想再换个环境部署迁移的话就很方便。
(五)Jenkins初始化
1.登录Jenkins
执行完成创建jenkins容器的命令后,通过浏览器访问http://服务器IP:8080
的方式就可以了。
# 查看密码
cat /var/lib/jenkins/secrets/initialAdminPassword
复制粘贴密码后等待一段时间,会跳出如下界面。
jenkins默认会连接官网进行插件的安装,这样速度比较慢,所以初始化安装时可以不安装插件!
所以应该点击“选择插件来安装”,然后选择“无”
然后系统提示我们创建初始化后的管理员账号密码,自己设置一个就可以了。
一路点击下一步,就完成正常的安装了
在“Dashboard - Manage Jenkins - Plugins”,可以看到所有可以安装的插件。
看英文困难的同学可以先安装一下 Chinese (Simplified) 中文汉化插件。
2.更换插件安装的镜像源
由于国外插件的安装速度较慢,可以替换安装源为国内镜像。
不过貌似国内的镜像源也失效了,如果找到了新的安装源地址可以自己替换一下。
# 将.xml文件中的"<url>https://updates.jenkins.io/update-center.json</url>"
# 修改为"<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>"
vi /var/lib/jenkins/hudson.model.UpdateCenter.xml# 替换后重启容器
systemctl restart jenkins
可以看到再“Advanced settings”中替换成了我们的新地址。
(六)安装凭据管理插件
Jenkins想要访问Gitlab需要输入账号密码,这个通过安装Credentials Binding凭证管理来实现。
搜索Credentials Binding插件并安装,安装成功后打开凭据管理。
在“凭据-系统-全局”这里可以添加凭证。
如下,可以分为五种凭证:
- username with password 账号密码登录
- SSH username with private key 免密ssh登录
- Secret file 密钥文件
- Secret text 密钥文本
- Certificate 证书PCKS方式
一般账号密码登录的方式比较多,我们可以在此提前录入Gitlab的账号密码。
例如,如下图,拉取代码分为SSH克隆(免密ssh登录)和HTTP克隆(账号密码登录)两种方式。
填入账号密码后,新建工程拉取Git代码仓库时就可以用这个信息了。
(七)安装Git插件
前面凭据管理插件装之后,我们可以去Gitlab拉取代码,这个要使用Git工具。
安装完成后,我们创建一个项目,在源码管理这里就会多一个Git
选项。
除了要装git插件,还需要git的工具。
# 安装git
yum install -y git
# 查看git版本
git --version
(八)安装maven
1.下载安装maven
maven可以通过下载压缩包的方式安装,也可以直接直接通过yum安装。
官方下载地址:https://maven.apache.org/download.cgi
maven的3.3.x系列支持jdk6以上版本,3.5.x~3.8.x支持jdk7以上版本,3.9.x支持jdk8以上版本。
这里我选择的是装3.9.x系列版本
# 下载maven的安装包
curl -O "https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz"
# 解压压缩包到/usr/local目录
tar -zxvf apache-maven-3.9.9-bin.tar.gz -C /usr/local
# 修改配置文件
vi /etc/profile
# 在文件末尾添加如下内容:
export MAVEN_HOME=/usr/local/apache-maven-3.9.9
export PATH=$PATH:$MAVEN_HOME/bin
# 添加完成后,使配置文件生效
source /etc/profile
配置生效后,检查版本
mvn -version
2.配置maven环境变量
安装完成后,在“Dashboard - Manage Jenkins - Tools”将maven的路径加入全局配置里。
为了保证Jenkins能正确找到并使用必要的工具和环境,需要在“Dashboard -> Manage Jenkins -> System”中的Environment variables添加全局变量,分别添加JAVA_HOME、M2_HOME、PATH+EXTRA等路径地址。
- JAVA_HOME:java目录地址 /usr/lib/jvm/jdk-17.0.12-oracle-x64
- M2_HOME:maven目录地址 /usr/local/apache-maven-3.9.9
- PATH+EXTRA:环境变量附加bin目录地址 $M2_HOME/bin
3.配置maven仓库
# 找个空间大的分区,创建maven仓库存放的目录,并赋予权限
mkdir /home/maven-repo
chmod 777 /home/maven-repo
# 编辑maven/conf目录下的settings.xml的配置文件
vi /usr/local/apache-maven-3.9.9/conf/settings.xml
# 做以下修改:1.去掉注释然后修改仓库地址 2.修改为阿里镜像源
<localRepository>/home/maven-repo</localRepository>
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
(九)构建过程
前面的各种插件都安装完成,接下来我们可以执行构建流程。
再打开项目中的配置菜单中“Dashboard -> test1 -> Configuration -> Build Steps”中选择Execute Shell
选项,意思是构建步骤中要执行shell命令。
填入shell命令,执行maven的清除和打包命令。
mvn clean package
保存完成后,可以点击左侧的Build Now
执行构建。
点击正在执行的进度条,可进入控制台查看构建的详细过程。
构建成功后,可以在控制台查看打包好的工程项目的地址。
进入服务器后台,也会发现在此目录下生成了一个jar包。
到此Jenkins的编译打包功能就成功完成了!
(十)远程部署
远程部署需要Publish Over SSH的插件,这个要安装一下。
安装完成后,就可以在全局配置里设置SSH服务器了。
上面的输入栏都可以空着。
点击新增,填入远程服务器的IP地址、账号、密码、目录等信息。
发送文件
填入传输的文件(可以用通配符)、目录地址以及传输完成后执行的命令。
保存后执行构建,查看控制台的输出日志,系统连上测试服务器了,并发送了一个文件。
登录测试服务器,可以看到文件成功传输到测试服务器。
只要配置的时候填过执行运行jar包的命令,到此就实现jar包的自动运行了!
三、Jenkins使用进阶
(一)Jenkins的项目构建类型
Jenkins自动构建类型分为三种:
- 自由风格软件项目(FreeStyle Project) 适用于任何类型的项目,比如是Java、Python还是其他语言编写的项目
- Maven项目(Maven project) 专门为Java项目设计的,特别是遵循Maven标准目录结构的项目。
- 流水线项目(Pipeline project) 适合于复杂的构建、测试和部署流程,允许将整个过程定义为一段Groovy脚本。
1.自由风格软件项目
自由风格的软件项目适用于任何类型的项目,在使用java的自由风格项目时一般是打包成war包发送到tomcat服务器中。
分为三步,拉取代码-构建代码-部署到远程服务器。
前面已经会拉取代码和编译构建了,还缺一步,就是需要将代码传输给远程服务器进行部署。
Jenkins需要安装一下用于部署的Deploy to Container插件。
安装完成后,继续选择构建后步骤的Deploy war/ear to a container
选项。
输入工程项目文件的路径和tomcat的凭证就可以部署到远程服务器。
2.maven项目
在Jenkins中安装一下Maven Integration插件。
安装完成后,就可以在Jenkins上构建maven项目了。
可以看到,maven项目多了不少选项。与自由风格项目的区别是读取的是POM.xml文件,然后不用写mvn的前缀。
3.流水线项目
前面两个项目各构建节点都是分散的,为方便统一管理可以使用Pipeline来管理。
安装一下Pipeline插件。
安装之后,就可以建立流水线项目了。
接着就可以通过写脚本的方式执行构建了。
(二)Pipeline语法
Pipeline脚本可以用来实现从构建、测试到部署的整个过程,它分为声明式(Declarative)和脚本式(Scripted)的语法。
基础概念
- Pipeline: 是一组按照特定顺序执行的步骤(steps),用于定义整个CI/CD过程。
- Node: 在Jenkins环境中执行Pipeline或部分Pipeline的机器。它可以是master节点或者任何agent节点。
- Stage: 代表了整个流程中的一个阶段,例如“Build”,“Test”,“Deploy”。每个stage通常对应于Pipeline中的一组操作。
- Step: 每个单独的任务称为step,它是Pipeline的最小执行单位。
1.声明式语法
pipeline {agent any // 表示可以在任何可用的agent上运行这个pipelinestages { // 所有阶段stage('Clone repository') { // 第一阶段名称:克隆仓库steps {git 'https://github.com/your-repo/your-project.git' // 替换为你的Git仓库地址}}stage('Build') { // 第二阶段名称:构建项目steps {sh './build.sh' // 假设有一个名为build.sh的shell脚本来进行构建}}stage('Test') { // 第三阶段:测试项目steps {sh './test.sh' // 假设有一个名为test.sh的shell脚本来运行测试}}stage('Deploy') { // 第四阶段:部署项目steps {sh './deploy.sh' // 假设有一个名为deploy.sh的shell脚本来进行部署}}}post { // 定义在整个pipeline完成后要执行的操作always { // 不管pipeline的结果如何都会执行cleanWs() // 清理工作区}success { // 如果pipeline成功完成,则执行echo 'Pipeline completed successfully.'}failure { // 如果pipeline失败,则执行echo 'Pipeline failed.'}}
}
2.脚本式语法
node { // 定义将在哪个节点上运行这个pipeline,'node'关键字在脚本式Pipeline中用于指定执行环境stage('Clone repository') { // 使用stage来组织不同阶段的任务checkout scm // 通过scm步骤从源码管理系统检出代码,默认情况下会使用项目配置的SCM信息// 或者直接指定Git仓库:// git 'https://github.com/your-repo/your-project.git'}stage('Build') {def buildResult = sh(returnStdout: true, script: './build.sh').trim() // 执行构建命令并捕获输出echo "Build result: ${buildResult}"}stage('Test') {sh './test.sh' // 运行测试脚本}stage('Deploy') {try {sh './deploy.sh' // 尝试执行部署脚本} catch (Exception e) {currentBuild.result = 'FAILURE' // 如果部署失败,设置当前构建结果为失败throw e // 重新抛出异常以停止Pipeline}}stage('Post Actions') { // 模拟post部分的功能if (currentBuild.result == null || currentBuild.result == 'SUCCESS') {echo 'Pipeline completed successfully.'} else {echo 'Pipeline failed.'}// 清理工作区cleanWs()}
}
3.流水线语法文档
pipeline的语法有点复杂,不知道怎么写的话,在“流水线语法 -> 片段生成器”可以协助生成pipeline语句。
同时,还有在线文档可以查询。
4.Jenkins脚本文件
前面的Jenkins的Pipeline脚本都是写在web页面里的,这样比较麻烦,不方便做版本控制。
可以在项目根目录新建Jenkinsfile的文件,并将其推送到Git仓库中。
在流水线设置中选择“Pipeline script from SCM”,意思是pipeline脚本来自版本控制系统。
填写好Git仓库地址及凭证。
系统就会默认去根目录拉取Jenkinsfile文件进行执行了。
(三)构建触发器
前面的项目都是手动触发构建,持续集成至少要做到全自动化。也就是说,开发人员提交代码并审查完成后,代码就应该全自动部署到服务器中运行。
当然,建议测试环境全自动运行,生产环境手动触发比较好。
Jenkins内置4种构建触发器:
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(Build periodically)
- 轮询SCM (Poll SCM)
1.触发远程构建
如图,选择”触发远程构建“选项,这里的身份验证令牌应该填一个加密字符串。
为方便演示,我直接填了123456
。
接着通过浏览器访问http://你的服务器IP/job/pipeline-test/build?token=123456
就可以触发构建了。
2.其他工程构建后触发
有时候Jenkins项目之间有前后依赖关系,则可以在前置工程构建时,自动触发下游工程的构建。
3.定时构建
如果有需要每天凌晨趁没人用系统的时候部署更新代码,而又不想加班,可以选择定时构建代码。
这里需要填一个变种的cron表达式。
cron表达式表示如下:
分 时 日 月 周
cron表达式编写示例(H代表形参):
# 每十五分钟一次(可能在:07, :22, :37, :52):
H/15 * * * *
# 每小时的前半段每十分钟执行一次(三次,可能在:04, :14, :24):
H(0-29)/10 * * * *
# 每个工作日从早上9:45到下午3:45,每两小时执行一次(即9:45 AM, 11:45 AM, 1:45 PM, 3:45 PM):
45 9-16/2 * * 1-5
# 每个工作日在8 AM到4 PM之间的每两个小时内随机时间执行一次(可能在9:38 AM, 11:38 AM, 1:38 PM, 3:38 PM):
H H(8-15)/2 * * 1-5
# 每月的1号和15号每天执行一次,除了12月:
H H 1,15 1-11 *
4.轮询SCM
轮询SCM意思是每隔一段时间去轮询Git仓库的整个项目代码有没有变化,若有变化就执行构建,没有则不构建。
若项目很大会遍历每个文件是否变化,严重影响性能,所以一般不推荐这种方式构建。
这里的Poll SCM也是填写cron表达式来定期轮询。
5.Gitlab Hook钩子
为了有更好的性能,应该把主动权放在代码仓库这边,当代码发生变更时,再通知Jenkins执行构建。
这里我们需要安装一下Gitlab Hook钩子插件。
插件安装完成后,就会发现触发器多了个选项。这里勾上,下面就会多出很多配置,比如有推送时执行构建,合并代码时执行构建等等,根据自己的需要进行选择。
完成Jenkins服务器这边的配置后,还需要改Gitlab服务器上的配置。
打开Gitlab服务器上的项目的“设置 - 集成 - Jenkins”菜单。
将前面Jenkins构建选项的URL复制下来,粘贴到Jenkins服务器URL处并填写项目名称。
填好之后,可以点击测试是否配置成功。
发现测试失败了,给了个“连接失败。请检查您的集成设置。 验证失败:Urlis blocked: Requests to the local network are not allowed”的报错。
其实,这是不允许本地网络发送请求的原因。
在“管理员 - 设置 - 网络 -出站请求”的菜单中,把“允许来自 webhooks 和集成对本地网络的请求”勾上。
再点击测试,就可以连接成功了。
可以点击测试推送事件来查看是否生效,这里报了个错误。
这是因为gitlab触发Jenkins的构建需要做下认证。
在Jenkins中取消“Enable authentication for ‘/project’ end-point”选项的勾选,即取消身份验证的功能。
再进行测试发送。
就可以发现项目成功执行构建了。
相关文章:
持续集成与Jenkins安装使用教程
一、持续集成与Jenkins 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干。 持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。 它的…...
数据库 第一章 MYSQL基础(4)
目录 MYSQL -DQL 基础查询 分组函数 函数 条件查询 实例 合并 实例 排序 数量限制 分组查询 语法: 案例: 实例 MYSQL -DQL 基础查询 分组函数 功能:用作统计使用,又称为聚合函数或统计 函数 sum(列) 求和 返回给定列值的合…...
RedisTemplate 的 6 个可配置序列化器属性对比
RedisTemplate 的 6 个可配置序列化器属性对比 RedisTemplate 提供了以下 6 个核心属性,用于分别配置键、值、哈希类型数据的序列化方式: 1. keySerializer 作用:定义 Redis 键的序列化方式。默认值:JdkSerializationRedisSeria…...
【ArcGIS微课1000例】0142:如何从谷歌地球保存高清影像图片
文章目录 一、选取影像区域1. 搜索地图区域2. 导入矢量范围二、添加输出图层三、保存高清影像1. 地图选项2. 输出分辨率3. 保存图像四、注意事项一、选取影像区域 首先需要选取影像区域,可通过以下方式快速定位。 1. 搜索地图区域 在搜索框内输入关键词,例如青海湖,点击【…...
TCP可靠性传输
TCP可靠性传输机制 确认 重传 排序 流控 排序机制 分段 --- TCP是一款基于字节流的协议 --- 由传输层的TCP执行 MSS --最大段长度 --- TCP建立连接需要协商的参数 --- TCP在建立三次握手时前两个SYN报文中将携带该参数,并且双方的该参数允许不同,如果…...
【图像处理基石】什么是RAW格式?
在图像处理中,RAW格式是一种未经处理、记录了相机传感器原始数据的图像文件格式。它保留了相机传感器捕捉到的全部原始信息,未经任何压缩或处理,因此被称为“原始数据”(Raw)。以下是关于RAW格式的详细解释:…...
Java 基础-30-单例设计模式:懒汉式与饿汉式
在软件开发中,单例设计模式(Singleton Design Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源(如数据库连接池、线程池等)或需要…...
95. 费解的开关
你玩过“拉灯”游戏吗? 25 盏灯排成一个 55 的方形。 每一个灯都有一个开关,游戏者可以改变它的状态。 每一步,游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变…...
Gin、Echo 和 Beego三个 Go 语言 Web 框架的核心区别及各自的优缺点分析,结合其设计目标、功能特性与适用场景
1. Gin 核心特点 高性能:基于 Radix 树路由,无反射设计,性能接近原生 net/http,适合高并发场景。轻量级:仅提供路由、中间件、请求响应处理等基础功能,依赖少。易用性:API 设计简洁直观&#…...
Golang的Web框架比较与选择
一、Golang的Web框架概述 又称Go语言)是一种由Google开发的开源编程语言,自诞生以来就备受关注,并被广泛应用于后端开发。在Golang的生态系统中,有许多优秀的Web框架可供选择,它们为开发人员提供了丰富的功能和灵活的性…...
18认识Qt坐标系
平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...
洛谷题单3-P1009 [NOIP 1998 普及组] 阶乘之和-python-流程图重构
题目描述 用高精度计算出 S 1 ! 2 ! 3 ! ⋯ n ! S 1! 2! 3! \cdots n! S1!2!3!⋯n!( n ≤ 50 n \le 50 n≤50)。 其中 ! 表示阶乘,定义为 n ! n ( n − 1 ) ( n − 2 ) ⋯ 1 n!n\times (n-1)\times (n-2)\times \cdots \t…...
【ABAP】REST/HTTP技术(一)
1、概念 1.1、SAP 如何提供 Http Service 如果要将 SAP 应用程序服务器 (application server)作为 http 服务提供者,需要定义一个类,这个类必须实现 IF_HTTP_EXTENSION 接口。IF_HTTP_EXTENSION 接口只有一个方法 HANDLE_REQUEST。…...
多线程代码案例 - 1
目录 单例模式 1. 饿汉模式 2. 懒汉模式 单例模式与多线程 问题1 问题2 问题3 完! 单例模式 单例模式是一种设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限…...
Python网络爬虫:从入门到实践
目录 什么是网络爬虫? 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫? 网络爬虫(Web Crawler)是一种自动化程序,通过模拟人类浏览行为&#x…...
在线XML转义工具
XML转义是将XML的特定字符转换为转义符 在线XML转义工具...
GO语言学习(16)Gin后端框架
目录 ☀️前言 1.什么是前端?什么是后端?🌀 2.Gin框架介绍 🌷 3.Gin框架的基本使用 -Hello,World例子🌷 🌿入门示例 - Hello,World 💻补充(一些常用的网…...
GO语言 使用protobuf
1.什么是protobug,为什么要学它 protobuf是一种类似于json和xml的数据序列化格式 我们可能会存在这样的问题:不同语言之间真的没有办法互相传递数据吗?如果可以,那如果一个项目使用了多种语言有应该如何传递数据? 这…...
Golang的文件处理优化策略
Golang的文件处理优化策略 一、Golang的文件处理优化策略概述 是一门效率高、易于编程的编程语言,它的文件处理能力也非常强大。 在实际开发中,需要注意一些优化策略,以提高文件处理的效率和性能。 本文将介绍Golang中的文件处理优化策略&…...
Golang的文件同步与备份
Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…...
Go和Golang语言简介
李升伟 整理 Go 和 Golang 实际上指的是同一种编程语言,只是名称不同。 Go 名称:Go 是该编程语言的正式名称。 起源:由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年开始设计,2009 年正式发布。 设计目…...
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
RedisTemplate 序列化器详细对比(官方及非官方) 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特点: 基于 Java 原生序列化(Serializable)。支持复杂对象(需实现 Serializable 接口)…...
NLP高频面试题(三十二)——介绍一下CLIP和CLIP2
在人工智能领域,图像与文本的结合一直是研究的热点。近年来,OpenAI推出的CLIP模型,以及后续发展的CLIP2模型,在多模态学习方面取得了显著进展。本文将对这两个模型进行介绍,探讨它们的架构、训练方法和应用场景。 CLI…...
【FPGA】状态机思想回顾流水灯
【FPGA】状态机思想回顾流水灯 一、LED流水灯实现1. 基本要求2. 状态机思想3. 关键代码4. 仿真测试5. 效果演示 二、CPLD和FPGA1. 技术区别2. 应用场景 三、HDLbits组合逻辑题目四、实验总结 一、LED流水灯实现 1. 基本要求 用状态机思想写一个 LED流水灯的FPGA代码写出仿真测…...
Java——StringBuilder和StringBuffer
StringBuilder和StringBuffer 字符串的不可变性字符串修改StringBuilder和StringBuffer1 字符串拼接2 获取、修改和删除下标字符3 插入字符4 字符串替换5 字符串反转6 StringBuffer和StringBuilder类与String类的转换 StringBuffer和StringBuilder类的区别 前言 在Java中String…...
基于yolo11的BGA图像目标检测
1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像,达到识别要求,减少计算量 4.标注数据的精准程度 1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验 2.明确边界框贴合…...
MongoDB 复制集实战
MongoDB 复制集实战 MongoDB 复制集架构 一、复制集核心原理 主从架构与数据冗余 复制集由主节点(Primary)和多个从节点(Secondary)构成,所有节点存储相同数据集副本。 主节点:唯一接受写操作的节点&…...
一个服务器算分布式吗,分布式需要几个服务器
一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...
k8s之Ingress讲解
一、Ingress基本介绍 Ingress是管理k8s外部访问(http/https)的API对象,提供应用层的路由功能,处理第七层(http/https)流量,支持基于域名、路径的路由。与service不同的是,service处理…...
centos-LLM+EmbeddingModel+VectorDB-简单模型
参考: Ollama平台里最流行的embedding模型: nomic-embed-text 模型介绍和实践-CSDN博客 https://blog.csdn.net/skywalk8163/article/details/145498041 https://docs.cherry-ai.com/knowledge-base/data Installation — Sentence Transformers docum…...
Uniapp 持续出现 Invalid Host/Origin header 解决方法
目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...
密码学基础——古典密码学
目录 一、定义 特点: 二、发展阶段 三、代换密码 1.单表代换密码 1.1恺撒密码 1.2 移位变换 1.3 仿射变换 2.多表代换密码 维吉尼亚密码 四、置换密码 栅栏密码 一、定义 古典密码学是指在现代密码学出现之前,使用较为简单的数学方法和手工…...
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
Java 连接 Redis 的驱动分类及对比 1. Jedis 类型:纯 Java 实现的 阻塞式(同步) 客户端特点: 基于阻塞 IO,每个连接一个线程,适合中小型应用。支持单机、哨兵模式、集群模式。使用简单,直接操作…...
人工智能之数学基础:基于吉文斯变换完成矩阵的QR分解
本文重点 在数值线性代数中,QR分解是将矩阵分解为一个正交矩阵(Q)和一个上三角矩阵(R)的重要方法。它在求解线性方程组、计算矩阵特征值及最小二乘问题中具有广泛应用。吉文斯变换(Givens Transformation)作为实现QR分解的核心工具之一,通过平面旋转变换逐步消去矩阵元…...
后端框架入门:Django
Django 基础:模型、视图、模板Django REST Framework 的使用一、Django 概述 Django 是一个 高效、灵活、可扩展 的 Python Web 框架,主要用于快速开发 Web 应用 和 REST API。 📌 Django 的优势: ✅ MTV 架构:模型(Model)、视图(View)、模板(Template)分离,便于…...
16变量命名风格
给变量/函数/文件/类 起名字, 非常有讲究的~~ 1.起的名字要有描述性.不要使用 abc,xyz 这种比较无规律的名字来描述 2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词 C中,偏好使用_来进行单词的分割. 形如: student_count(变量) unordered_map(stl容…...
【自学笔记】jQuery语言基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 jQuery基础知识点总览1. jQuery简介2. jQuery选择器示例代码 3. jQuery事件示例代码 4. jQuery动画示例代码 5. jQuery Ajax示例代码 6. jQuery DOM操作示例代码 总…...
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期(220-280年)的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库,收录建安十二年(207年)至建兴十二年…...
读取excel作为第一列创建数据表,然后将值插入数据表
读取 Excel 文件。创建一个数据库表,其列名与 Excel 表格的列名相同。插入数据,对于每一行,如果数据为 #N/A,插入空值。 下面是一个 Python 示例代码,使用 pandas 读取 Excel 文件,创建数据库表࿰…...
14-SpringBoot3入门-MyBatis-Plus之CRUD
1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...
英语口语 -- 常用 1368 词汇
英语口语 -- 常用 1368 词汇 介绍常用单词List1 (96 个)时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 (95 个)机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…...
《汽车噪声控制》课程作业
作业内容 在MATLAB绘制给出单个正弦波或余弦波的时域图和频域图 绘制实测数据的时域图和频域图 图1 单个正弦波的时频图 图1 单个正弦波的时频图 % 正弦波参数设置 f0 1000; % 信号频率 1kHz Fs 16384; % 采样频率 16kHz T 0.05; % 信号持续时间 0.05秒 A 0.8; % 信号幅度…...
nginx的反向代理和负载均衡
http 协议反向代理 反向代理配置参数: proxy_pass;#用来设置将客户端请求转发给的后端服务器的主机 可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支…...
栈 —— 数据结构基础刷题路程
一、P1739 表达式括号匹配 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//压栈void push(int data){a[t]data; } //取栈顶元素int top(){return a[t]; } //弹出栈顶元素void pop(){i…...
SQL语句(一)—— DDL
目录 一、SQL 基础知识 (一)SQL 通用语法 (二)SQL 分类 二、DDL —— 数据库操作 1、查询所有数据库 2、查询当前数据库 3、创建数据库 4、删除数据库 5、切换数据库 三、DDL —— 表操作 (一)查…...
ROS2 高级组件中的webots介绍
前言 这一篇文章主要是和大家分享一下关于ROS2 高级组件中的webots,会介绍关于webots的知识点,以及如何安装和测试环节,最后就是利用 webots 实现一个差速轮式机器人的运动仿真。 正文内容 webots 引入和学习资料 webots 是来自瑞士的 Cy…...
SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
Java 基础-29-final关键字-详解
在Java编程语言中,final是一个非常重要的关键字,它用于不同的上下文中以表示某些东西是不可变的。本文将详细介绍final关键字的各种用法和其应用场景。 1. final变量 当你将一个变量声明为final时,这意味着一旦给这个变量赋值后,…...
从数据透视到AI分析,用四层架构解决运维难题
在数字化转型的浪潮中,企业 IT 系统已从单一架构演变为多云、多设备、多应用的复杂生态。传统监控工具因覆盖不全、响应滞后、分析能力弱而逐渐失效。Site24x7 以“全栈覆盖 智能协同”为核心,构建了一套四层递进式监控架构,实现从基础设施到…...
大智慧前端面试题及参考答案
如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...