当前位置: 首页 > news >正文

使用GitLab+Jenkins搭建CICD执行环境

使用GitLab+Jenkins搭建CI\CD执行环境

    • 前言
    • 什么是DevOps?
    • 什么是CI/CD?
    • 使用GitLab+Jenkins搭建CI\CD执行环境
      • GitLab安装
        • 1. 安装和配置所需的依赖
        • 2. 下载并安装极狐GitLab
        • 3. 登录极狐GitLab 实例
        • 4.常用gitlab指令
        • 5.修改密码
      • Jenkins安装
        • 1.Jenkins 的主要特点和用途
        • 2.下载
        • 3.启动
        • 4.配置镜像源
        • 5.配置与初始化
    • 基于GitLab+Jenkins快速实现CI\CD
      • 1、创建一个maven项目
      • 2、配置项目构建及部署过程
    • 项目打包及部署方式可能出现的问题以及优化

前言

本篇文章主要讲解一些运维方面的知识,但不会涉入大深,毕竟我只是一个后端开发人员。但是,就会有很多小伙伴问了,我做后端开发的,为什么要学习运维人员的知识?那要运维的人干什么等等等等…我要说的是,虽然现在一个产品的开发,划分了很多的部分,比如前端,后端,测试,运维等等,但是现在企业也会要求求职人员具备一些其他方面的知识,为什么呢?因为当我们系统报错的时候,都有判断出到底是哪里出错了,快速对问题进行解决,而不是运维人员发现问题,就将系统停掉,再交给开发人员进行修改,这样太浪费时间。因此,在现代化的大型软件项目中,对于开发人员的要求也更为全面。虽然开发人员不要求像专业的运维人员一样,掌握服务器的各种安全策略、参数调优等。但是对于基础的运行环境运维操作也必须要了解,这样才能指导运维人员进行业务环境部署,也就是开发运维一体化。虽然现在有很多工具能够帮助开发人员减少一些复杂的操作,但是开发人员还是需要更多的接触运维的工作。由于开发和运维分开,也给项目开发过程中带来了很多困难。一方面,开发人员只能向运维人员描述具体的部署方式。但是由于开发人员无法接触到生产服务器,所以文字描述的方式往往很难保证操作的准确性。经常会出现开发人员在开发环境运行得很好的迭代包,升级到生产环境上之后无法保证升级的效果。对于现在流行的基于敏捷开发的大型项目来说,很多需求需要以代码分支的方式进行并行开发,然后再合并部署,这其中更是非常容易出现错误,造成生产环境不稳定。另一方面,当项目在线上运行出现故障时,开发人员也很难第一时间接触到错误日志。如果线上出现问题,开发人员往往需要找运维部门协同,才能获取到生产环境的服务日志。这会极大的延缓错误排查的及时性。为了解决这些问题,就诞生了DevOps和CI/CD。

什么是DevOps?

DevOps是Development(开发)和Operation(运维)两个单词的组合,他是一种重视软件开发人员和运维技术人员之间沟通合作的文化、运动或者惯例。通过自动化软件交互和架构变更的流程,使得构建、测试、发布软件时能够更加快捷、频繁和可靠。总的来说更偏向于是一种标准,一种规范。

什么是CI/CD?

在这里插入图片描述

CI/CD可以说就是DevOps的具体实现, CI\CD中的CI指的是持续集成Continuous Integeration,他是开发人员的自动化过程。成功的CI意味着人员同的新代码变更会定期构建、测试并合并到共享存储库(比如Git或者SVN)。而CD指的是持续交付Continuous Delivery和持续部署Continuous Deployment。成功的CD意味着运维人员可以从共享存储库中持续获取到最新的产品副本,并确保最新的产品副本可以正确更新到服务器上。

使用GitLab+Jenkins搭建CI\CD执行环境

了解了一些运维的官方术语后,我们就快速的尝试搭建一下CI\CD执行环境。

GitLab安装

GitLab是企业中最为常用的私有代码仓库解决方案。你可以把他理解为一个企业自己搭建的GitHub或者Gitee。企业通常会通过GitLab搭建自己的代码仓库,开发人员的应用代码都通过GitLab进行协同开发。

GitLab是一个开源项目,分为免费的ce社区版和收费的ee企业版。这里介绍ce社区版的安装过程。

1. 安装和配置所需的依赖

