CICD从无到会
一 CICD是什么
CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)
1.1 持续集成(Continuous Integration)
持续集成是一种软件开发实践,团队成员频繁地将他们的工作集成到共享的代码仓库中。其主要特点包括:
频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态。
自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等。
快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题。
1.2 持续部署(Continuous Deployment)
持续部署是在持续集成的基础上,将通过所有测试的代码自动部署到生产环境中。其特点如下:
自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预。
高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户。
风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性。
1.3 持续交付(Continuous Delivery)
持续交付与持续部署类似,但不一定自动部署到生产环境,而是随时可以部署。其重点在于确保软件随时处于可发布状态。
CI/CD 的好处包括:
提高开发效率:减少手动操作和等待时间,加快开发周期。
尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决。
降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性。
增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率。
常见的 CI/CD 工具包括 Jenkins、GitLab CI/CD、Travis CI 等。这些工具可以帮助团队实现自动化的构建、测试和部署流程。
二 git工具使用

2.1 git简介
Git 是一个分布式版本控制系统,被广泛用于软件开发中,以管理代码的版本和变更。 主要特点:
分布式
每个开发者都有完整的代码仓库副本,这使得开发者可以在离线状态下进行工作,并且在网络出现问题时也不会影响开发。
即使中央服务器出现故障,开发者仍然可以在本地进行开发和查看项目历史。
高效的分支管理
Git 中的分支创建和切换非常快速和简单。开发人员可以轻松地创建新的分支来进行新功能的开发或修复 bug,而不会影响主分支。
合并分支也相对容易,可以使用多种合并策略来满足不同的需求。
快速的版本回退
如果发现某个版本存在问题,可以快速回退到之前的版本。
可以查看每个版本的详细变更记录,方便了解代码的演进过程。
强大的提交管理
每个提交都有一个唯一的标识符,可以方便地引用和查看特定的提交。
提交可以包含详细的提交信息,描述本次提交的更改内容。
支持协作开发
开发者可以将自己的更改推送到远程仓库,供其他开发者拉取和合并。
可以处理多个开发者同时对同一文件进行修改的情况,通过合并冲突解决机制来确保代码的完整性。
Git必看秘籍:Git - Book
2.2 git 工作流程

Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
三 部署git
3.1 安装git
#在rhel9的系统中默认自带git
[root@CICD-node1 ~]# dnf install git -y
#设定命令补全功能
[root@CICD-node1 ~]# echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc
[root@CICD-node1 ~]# source ~/.bashrc
3.2 初始化
获取 Git 仓库通常有两种方式:
将尚未进行版本控制的本地目录转换为 Git 仓库。
从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone
初始化版本库
[root@CICD-node1 ~]# mkdir howe
[root@CICD-node1 ~]# cd howe/
[root@CICD-node1 howe]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /root/howe/.git/
[root@CICD-node1 howe]# ls -a
. .. .git
[root@CICD-node1 howe]# ls .git/
branches config description HEAD hooks info objects refs
#设定用户信息
[root@CICD-node1 howe]# git config --global user.name "howe"
[root@CICD-node1 howe]# git config --global user.email "howe@exam.com"
#查看当前文件状态
[root@CICD-node1 howe]# git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
[root@CICD-node1 howe]# git status -s #简化输出
警告:.git目录是git跟踪管理版本库的,没事别瞎溜达!
四 git的使用方法

