04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程
时间版本修改人描述
2024年4月22日14:18:59V0.1宋全恒新建文档
2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加

简介

前提

  • 准备两台服务,一台部署Docker,一台部署FastBuild的镜像容器服务
  • 所述的Docker服务需要具备联网的能力,因为要下载

 这些信息位于 ECS平台侧部署文档上。

 整个过程需要如下信息

名称具体信息作用
平台的访问地址页面验证,因为有加密请求,所以直接使用swagger麻烦
harbor仓库的地址、用户名密码构建任务时,需要把Ubuntu的基础镜像18.04,20.04和Centos7等上传到harbor
部署FastBuild容器的服务器ip,用户名,密码
部署Docker构建服务的服务器ip,用户名,密码需要生成tls加密信息
jenkins构建的用户名和密码部署FastBuild镜像CI。

配置步骤

Docker服务器配置

注,该部分主要是在一台专门构建镜像的宿主机上,安装Docker,并且配置TLS、Harbor等信息。

注,请确保该服务器能够正常的访问互联网,因为需要使用网络下载各种软件

安装Docker

注,请保持网络能够访问互联网。

apt-get install docker.io

配置TLS

生成tls密码文件

 使用命令完成加密文件的生成。

 生成证书在需要开启Docker远程API访问的机器上,执行以下脚本生成证书注意默认的参数配置是10.101.12.127机器的,可替换参数需要修改,必须修改的是IP、其他都可以保持一致

#!/bin/bash
# 
# -------------------------------------------------------------
# 自动创建 Docker TLS 证书
# -------------------------------------------------------------

# 以下是配置信息
# --[BEGIN]------------------------------

CODE="jenkins"
IP="10.101.12.127"
PASSWORD="szfyd@jenkins"
COUNTRY="CN"
STATE="ZHEJIANG"
CITY="HANGZHOU"
ORGANIZATION="ZJLAB"
ORGANIZATIONAL_UNIT="Dev"
COMMON_NAME="$IP"
EMAIL="jenkins@zhejianglab.com"

 命令的主体内容如下:

#!/bin/bash
# 
# -------------------------------------------------------------
# 自动创建 Docker TLS 证书
# -------------------------------------------------------------

# 以下是配置信息
# --[BEGIN]------------------------------

CODE="jenkins"
IP="10.101.12.127"
PASSWORD="szfyd@jenkins"
COUNTRY="CN"
STATE="ZHEJIANG"
CITY="HANGZHOU"
ORGANIZATION="ZJLAB"
ORGANIZATIONAL_UNIT="Dev"
COMMON_NAME="$IP"
EMAIL="jenkins@zhejianglab.com"

# --[END]--

# Generate CA key
openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key-$CODE.pem" 4096
# Generate CA
openssl req -new -x509 -days 365 -key "ca-key-$CODE.pem" -sha256 -out "ca-$CODE.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
# Generate Server key
openssl genrsa -out "server-key-$CODE.pem" 4096

# Generate Server Certs.
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key-$CODE.pem" -out server.csr

echo "subjectAltName = IP:$IP,IP:127.0.0.1" >> extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf

openssl x509 -req -days 365 -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "server-cert-$CODE.pem" -extfile extfile.cnf


# Generate Client Certs.
rm -f extfile.cnf

openssl genrsa -out "key-$CODE.pem" 4096
openssl req -subj '/CN=client' -new -key "key-$CODE.pem" -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "cert-$CODE.pem" -extfile extfile.cnf

rm -vf client.csr server.csr

chmod -v 0400 "ca-key-$CODE.pem" "key-$CODE.pem" "server-key-$CODE.pem"
chmod -v 0444 "ca-$CODE.pem" "server-cert-$CODE.pem" "cert-$CODE.pem"

# 打包客户端证书
mkdir -p "tls-client-certs-$CODE"
cp -f "ca-$CODE.pem" "cert-$CODE.pem" "key-$CODE.pem" "tls-client-certs-$CODE/"
cd "tls-client-certs-$CODE"
tar zcf "tls-client-certs-$CODE.tar.gz" *
mv "tls-client-certs-$CODE.tar.gz" ../
cd ..
rm -rf "tls-client-certs-$CODE"

# 拷贝服务端证书
mkdir -p /etc/docker/certs.d
cp "ca-$CODE.pem" "server-cert-$CODE.pem" "server-key-$CODE.pem" /etc/docker/certs.d/

 执行完脚本后,在当前目录下会生成服务端证书文件(server-cert-jenkins.pem 等)以及一个客户端的证书压缩包,如下:

image.png

 命令生成的过程见命令,上述地址记录了执行的过程以及验证

image-20240422154430580
配置tls配置文件,开启Remote API

 一般的,我们是使用system服务完成docker服务的管理,因此需要将服务配置成tls加密启动的

 修改 /lib/systemd/system/docker.service,注意修改ExecStart命令如下,建议参考10.101.12.127上的对应文件里的命令,注意确认服务端证书文件的路径是否正确:

image.png
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -D --tlsverify --tlscacert=/etc/docker/certs.d/ca-jenkins.pem  --tlscert=/etc/docker/certs.d/server-cert-jenkins.pem  --tlskey=/etc/docker/certs.d/server-key-jenkins.pem -H tcp://0.0.0.0:2375

注意,在配置了tls启动docker之后,请验证tls设置的有效性,并配置systemd生效和重启docker服务

systemctl daemon-reload
systemctl restart docker
验证tls有效性

 将客户端证书文件压缩包文件里的 cert.pem,key.pem这两个文件复制到测试机上, curl中-k的意思是Allow connections to SSL sites without certs,不验证证书

curl -k https://docker服务器IP:2375/info --cert  cert.pem路径  --key 路径

 在靠北了这个文件的服务器上使用如下命令进行验证

root@iZ1pp06qu51oiqqddsrnuxZ:/mnt/nas_self-define/meizhewei/fastbuild/tls# curl -k https://10.200.88.44:2375/info --cert cert-jenkins.pem --key key-jenkins.pem 
{"ID":"FYCU:3OCK:DCG7:V6YN:FKQN:4HY7:KLCE:5MVS:N4CN:TRQQ:BZOM:BZAM","Containers":0,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":0,"Images":1,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"],["userxattr","false"]],"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":true,"NFd":25,"OomKillDisable":true,"NGoroutines":34,"SystemTime":"2024-04-22T17:04:53.635322909+08:00","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","CgroupVersion":"1","NEventsListener":0,"KernelVersion":"4.15.0-196-generic","OperatingSystem":"Ubuntu 18.04.6 LTS","OSVersion":"18.04","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"10.101.12.128":{"Name":"10.101.12.128","Mirrors":[],"Secure":false,"Official":false},"10.101.12.129":{"Name":"10.101.12.129","Mirrors":[],"Secure":false,"Official":false},"10.200.88.53":{"Name":"10.200.88.53","Mirrors":[],"Secure":false,"Official":false},"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true},"harbor.alkaidos.cn":{"Name":"harbor.alkaidos.cn","Mirrors":[],"Secure":false,"Official":false}},"Mirrors":[]},"NCPU":16,"MemTotal":33704079360,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"iZ1pp06qu51oiqqddsrnuvZ","Labels":[],"ExperimentalBuild":false,"ServerVersion":"20.10.21","Runtimes":{"io.containerd.runc.v2":{"path":"runc"},"io.containerd.runtime.v1.linux":{"path":"runc"},"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"","Expected":""},"RuncCommit":{"ID":"","Expected":""},"InitCommit":{"ID":"","Expected":""},"SecurityOptions":["name=apparmor","name=seccomp,profile=default"],"Warnings":["WARNING: No swap limit support"]}

配置Harbor

 由于要在该Docker服务器上构建镜像,并将镜像推送到Harbor仓库,因此需要该Harbor的信息配置在docker配置文件中。

 主要是配置/etc/docker/daemon.json

{
  "insecure-registries" : [
    "harbor.alkaidos.cn","10.101.12.128","10.101.12.129", "10.200.88.53"
  ]
}

代码分支创建并配置

注,回头应该将所有这些信息都有有外部传入

创建分支

注,该步骤主要是为了配合jenkins,因此需要单独建立一个分支。但最后也是使用环境变量的方式来修改。

(venv) D:\200-Git\250-framework\fastbuild>git checkout -b aliyun
Switched to a new branch 'aliyun'

修改fb-prod.ini配置文件

 该过程的主要目的是为了在FastBuild的配置文件中配置harbor仓库的信息

image-20240422142720225

 一般的,配置的事生产环境,因此需要修改的事fb-prod.ini这个文件。

注,相应的,配置了该文件之后,需要在构建当前镜像的时候,传入环境变量FB_ENV,并且配置为prod

 这部分的代码位于:

def get_config_file():
    config_file = "config/fb-test.ini"
    if "FB_ENV" not in os.environ:
        return config_file
    env_val = os.environ["FB_ENV"]
    if env_val not in ["dev", "prod", "test"]:
        return config_file

    return "config/" + "fb-" + env_val + ".ini"

 主要的,要修改的内容包括:

  • [fb]下的host,即表示FB的镜像容器所在的宿主机IP
  • [remote-docker]下的host和port,确定了构建镜像的服务所使用的逻辑的IP和端口
  • [harbor]即镜像仓库的用户名,密码和registry地址
  • [tls], 关于tls这部分,需要使用tls通信的三个文件,用来和Docker服务进行通信。该过程主要是FastBuild容器服务需要和远方的Docker进行通信,通信的方式采用了TLS加密的机制,所需的三个文件由Docker服务器配置TLS的过程产生
[fb]
# 系统源所在目录, 其中1级目录表示源的类型,如阿里ali, 网易(163), 清华(qinghua)
source_dir = /mnt/nas_self-define/meizhewei/fastbuild/source
# 镜像构建任务根目录,其中任务目录保存了Dockerfile以及需要的镜像构建材料
task_dir = /mnt/nas_self-define/meizhewei/fastbuild/task
# 安装器所在目录, pip、conda、python均位于其中。其中pip中又分为pip2和pip3目录
tools_dir = /mnt/nas_self-define/meizhewei/fastbuild/tools
# FB所在的主机
host = 172.27.213.154
# FB所占用的端口
port = 48001

[db]
file = sqlite:mnt/nas_self-define/meizhewei/fastbuild/database/fb-prod.db

[tls]
client_cert_path = /mnt/nas_self-define/meizhewei/fastbuild/tls/cert-jenkins.pem
client_key_path = /mnt/nas_self-define/meizhewei/fastbuild/tls/key-jenkins.pem
ca_path = /mnt/nas_self-define/meizhewei/fastbuild/tls/ca-jenkins.pem

[callback]
# 记录了镜像构建要上报的主机端口信息,采用HTTP协议
host = 172.27.213.154
port = 40096

[remote-docker]
# 记录远端docker server的host:port
host = 172.27.213.164
port = 2375

[aes]
# 用于AES加密的key
key = c7e71f37dda040fd
# 用于AES加密的偏移量设置
iv = 0000000000000000

[harbor]
username = admin
password = harbor@Szfyd2023
registry = 172.27.213.154:30003

注,[callback]回调已经不需要配置了,由外部服务传入,服务名称为dros-open-image,请确保和修改application-dev.yml中python.dockerfile-build参数

self.callback_url = self.image_request.task_data.callback_url

 在创建任务时,由客户端服务发起镜像构建时传入回调的地址。

代码修改

注,由于不同的地方,镜像名称会不断地变化,因此,这里有一部分的问题

    @staticmethod
    def is_alkaid_image(image_name):
        alkaid_prefixes = ["172.27.213", "10.101.12", "harbor.alkaidos", "10.200.88"]
        return any(item in image_name for item in alkaid_prefixes)

注,此部分代码,之后会合入到.ini配置文件,是在部署过程中发现的问题代码,即代码扩展

FastBuild所在服务器配置文件准备

程序依赖的文件

注,该过程指的是在FastBuild容器服务的宿主机上要创建相应的文件,并且与这些文件的目录与配置文件中要保持一致。文件包括tls、db、fb项

注,由于FastBuild需要准备额外的文件,这些文件包括数据库,下载的源文件,以及Python、Conda等的安装文件,并且需要正确的挂载到相应的位置:

root@iZ1pp06qu51oiqqddsrnuxZ:~# mkdir -p /mnt/nas_self-define/meizhewei/fastbuild


tls通信的文件

image-20240422152138897

使用CI工具构建镜像,并部署服务

注,该步骤用于拉取使用CI工具拉取相应分支代码

  • 并构建一个镜像,并将该镜像推送到我们的harbor(10.101.12.128)
  • 将镜像借助工具转化为helm包形式
  • 使用helm形式部署成服务

Jenkins 构建镜像

 使用的jenkins CI地址为jenkins

用户名:szfyd-algorithm
密码:szfyd@123

注,在使用jenkins的时候,仅仅需要构建,因此Push选择取消即可。

使用helm工具进行构建

 工具示意图如下:

image-20240422183528629

注,由于在启动的时候,对于几个路径一定要挂载,因此,请首先进行校验,出现了如下的问题,要进行校验:

注,关于使用helm进行部署的部分,不在本文的范围之内,需要请有关技术支持进行部署.

问题

image-20240422183644023

 经过沟通,发现是helm工具的问题,仅仅声明了volume,而没有挂载

image-20240422183739141

 因此要修改工具

image-20240422183311197 image-20240422183333255

添加方便调试的命令

注,自定义几个命令。

 可以添加FastBuild容器所在节点的/usr/bin目录下

  • fbid
#!/bin/bash

kubectl get pods | grep fast | awk -F" " '{print $1}'
  • fbcon
#!/bin/bash

kubectl exec -it $(fbid) -- bash
  • fblog
#!/bin/bash

pod_name=$(fbid)
kubectl logs ${pod_name} -f --tail=300

功能验证

Swagger验证

 在FastBuild的Swagger页面上查看,REST服务是否正常。

image-20240423163759979

平台上验证

 登录平台,因此,需要平台登录密码,

在私有仓库上添加镜像

注,以下过程建议,在用于构建镜像的Docker服务器上执行,因为其已经正确配置了Docker服务和Harbor的通信。

 首先拉取官方镜像,然后修改tag,并推送至Harbor.

docker pull ubuntu:20.04; docker pull centos:7; docker pull ubuntu:18.04
docker tag ubuntu:20.04 10.200.88.53/framework/ubuntu:20.04-official
docker tag centos:7  10.200.88.53/framework/centos:7-official
docker push 10.200.88.53/framework/centos:7-official
docker push 10.200.88.53/framework/ubuntu:20.04-official
docker tag ubuntu:18.04 10.200.88.53/framework/ubuntu:18.04-official
docker push 10.200.88.53/framework/ubuntu:18.04-official

 登录Harbor仓库验证推送是否成功。

image-20240423201045793

 将镜像重新打标签推送到新的harbor仓库

关联镜像地址

image-20240423201308100

 在镜像管理-创建镜像-关联镜像地址时,粘贴上述镜像地址

image-20240423201532454

 依次处理这三个镜像,作为我们构建镜像的基础镜像。

注,由于当前FastBuild还不支持Ubuntu22.04,因此请使用centos7,ubuntu:18.04,Ubuntu:20.04作为镜像构建的基础镜像。

 出现上述的构建记录,代表镜像构建和推送成功

image-20240423202344763

功能验证

 在资产管理-镜像管理-创建镜像-系统构建镜像页面,点击系统构建镜像,选择上述的三个基础镜像,然后根据需要选择正确的构建ingredient,

总结

 真的是吐血,这次部署花费了4个小时,真的是太痛苦了,自己也意识到了环境检测的重要性.

 首先要支持

  • TLS的是否支持
  • check环境进行有效的验证
    • check连通性
    • check密码是否存在
  • 日志还是不够

 还是很痛苦的一段过程,因为在这个过程中,需要手动执行的太多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/599592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

落地企业业财一体化的关键能力和路径

在财务数字化的改革过程中,财务部门已经通过会计电算化、ERP、财务共享,基本实现业务财务流程拉通和财务运营效率的提升,接下来面临问题是如何通过构建业财一体化体系,进一步挖掘数字利用价值,为管理决策赋能。 但在业…

LLM应用-prompt提示:让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示: mermaid 美人鱼, 是一个类似 markdown,用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具,您可以在文档中嵌入一段 mermaid 文本来生成 …

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机?手机环境怎么搭建?这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 : 步骤一:手机调试 苹果手机系统配置推荐:iPhone6S以上,16G。 注意:如果是选择购入二手手机…

Devin AI程序员是如何设计出来的

背景 Devin是一个能够执行复杂工程任务并与用户在软件开发项目上积极合作的自主人工智能软件工程师,它擅长planning、tool use、reflecting,碾压大部分初级开发。 设计思路 一、界面设计 先来看 Devin 的界面,左边是对话框,记…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

如果insightface/instantID安装失败怎么办(关于InsightFaceLoader_Zho节点的报错)

可能性有很多,但是今天帮朋友解决问题的时候又收集了一种新的思路。 首先,可以先按照这篇文章里边提到的方法去安装: 【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂_insightface如何安装-CSDN博客 其次,…

牛客周赛 Round 41 C-F

C 小红的循环移位 思路&#xff1a; 一个数是不是四的倍数&#xff0c;只用看最后两位是否能够整除4即可。 #include <bits/stdc.h>using namespace std; const int N 1e6 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3;…

IP规划案例

整个OSPF环境IP基于172.16.0.0/16划分 172.16.0.0/16 先分成2个网段&#xff08;OSPF RIP&#xff09;&#xff0c;借1位172.16.0.0/17 ---OSPF 再按区域划分&#xff08;5个区域&#xff09;&#xff0c;借3位 172.16.0.0/20 ---Area 0 三个环回 MGRE 4个网…

京东工业优选商品详情API接口:解锁高效工业采购新体验

京东工业优选的商品详情API接口&#xff0c;允许开发者通过程序化的方式&#xff0c;快速获取平台上的商品详细信息。这些详细信息包括但不限于商品名称、价格、规格、库存、图片、评价等&#xff0c;为企业提供全方位的商品信息查询服务。 二、API接口的主要功能 实时查询&a…

练习项目后端代码解析注解篇(annotation)

前言 本来想从接口处入手的&#xff0c;但是一下看到接口里几十个方法&#xff0c;眼睛有点抗拒&#xff0c;想想还是先看作者写的自定义注解吧。 项目里有三个自定义注解&#xff1a; 分别是AccessLimit注解、OperationLogger注解、VisitLogger注解 AccessLimit注解 这是一…

Python爬虫教程:入门爬取网页数据

1.遵守法律法规 爬虫在获取网页数据时&#xff0c;需要遵守以下几点&#xff0c;以确保不违反法律法规&#xff1a; 不得侵犯网站的知识产权&#xff1a;爬虫不得未经授权&#xff0c;获取和复制网站的内容&#xff0c;这包括文本、图片、音频、视频等。 不得违反网站的使用条…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器&#xff0c;实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

【C 数据结构-动态内存管理】3. 伙伴系统管理动态内存

文章目录 【 1. 伙伴系统的结构设计 】【 2. 分配算法 】【 3. 回收算法 】 伙伴系统 本身是一种动态管理内存的方法&#xff0c;和边界标识法的区别是&#xff1a;使用伙伴系统管理的存储空间&#xff0c;无论是空闲块还是占用块&#xff0c;大小都是 2 的 n 次幂&#xff08;…

AI换脸免费软件Rope中文汉化蓝宝石版本全新UI界面,修复部分已知错误【附下载地址与详细使用教程】

rope蓝宝石版&#xff1a;点击下载 注意&#xff1a;此版本支持N卡、A卡、CPU&#xff0c;且建议使用中高端显卡&#xff0c;系统要求win10及以上。 Rope-蓝宝石 更新内容&#xff1a; 0214版更新&#xff1a; ①&#xff08;已修复&#xff09;恢复到以前的模型荷载参数。有…

GDPU 天码行空11

&#xff08;一&#xff09;实验目的 1、掌握JAVA中IO中各种类及其构造方法&#xff1b; 2、重点掌握IO中类所具有的IO操作方法&#xff1b; 3、熟悉软件中登录模块的开发方法&#xff1b; 4、掌握IO中读写常用方法。 5、进一步熟悉正则规则的使用方法。 &#xff08;二&…

初期Linux

一&#xff0c;系统分为 1.1window系统 个人 &#xff1a;win7&#xff0c;win8&#xff0c;Win10&#xff0c;Win11服务器版&#xff1a;window server 2003&#xff0c;window server 2008 1.2Linux系统 centos7redhatubantukali 1.3什么是Linux&#xff1f; Linux是基…

强一致性的皇冠:分布式事务模型的至高法则揭秘

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 分布式事务模型是分布式系统设计的核心&#xff0c;关键在于保证数据一致性和事务完整性&#xff0c;尤其强调强一致性。诸如2PC、3PC、Saga、TCC等模型与协议&#xff0c;应运而生以解…

Unity初级---初识生命周期

1. Awake() &#xff1a;唤醒函数&#xff0c;最先执行的函数&#xff0c;只执行一次&#xff0c;当脚本文件挂载的对象被激活时调用 2. OnEnable() &#xff0c;OnDisable()&#xff1a;当脚本启用和禁用时触发&#xff0c;可执行多次&#xff0c;触发的前提是脚本挂载的对象…

QT开发(四) 制作一个JSON检查小工具

1、JSON概念 1.1 定义 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它易于人类阅读和编写&#xff0c;同时也易于机器解析和生成。JSON基于JavaScript语言的子集&#xff0c;但是独立于编程语言&#xff0c;因此可以被多种…

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…