在 CentOS 7 上,下面的命令会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab,则可以跳过它。

sudo yum install -y curl policycoreutils-python openssh-server perl  //依赖插件
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

(可选)如果要使用 Postfix 来发送电子邮件通知,执行以下安装命令。

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

在安装 Postfix 的过程中可能会出现一个配置界面,在该界面中选择“Internet Site”并按下回车。把“mail name”设置为您服务器的外部 DNS 域名并按下回车。如果还有其他配置界面出现,继续按下回车以接受默认配置。

如果您想使用其他解决方案发送电子邮件,请跳过上面 Postfix 安装步骤并在安装极狐GitLab 后配置外部 SMTP 服务器。

2. 下载并安装极狐GitLab

执行以下命令配置极狐GitLab 软件源镜像。

curl -L get.gitlab.cn | bash

接下来,安装极狐GitLab。安装之前,需要确保您的DNS设置正确。

此外,如果需要修改访问的地址和端口,可以修改/etc/gitlab/gitlab.rb配置文件,修改其中的external_url属性即可

external_url 'http://192.168.101.65:8090'

如果您想为初始管理员用户( root )指定自定义的初始密码,可以根据文档指导进行配置。否则将默认生成随机密码。

接下来执行如下命令开始安装:

sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-jh
3. 登录极狐GitLab 实例

使用第二步 EXTERNAL_URL 中配置的地址来访问安装成功的极狐GitLab 实例。用户名默认为 root 。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中, 查看随机密码并使用 root 用户名登录。

在这里插入图片描述

注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。

服务启动完成后,就可以访问gitlab服务了。用自己修改的ip加端口访问。

在这里插入图片描述

接下来就可以登录进入GitLab,维护基础权限信息,并将项目代码上传到Git仓库当中。这些基础的操作跟GitHub或者Gitee基本上是一样的。

4.常用gitlab指令
  • gitlab-ctl reconfigure 重新配置gitlab。

  • gitlab-ctl start 启动gitlab

  • gitlab-ctl stop 停止gitlab

  • gitlab-ctl restart 重启gitlab

  • gitlab-ctl status 查看gitlab服务状态

  • gitlab-ctl tail 查看gitlab服务日志。

5.修改密码

如果忘记密码怎么办?输入一下指令即可

gitlab-rails console   //连接gitlab
u=User.where(id:1).first  //拿到root账户
u.password='12345678'
u.password_confirmation='12345678'  //修改密码为12345678
u.save! //保存
exit //关闭连接
gitlab-ctl restart 重启gitlab

完成以上操作,使用新密码登录即可。

Jenkins安装

1.Jenkins 的主要特点和用途

自动化构建:Jenkins 可以从源代码库(如Git、SVN 等)中获取最新的代码,并自动进行构建。它支持各种构建工具和构建脚本,如Ant、Maven、Gradle 等。

持续集成:Jenkins 可以将多个开发者的代码集成到共享的主线分支中,并定期执行构建和测试。这有助于发现和解决集成问题,确保软件的稳定性和可靠性。

测试自动化:Jenkins 可以与各种测试框架和工具集成,如 JUnit、Selenium、JMeter 等。它可以自动执行各种测试,并生成测试报告和分析结果。

部署自动化:Jenkins 可以自动化部署应用程序到目标服务器或云平台。它支持各种部署工具和配置管理工具,如 Docker、Kubernetes、Ansible 等。

插件生态系统:Jenkins拥有一个强大的插件生态系统,提供了各种功能和集成选项。用户可以根据需要选择和安装插件,以扩展和定制 Jenkins 的功能。

2.下载

Jenkins是企业最常用的一个自动化部署软件。下载地址为https://www.jenkins.io/download/ 。建议下载LTS(长期支持)版本的war包部署。下载获取jenkins.war文件。

首先,需要安装JDK。 Jenkins运行需要JDK环境支持。Java Support Policy通过这个链接,对照自己jdk版本,下载合适的war包

War Jenkins的历史版本链接 我下方演示的是jdk17和Jenkins2479.2.因为用其他版本安装插件比较麻烦,所以选择最新的版本。
在这里插入图片描述

3.启动

配置完成就可以直接启动Jenkins。 启动指令

java -jar Jenkins.war --httpPort=8080   //默认端口8080,可指定别的端口
nohup java -jar jenkins.war & //后台启动。这种方式不会占用当前命令行窗口,日志输出到nohup.out下。