4.1 常用方法
[root@CICD-node1 howe]# echo superme > README.md
[root@CICD-node1 howe]# git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
[root@CICD-node1 howe]# git status -s
?? README.md #?? 新建文件未添加到版本库
[root@CICD-node1 howe]# git add README.md
[root@CICD-node1 howe]# git status -s
A README.md #A 已添加到暂存区
#提交暂存区的数据
[root@CICD-node1 howe]# git commit -m "add README.md"
[master (root-commit) 2b36cab] add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@CICD-node1 howe]# git status -s #无任何显示,标识已经提交到版本库
#再次修改
[root@CICD-node1 howe]# vim README.md
[root@CICD-node1 howe]# cat README.md
superme
superme
[root@CICD-node1 howe]# git status -s
M README.md #_M 右边的M表示文件在工作区被修改
#撤销修改
[root@CICD-node1 howe]# git checkout -- README.md
从索引区更新了 1 个路径
[root@CICD-node1 howe]# cat README.md
superme
#重新修改
[root@CICD-node1 howe]# echo howe > README.md
[root@CICD-node1 howe]# git add README.md
[root@CICD-node1 howe]# git status -s
M README.md #M_ 左M表示文件已经在版本库中并被跟踪
#从暂存区撤销
[root@CICD-node1 howe]# git restore --staged README.md
[root@CICD-node1 howe]# git status -s
M README.md
#重新提交
[root@CICD-node1 howe]# git add README.md
[root@CICD-node1 howe]# git status -s
M README.md
#更新
[root@CICD-node1 howe]# git commit -m "update v1"
[master a6318aa] update v1
1 file changed, 1 insertion(+), 1 deletion(-)
[root@CICD-node1 howe]# git status -s
#更新文件
[root@CICD-node1 howe]# echo hahaha >> README.md
[root@CICD-node1 howe]# git add README.md
[root@CICD-node1 howe]# echo xixixi >> README.md
[root@CICD-node1 howe]# git status -s
MM README.md #MM表示有一部分在暂存区,还有一部分没有提交
#如果现在提交只能提交在暂存区中的部分
[root@CICD-node1 howe]# git commit -m "update v2"
[master 3381f25] update v2
1 file changed, 1 insertion(+)
[root@CICD-node1 howe]# git status -s
M README.md #右M还在
#查看已暂存和未暂存的修改变化
[root@CICD-node1 howe]# echo hehehe >> README.md
[root@CICD-node1 howe]# git diff
diff --git a/README.md b/README.md
index 9f19a78..9a1a9d2 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
howe
hahaha
+xixixi
+hehehe
#跳过使用暂存区,只能在提交过的在版本库中存在的文件使用如果文件状态是“??”不能用此方法
[root@CICD-node1 howe]# git commit -a -m "update v3"
[master 365b7bf] update v3
1 file changed, 1 insertion(+)
#撤销工作区中删除动作
[root@CICD-node1 howe]# touch lee.txt
[root@CICD-node1 howe]# git add lee.txt
[root@CICD-node1 howe]# git commit -m "add lee.txt"
[master c6189a6] add lee.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 lee.txt
[root@CICD-node1 howe]# rm lee.txt
rm: remove regular empty file 'lee.txt'? y
[root@CICD-node1 howe]# git status -s
D lee.txt #右D表示文件在工作区被删除
[root@CICD-node1 howe]# git checkout -- lee.txt #恢复被删除文件
[root@CICD-node1 howe]# ls
lee.txt README.md
#从版本库中删除文件
[root@CICD-node1 howe]# git rm lee.txt
rm 'lee.txt'
[root@CICD-node1 howe]# git status -s
D lee.txt #左D表示文件删除动作被提交到暂存区
[root@CICD-node1 howe]# git commit -m "delete lee.txt"
[master ed13788] delete lee.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 lee.txt
#恢复从版本库中被删除的文件
[root@CICD-node1 howe]# git log 查看日志
[root@CICD-node1 howe]# git reflog
ed13788 (HEAD -> master) HEAD@{0}: commit: delete lee.txt
c6189a6 HEAD@{1}: commit: add lee.txt
365b7bf HEAD@{2}: commit: update v3
31bea73 HEAD@{3}: commit: update v2
fed7d84 HEAD@{4}: commit: add test.txt
2590b49 HEAD@{5}: commit: delete file.txt
9f79896 HEAD@{6}: commit: add file.txt
d9268c2 HEAD@{7}: commit: add howe.txt
30766d4 HEAD@{8}: commit: update v3
3381f25 HEAD@{9}: commit: update v2
a6318aa HEAD@{10}: commit: update v1
2b36cab HEAD@{11}: commit (initial): add README.md
#版本回退到删除之前
[root@CICD-node1 howe]# git reset --hard c6189a6
HEAD is now at c6189a6 add lee.txt
[root@CICD-node1 howe]# ls
lee.txt README.md test.txt
4.2 git对于文件如何忽略
在做软件开发时对源码编译会产生一些临时文件,我们在提交时需要忽略这些临时文件
[root@CICD-node1 howe]# mkdir dir1/
[root@CICD-node1 howe]# touch dir1/.file2
[root@CICD-node1 howe]# git status -s
?? dir1/
[root@CICD-node1 howe]# echo .file1 > /gitignore
[root@CICD-node1 howe]# git status -s
?? .gitignore
?? dir1/
[root@CICD-node1 howe]# echo ".*" > /gitignore
[root@CICD-node1 howe]# git status -s
[root@CICD-node1 howe]#
五 gitlab代码仓库
5.1 gitlab简介

GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。
GitLab 具有很多功能,比如代码托管、持续集成和持续部署(CI/CD)、问题跟踪、合并请求管理等。它可以帮助开发团队更好地协作开发软件项目,提高开发效率和代码质量。
官网:https://about.gitlab.com/install/
中文站点: GitLab下载安装_GitLab安装和配置_GitLab最新中文官网免费版下载-极狐GitLab
官方包地址:gitlab/gitlab-ce - Packages · packages.gitlab.com
5.2 gitlab 的部署实施
5.2.1 部署gitlab
部署gitlab需要内存大于4G
#在安装包之前需配置好软件仓库来解决依赖性
[root@CICD-node1 ~]# yum install -y curl policycoreutils-python openssh-server perl
[root@CICD-node1 ~]# ls
gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm
[root@CICD-node1 ~]# dnf install gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm -y
5.2.2 配置gitlab
#修改配置文件
[root@CICD-node1 ~]# cd /etc/gitlab/
[root@CICD-node1 gitlab]# ls
gitlab.rb
[root@CICD-node1 gitlab]# vim gitlab.rb
32 external_url 'http://172.25.250.10'
#修改配置文件后需利用gitlab-crt来生效,
[root@CICD-node1 gitlab]# gitlab-ctl reconfigure
#执行命令成功后会把所有组件全部启动起来
5.2.3 登陆gitlab
用户名默认为 root 。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password文件中, 查看随机密码并使用 root 用户名登录。
注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。
#查看原始密码
[root@CICD-node1 gitlab]# cat /etc/gitlab/initial_root_password
# WARNING: This value is valid only in the following conditions
# 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
# 2. Password hasn't been changed manually, either via UI or via command line.
#
# If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.
Password: oeBO3vlL00XzqJSv3RjliicyU0RAyKupuj6boCV1yAk= #密码
# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
[!WARNING]
注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。
登陆

设置语言

设置密码
5.3 在gitlab中新建项目