在第一次启动的过程中,Jenkins会在日志文件中打印默认的admin用户密码。这个需要留意一下。

*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
e3c2de8a2084429ea733ef30512a0523
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
*************************************************************
4.配置镜像源

建议先配置镜像地址,因为后续需要下载插件,会很慢

找到 jenkins 的工作目录.jenkins ,查看启动日志信息,信息=里面告诉了工作目录位于什么地方。
在这里插入图片描述
在这里插入图片描述

找到 hudson.model.UpdateCenter.xml 文件打开.将 https://updates.jenkins.io/update-center.json 替换成国内镜像网址(需要管理员权限修改)

国内镜像网址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

updates 目录下,编辑 default.json 文件,将该文件中国外的地址全部替换成国内的(需要管理员权限修改)

https://www.google.com 替换成 https://www.baidu.com
https://updates.jenkins.io/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins

修改完配置之后需要重启 jenkins。

5.配置与初始化

启动完成后,就可以访问Jenkins的前台管理页面http://localhost:8080/。第一次访问时,前端页面会会引导进行一些初始化工作。例如,需要输入admin用户的默认密码,这个密码就在启动日志当中。

在这里插入图片描述

然后会引导安装一些插件。这一步比较自由。你可以按照默认方式安装,也可以选择一些你认识的常用插件安装。关键插件漏了没有关系,后续也可以再安装插件。建议后面自己按需安装。

在这里插入图片描述

配置管理员账号密码

在这里插入图片描述

再配置一下端口就能正常的访问,localhost替换成127.0.0.1使用,然后就可以进入到jenkins的首页。

在这里插入图片描述

接下来需要安装几个核心的插件。选择 Manage Jenkins-> Manage Plugins,进入插件管理页面。

在这里插入图片描述
在这里插入图片描述

在这里需要安装几个核心的插件。包括Git 、Git client、NodeJS Plugin、Maven integration plugin。如果你希望Jenkins能够更多的显示中文,还可以安装 Localization:Chinese(Simplified)插件。下载完成后有些插件需要重启才能生效。Jenkins重启的方式是直接在浏览器上访问restart接口。

在这里插入图片描述

基于GitLab+Jenkins快速实现CI\CD

接下来需要在Jenkins中配置一个构建任务。下面就以一个demo项目的后端工程为例,演示配置过程。

1、创建一个maven项目

在Jenkins首页选择新建Item,然后选择构建一个maven项目

在这里插入图片描述

2、配置项目构建及部署过程

接下来在Jenkins中配置项目的配置项还是挺多的,这里只列出几个关键的配置。其他部分可以自行调整。

首先需要在源码管理部分配置对应的git仓库地址,从gitlab上拉取源代码。

在这里插入图片描述

构建触发器部分,可以选择配置Poll SCM选项。这个选项可以定时扫描Git代码仓库。当发现Git仓库代码有变化,即有代码提交时,就会触发一次构建任务.
在这里插入图片描述

这里面Poll SCM是一个比较常用的配置。通过这个配置,可以让jenkins定期去检查代码库。如果发现代码库有更新,则自动触发当前任务,完成项目的构建以及部署。当前项目编译任务太重,提交也不太频繁,所以就选择不配置该属性。

接下来的Build部分,就可以选择需要执行的编译脚本。

在这里插入图片描述

这一步相当于指定使用 mvn package -Dmaven.test.skip=true指令对后端项目进行重新打包构建。

如果是前端项目,就需要用Nodejs的npm run build指令来构建。

构建完成之后,就会在后端项目的各个模块的target目录下生成可执行的包。这时,可以选择用Jenkins将这些Jar包分发到远程服务器上,并直接运行。

前端项目也可以用同样的方式传递到远端服务器上。远端指令只需要执行 nginx -s reload 更新一下即可。

这样就完成了一个基础项目的配置过程。接下来,保存之后,就可以选择Jenkins首页对应项目右侧的三角指令发起一次构建了。构建过程中如果有问题,可以查看构建日志,进行排查。

这里完成的是一个最简单的Maven项目构建。实际上,在企业中,还会构建更复杂的任务。

例如集成Docker,进行虚拟化部署。

添加Blue Ocean插件做一些代码质量检测,邮件通知等复杂的步骤。甚至使用Pepeline构建更为复杂的任务流水。