#生成sshd密钥
[root@CICD-node1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:tD/HEFuyQqQtzHrhJSMYoH1Uri+kI47/nnG3nLivhug root@CICD-node1.exam.com
The key's randomart image is:
+---[RSA 3072]----+
|... ... . |
|.. + + + |
|. o o X = o . |
| . = O . * |
| + o S + |
| o o o o |
|. o.o.o . o o |
|o....=.+ o o |
|.+Eo+.++= |
+----[SHA256]-----+
[root@CICD-node1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCPwT7M13rAjGvO9rRXBC6Ux79CwlUb9NKcJZ6Z2t/1nSmT3Wv2akV3n1jF9Ja+AiBPOe8T25D8nlD4GVtieNLIk0oelESkzvjdPjVMajVPmOERvM5y5IK0EAxJnLi2tOp1IQBEXT6MoKdOuljOTAtYQT7rxg3522L1YIoxrTe4CTK1ECu8IHJRIADGjE55mm4+CG+DVt2qJa8QxCfKeLbxq+Us2lXtuTbs1trOQMlzpVE2IwmSwdGsuowchuv25bJwwwPq/R4dQm1xyKLl7epLVhjxaeD9vr1jv1JL1M62u3Wrsk1vkNGutj0oB2Lr82Q9Uhkd7mRTB6Ny7zC3qDBC6DQCNaZ2ohtmqXPPyh5zOmiGkjDLH/e1U/mizjML80SYwlpCvtoVZqE0NZ83HeT1+VEQayypl7NTxyrO50L2piNtymntHheXc2Dn8ke6wHZGCGJNH6uGvIa1REbQonPuc18SEIFdxaE360k4mclacT1mjhxd5bFuClEXN2PFwLM= root@CICD-node1.exam.com
上传公钥到gitlab中


下载项目
[root@CICD-node1 ~]# git clone git@172.25.250.10:/root/superhowe.git
Cloning into 'superhowe'...
The authenticity of host '172.25.250.10 (172.25.250.10)' can't be established.
ED25519 key fingerprint is SHA256:0KxVks073rJRW4wBFxu4/GJQrfD2k8n22qHtN6e7K7c.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:1: 172.25.250.105
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.25.250.10' (ED25519) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3 (from 1)
Receiving objects: 100% (3/3), done.
[root@CICD-node1 ~]# ls -R
.:
howe
./howe:
dir1 lee.txt README.md test.txt
./SuperHowe:
README.md
[root@CICD-node1 ~]# cd superhowe/
[root@CICD-node1 superhowe]# ls
README.md
[root@CICD-node1 superhowe]# git remote -v
origin git@172.25.250.10:/root/superhowe.git (fetch)
origin git@172.25.250.10:/root/superhowe.git (push)
#文件提交
[root@CICD-node1 superhowe]# echo welcome > superhowe
[root@CICD-node1 superhowe]# git add superhowe
[root@CICD-node1 superhowe]# git commit -m "add superhowe"
[main 12784d0] add superhowe
1 file changed, 1 insertion(+)
create mode 100644 superhowe
[root@CICD-node1 superhowe]# git push -u origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 172.25.250.10:/root/superhowe.git
a0b2b94..12784d0 main -> main
branch 'main' set up to track 'origin/main'.
六 jenkins
6.1 jenkins 简介

Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行
CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。

CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中
6.2 部署 jenkins
软件下载:Download and deploy
[WARNING]
jenkins需要部署在新的虚拟机中
建议最少4G内存,4核心cpu
#安装依赖包
[root@jenkins ~]# yum install fontconfig java-17-openjdk git -y
#安装jenkins
[root@jenkins ~]# ls
jenkins-2.462.2-1.1.noarch.rpm
[root@jenkins ~]# dnf install jenkins-2.476-1.1.noarch.rpm
#启动jenkins
[root@jenkins ~]# systemctl enable --now jenkins.service
#查看原始密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
b9461bbe81854d4d851a4ecd46216749
部署插件
#注意端口为8080
[root@jenkins ~]# netstat -lntup | jenkins
Caused: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8080
网页访问172.25.250.150:8080








建议修改admin的密码,在admin的设置中修改即可


6.3 jenkins 与gitlab的整合




这个错误的原因是因为本机没有gitlab上的sshkey
[root@jenkins ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:PnpP1ZB1ZFjPjMTokoXtWp0QwHD8kQj8M0p5XgdrkMg root@jenkins.exam.com
The key's randomart image is:
+---[RSA 3072]----+
| oo*o*.=o+=|
| E.B O+o*.|
| o Bo*..+|
| o B Oo+ |
| .S+ O... |
| .. o. |
| o . |
| ..o |
| .. .. |
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDGvXaZaxNw3IkX1buNDhOci6jz+3eNixBd2sBP25qr65sK2bdTgR44BYb0lxd7g2UPu6tUwaAqqAlcWPFOw4jQi+jHNA8W4vdowozYIivsHySabGS7kcJSxZIE0KIdDhNmei02/zpoQNoxxOdenkrxP2Gj/syjIXIEn5YaPONl8wji50lBiEbTESkfFmNPt8Rnew+XkqBt9UGPvzoTZj5pknang8Z2CWxjH+G41cXTOgvTPGw9rV9hJdLPzWRJ36qcAcge+HBhCEgwboELDZalXr6QPPykOMbUFu8C/dkDcH/jjmLiCfw/skzu5/QqzV2dNXfdXcQ5Zc+D3kMjRRR6CViU37FoxDzvEYo4U/XdKVLdT4kprGY8yWwyoFZx6Bu8qqYYvmjDpowmQjXH0fJkAXBuVrIz9rNVMAJjAPguFF+cG+Y5rX77hlMQst3tA/VC8S+4eI881IH2VlAylIzdCi17jLYskBzV+5BgkuNkSIYnICRyjS5aDBwpTKnp980= root@jenkins.exam.com
把此密钥添加到gitlab上即可

添加密钥凭据


#查看本机私钥
[root@jenkins ~]# cat .ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

添加完成后报错依然存在,因为ssh首次连接主机是需要签名认证,需要手动输入yes
还有两主机之间要做好解析
[root@jenkins ~]# vim /etc/ssh/ssh_config
20 Host *
33 StrictHostKeyChecking no




相关文章:
CICD从无到会
一 CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集成是…...
责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样,链条上有很多节点,节…...
Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch
在 Java 编程中,条件控制语句用于控制程序的执行路径,决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分,帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中,我们将…...
十一、SOA(SOA的具体设计模式)
我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类: 1. 服务层次设计模式 1.1. 基础服务(Fundamental S…...
Mybatis原理
一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先,在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步,获取一个Connection。 第三步,创建一个Statement对象。 第四步,execute()方法执行SQL。execute()方…...
黑马头条day3-2 自媒体文章管理
前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...
JinDouYun性能测试工具使用方法
1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…...
操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…...
【Oauth2整合gateway网关实现微服务单点登录】
文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…...
WEB领域是不是黄了还是没黄
进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是…...
Android系统:系统架构
文章目录 分层设计分块设计总结 分层设计 自上而下分为:应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...
NCNN 源码(1)-模型加载-数据预处理-模型推理
参考 ncnn 第一个版本的代码。 0 整体流程 demo:squeezenet ncnn 自带的一个经典 demo:squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...
重修设计模式-结构型-享元模式
重修设计模式-结构型-享元模式 复用不可变对象,节省内存 享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避…...
JavaScript 运算符
JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法: 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...
3.js - 运动曲线
这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…...
免费ppt模板哪里找?职场必备这些利器
一眨眼,9月份的尾声渐近,无论是学生还是职场人士,都开始准备着新一轮的演讲和报告。在这个忙碌的时期,一份精美的PPT模板能够大幅提升你的工作效率,让你的演示更加引人入胜。 不用担心高昂的版权费用,市场…...
wampserve 配置本地域名,出现错误
概述 今天更换了电脑,在本地安装和配置docker的时候,想用自定义域名访问NGINX容器,127.0.0.1和localhost都可以访问,但是自定义域名无法访问, 接着去捯饬已经使用的wampserver的集成环境,出现了同样的问题…...
MySQL慢查询优化指南
博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 当遇到慢查询问题时,不仅影响服务效率,还可能成为系统瓶颈。作为一位软件工程师,掌握MySQL慢查询优化技巧至关重要。今天,我们就来一场“数据库加速之旅…...
怎么录制游戏视频?精选5款游戏录屏软件
对于热爱游戏的你来说,记录游戏中的精彩瞬间并分享给朋友或粉丝,无疑是一种享受。然而,在众多录屏软件中,如何选择最适合你的那一款?今天,我们就为大家精选了五款游戏录屏软件,需要的朋友快来选…...
论文阅读 - MDFEND: Multi-domain Fake News Detection
https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