或者搭建SonarQube服务,并通过jenkins集成。这样就可以使用SonarQube服务来进行代码质量检测。

项目打包及部署方式可能出现的问题以及优化

基于Jenkins的CI\CD配置方式就是执行Maven对项目进行编译,然后将Jar包传到远端服务器上执行。这个过程跟我们手动进行任务部署是差不多的,只不过Jenkins将这些过程自动完成了。

但是这里其实有一个小问题。当前电商项目在编译时,是在pom.xml中采用SpringBoot的Maven插件将整个项目打成了一个可执行的Jar包。 这样打出来的Jar包可以直接使用Java -jar指令执行。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.2.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions><!-- 解决运行包不能被其他包依赖的问题 --><configuration><classifier>exec</classifier></configuration></plugin></plugins>
</build>

但是,这种方式也有一个很大的问题,就是Jar包太大了。这么大的Jar包,编译会很耗时,并且在网络中传输是非常麻烦的。所以,对于一些大型项目,通常不会采用这种一体化的fat Jar的方式。而会选择将依赖单独打成小的Jar包。这样后续每次更新只需要更新调整过的少量Jar包即可。那有哪些Maven打包方式可以帮助我们打出小的jar包呢?

其实Maven提供了很多的打包插件。例如将上面的plugin部分替换为maven-dependency-plugin,就可以将项目打成小包。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><!-- <version>2.10</version> --><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>export</outputDirectory> <!-- 将依赖包放入export文件夹 --><excludeTransitive>false</excludeTransitive><stripVersion>true</stripVersion></configuration></execution></executions>
</plugin>

通过这种方式,就可以将所有依赖的jar包都放到export文件夹中,target目录下的jar包只包含当前项目的源码,文件大小就会小很多。

将export目录下的所有jar包和target下的当前项目jar包上传到服务器的同一个目录当中,就可以直接运行了。这种方式就跟很多开源框架的运行方式相似了。至于要如何运行呢?当然就不能用java -jar指令简单执行了,需要通过java -cp指令指定依赖包和主启动类执行。至于如何使用这个指令,你之前学过的很多开源组件都可以提供帮助了。比如shardingproxy、RocketMQ等,都有这样的脚本。

这里也给出一个简单的Linux执行脚本示例,供你参考。

more runapp.sh 
#!/bin/sh
#执行jar包
RUN_LIBS=""
#依赖jar包 自行制定目录
SUPPORT_LIBS=""
RUN_LIB_PATH="/app/lib"
SUPPORT_LIB_PATH="/app/support"
#加载程序包
for i in ${RUN_LIB_PATH}/* ; doRUN_LIBS=${RUN_LIBS}:$i
done
#加载依赖包
for i in ${SUPPORT_LIB_PATH}/* ; doSUPPORT_LIBS=${SUPPORT_LIBS}:$i
done
#整合classpath
CLASSPATH=${RUN_LIBS}:${SUPPORT_LIBS}
export CLASSPATH
#调用java指令执行。-D输入参数 java中可以用 System.getProperties读取。同时指定执行入口类 SpringBootApplication  这是一个典型的Springboot的执行方式。
java  -Xdebug  -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=27899,suspend=n -cp $CLASSPATH  -Dspring.profiles.active=prod com.tuling.TulingmallCartApplication -D
user.timezone=GMT+08 1>tulingmall-admin.out 2>tulingmall-admin.err &
echo Start App Success!

实际上这样定制脚本对于提高运行效率是非常重要的,你学了很多次的JVM调优就体现在脚本定制的过程中。在脚本最后的java指令中,可以添加哪些优化参数?

另外,这种部署方式,你可以自己尝试用jenkins配置自动部署吗?

实际上,Maven还提供了非常多插件。比如对于很多复杂的项目,可能需要将不同的模块输出到多个不同的jar包当中,而不是所有代码全都输出一个jar包。下面就是使用maven-jar-plugin插件的一个可行的示例,将不同模块的代码分别整合到test1.jar和test2.jar中。有兴趣你可以自己尝试下。

<plugin> <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-jar-plugin</artifactId>  <version>3.0.2</version>  <configuration>  <!-- manifest配置信息 主要是可以配置主执行类。有主执行类,可以用java-jar直接执行。没有的话就需要指定执行类 --><archive> <manifest> <addClasspath>true</addClasspath>  <classpathPrefix>support/</classpathPrefix>  <mainClass>com.kklmars.Test1Application</mainClass> 
<!-- 可以按上面的方式自己配置,也可以指定MF文件打包。 --><manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile></manifest> </archive>  </configuration><executions> <execution> <id>test2-jar</id>  <phase>package</phase>  <goals> <goal>jar</goal> </goals>  <configuration> <classifier>test1</classifier>  <includes> <include>com/kklmars/**</include>  <include>mybatis/**</include>  <include>templates/**</include>  <include>*.properties</include>  <include>dubbo.xml</include> </includes> </configuration> </execution>  <execution> <id>test2-jar</id>  <phase>package</phase>  <goals> <goal>jar</goal> </goals>  <configuration> <classifier>test2</classifier>  <includes> <include>com/test2/crawler/*</include>  <include>com/test2/crawler/*</include>  <include>com/test2/utils/**</include>  <include>log4j.properties</include> </includes> </configuration> </execution>  </executions> 
</plugin>

如果你对Maven感兴趣,可以去Maven官网上看看Maven目前官方提供的插件。 https://maven.apache.org/plugins/index.html。 这上面能找到非常多有趣的插件,并且都有详细的说明。比如changelog插件,可以打印出Maven仓库中最近的提交记录。checkstyle和pmd插件可以对代码进行静态检查。javadoc插件可以打印出项目文档,你还可以用pdf插件,打印出pdf版本的项目文档。或者使用antrun插件去执行一些ant脚本(老程序员应该对ant很熟悉)。

以上就是本篇博客的全部内容,环境这块配置也是十分复杂的,总容易出现各种各样的问题,我也在配置过程中不断进行修正,最终成功运行,希望各位小友在阅读后也能自己动手实践。遇到问题自己动手解决,这样才能够收获更多的经验。最后希望各位能够点赞关注收藏,让我能够发表更多的文章。

相关文章:

使用GitLab+Jenkins搭建CICD执行环境

使用GitLabJenkins搭建CI\CD执行环境 前言什么是DevOps&#xff1f;什么是CI/CD&#xff1f;使用GitLabJenkins搭建CI\CD执行环境GitLab安装1. 安装和配置所需的依赖2. 下载并安装极狐GitLab3. 登录极狐GitLab 实例4.常用gitlab指令5.修改密码 Jenkins安装1.Jenkins 的主要特点…...

使用vue-pdf预览pdf和解决pdf电子签章显示问题

使用vue-pdf预览pdf和解决pdf电子签章显示问题 第一步&#xff1a;npm install vue-pdf 第二步页面使用vue-pdf <template><div class"pdf1"><Pdf v-for"i in numPages" :key"i" :src"src" :page"i" />…...

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏&#xff0c;而这篇文章讲的就是它…...

05、Docker学习,常用安装:Mysql、Redis、Nginx、Nacos

Docker学习&#xff0c;常用安装&#xff1a;Mysql、Redis、Nginx、Nacos 一、Docker安装Mysql 1、docker search mysql ##查找mysql版本都有哪些 2、docker pull mysql:5.6 ##下载5.6版本的mysql镜像 3、docker run -p 13306:3306 --name mysql ##运行…...

RabbitMQ高级篇之MQ可靠性 数据持久化

文章目录 消息丢失的原因分析内存存储的缺陷如何确保 RabbitMQ 的消息可靠性&#xff1f;数据持久化的三个方面持久化对性能的影响持久化实验验证性能对比Spring AMQP 默认持久化总结 消息丢失的原因分析 RabbitMQ 默认使用内存存储消息&#xff0c;但这种方式带来了两个主要问…...

leetcode 2274. 不含特殊楼层的最大连续楼层数 中等

Alice 管理着一家公司&#xff0c;并租用大楼的部分楼层作为办公空间。Alice 决定将一些楼层作为 特殊楼层 &#xff0c;仅用于放松。 给你两个整数 bottom 和 top &#xff0c;表示 Alice 租用了从 bottom 到 top&#xff08;含 bottom 和 top 在内&#xff09;的所有楼层。另…...

Tauri教程-基础篇-第二节 Tauri的核心概念上篇

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第二节…...

大风车excel:怎么把题库导入excel?题库导入excel

高效管理试题库&#xff1a;如何批量导入试题到 Excel&#xff1f; 在教育培训、学校管理以及在线学习平台中&#xff0c;试题库的管理是核心工作之一。如何快速、准确地将试题导入到 Excel 表格中&#xff0c;成为许多教育工作者和开发者的迫切需求。本文将围绕“题库导入 Ex…...

Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息

在Java开发中&#xff0c;处理Excel文件中的图片&#xff08;包括浮动图片和嵌入图片&#xff09;是一个常见的需求。本文将介绍如何使用EasyExcel和Apache POI库来读取Excel文件中的图片&#xff0c;并将其与数据进行关联。 1. 引言 在许多应用场景中&#xff0c;Excel文件不…...

电脑硬盘系统迁移及问题处理

一、系统迁移准备 1、确认你的电脑主板是否支持安装两块硬盘,如电脑主板有多个M2硬盘接口,我们将新硬盘安装到主板上,原来的老硬盘安装在第二个接口上,主板只有一个M2接口的话可以使用移动硬盘盒。 2、新硬盘安装好后,我们进入原来的系统,在 此电脑–右键–管理–磁盘管…...

网关 + Nacos配置管理

网关 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发、身份校验。 网关路由 新建网关模块gateway引入相关依赖 <!--网关--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter…...

《Spring Framework实战》6:核心技术 4.1.IoC 容器

欢迎观看《Spring Framework实战》视频教程 本章介绍 Spring 的控制反转 &#xff08;IoC&#xff09; 容器。 本部分摘要 Spring IoC 容器和 Bean 简介 容器概述 Bean 概述 依赖 Bean 作用域 自定义 Bean 的性质 Bean 定义继承 容器扩展点 基于注解的容器配置 Clas…...

ModuleNotFoundError: No module named ‘audioop‘

问题 ModuleNotFoundError: No module named pyaudioop ModuleNotFoundError: No module named audioop解决方案 安装库 pip3 install audioop-lts...

STM32-笔记38-I2C-oled实验

一、什么是I2C&#xff1f; I2C总线&#xff0c;全称Inter-Integrated Circuit&#xff08;互连集成电路&#xff09;&#xff0c;是一种由Philips&#xff08;现NXP半导体&#xff09;公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…...

人大金仓实现主键自增.

使用数据库中自带的参数类型 serial 类型(相当于创建一个INT列), 或者bigserial(相当于创建一个BIGINT列. 示例sql: CREATE TABLE ord(id SERIAL,ord_no INT NOT NULL,ord_name VARCHAR(32),CONSTRAINT "ord_PKEY" PRIMARY KEY ("id"));插入时指定自增值…...

h264之多视点mvc编码及解码过程(JMVC平台举例)

h264标准参考平台JMVC是针对MVC标准的&#xff0c;JMVC支持多视点编码、合流、多视点解码操作。可以利用JMVC生成h264 mvc码流和解码。 JMVC的下载地址是&#xff1a;jvet / JMVC GitLabH.264/AVC multi-view coding (MVC) extension JMVC reference softwarehttps://vcgit.hh…...

小程序学习08—— 系统参数获取和navBar组件样式动态设置

一 系统信息的概念 uni-app提供了异步(uni.getSystemInfo)和同步(uni.getSystemInfoSync)的2个API获取系统信息。 success 返回参数说明&#xff1a; 参数分类说明statusBarHeight手机状态栏的高度system操作系统名称及版本。。。 二 自定义navbar 2.1 获取系统参数 代码展示…...

数据库环境安装(day1)

网址&#xff1a;MySQL 下载&#xff08;环境准备&#xff09;&#xff1a; &#xff08;2-5点击此处&#xff0c;然后选择合适的版本&#xff09; 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…...

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境&#xff1a; 虚拟主机系统部署&#xff08;vmware&#xff0c;虚拟主机创建、虚拟主机网络配置&#xff08;桥接&#xff0c;便于网络中多个主机都能访问虚拟主机&#xff09;、虚拟软件功能&#xff0c;快照、克隆、镜像文件加载&#xff0c;ova文件制作&am…...

当算法遇到线性代数(三):实对称矩阵

实对称矩阵的理论与应用 线性代数系列相关文章&#xff08;置顶&#xff09; 1.当算法遇到线性代数&#xff08;一&#xff09;&#xff1a;二次型和矩阵正定的意义 2.当算法遇到线性代数&#xff08;二&#xff09;&#xff1a;矩阵特征值的意义 3.当算法遇到线性代数&#x…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...