解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署
前言
GitOps 是实现持续部署的云原生方式。它的名字来源于标准且占主导地位的版本控制系统 Git。GitOps 的 Git 在某种程度上类似于 Kubernetes 的 etcd,但更进一步,因为 etcd 本身不保存版本历史记录。毋庸置疑,任何源代码管理服务,包括 GitLab、GitHub、Bitbucket、Azure DevOps 或类似的服务,都可以使用。在 GitOps 中,VCS 是单一事实来源。
作为开发人员,我们以声明式的方式实现基础设施定义、数据库模式、应用程序配置和策略,然后将代码推送到 Git 仓库。运维人员获取所需状态并将其应用到我们的控制平面。这个控制平面主要是一个 Kubernetes 控制平面。GitOps 是一个伴随云原生生态系统而出现和发展的术语。因此,所有 GitOps 提供商都与 Kubernetes 集成。Kubernetes 正在发展成为统领所有其他控制平面的唯一控制平面。在接下来的文章中,我会详细讨论这个术语。
OpenGitOps
我们从 OpenGitOps 社区开始讨论GitOps 。OpenGitOps 旨在标准化 GitOps 原则,定义并帮助采用 GitOps 的最佳实践。OpenGitOps 同时也是 CNCF 的沙盒级项目。它由七个成员创立:亚马逊、Azure、Github、RedHat、CodeFresh、WeaveWorks 和 Crayon。可以说,这些成员是对 GitOps 生态系统贡献最大的公司之一。OpenGitOps 社区定义了四个主要的 GitOps 原则:
- 由 GitOps 管理的系统必须以声明式的方式表达其期望状态:声明式状态是近年来基础设施即代码 (IaC) 工具的标志之一。声明式意味着描述要实现的目标,而不是命令要做什么。举个例子,“我希望两台服务器运行”是声明式的,但“运行两台服务器”是命令式的。当你重复这两个句子时,第一个句子会导致两台服务器运行,而第二个句子会导致四台服务器运行。声明式语句天生具有幂等性,这在 IaC 领域至关重要。
- 所需状态的存储方式强制执行不变性、版本控制并保留完整的版本历史记录:不变性、版本控制和完整的版本历史记录表明需要使用版本控制系统,因为 VCS 上保存的配置默认是版本控制的。它只能通过提交、推送和/或拉取请求进行更改。这保证了所需级别的不变性,并且所有更改都可以追溯并在需要时回滚。
- 软件代理自动从源头拉取所需状态声明:在传统的 CI/CD 方法中,容器镜像被构建并推送到容器注册表。资源定义文件(原始清单、Helm Charts、Kustomize 文件)使用镜像标签进行修改。之后,使用 helm、kubectl 将它们推送到集群。这需要将服务帐户令牌存储在集群外部并用于应用更改。因此,密码必须安全地保存在 CI/CD 管道中。与此不同,GitOps 工具提供了基于拉取的方法,这意味着 GitOps 操作员在集群中运行并定期从 git 存储库拉取配置更改,或订阅 git 存储库事件并等待触发更改。检测到更改后,操作员通过调用 kubeapi 将其应用到集群。这更安全、更自然。
- 软件代理持续观察实际系统状态并尝试应用所需状态:GitOps 操作员从 git 存储库拉取更改,并定期将所需状态与集群状态进行比较。这称为漂移检测。任何更改都会应用于集群。任何人对其管理的资源所做的手动更改都将被还原。这称为协调。Git 拉取请求是更改正在运行的集群状态的唯一方法。这有助于将容器级别的不变性扩展到基础设施级别,从而避免许多问题。
GitOps 的爆炸式增长
早在2017 年,Weaveworks公司(是一家由 Alexis Richardson 联合创立的公司)就发表关于 GitOps 的文章,强调了我们如今使用的很多原则,例如一切皆代码、所有期望状态必须以声明式定义、自动偏差检测等等。在这篇文章之后,又陆续发表了另外三篇文章。正如文章中提到的,它们也使用了自动协调功能。Weaveworks 引入了 GitOps 的概念,将 Git、Kubernetes 和持续交付 (CD) 融合成一个统一的运维模型。
Weaveworks 积极参与开源社区,组织活动、参加会议并参与 GitOps 相关的讨论。这种社区建设工作有助于促进整个生态系统的协作和知识共享。
Weaveworks 提出Ansiblediff、Terradiff 和 Kubediff 作业,用于检测 Kubernetes 集群上的漂移,并自动协调提交给 Git 的各种资源定义的所需状态提出检测偏差(集群的实际状态与 Git 中定义的期望状态存在偏差)。
我们可以将 WeaveWorks 所做的工作视为持续交付最佳实践与我们环境中实际应用情况之间的偏差检测。他们将我们的持续交付生态系统与这些最佳实践进行了协调。我们可以说,那些文章中提到的很多内容在当时也是共识,但将它们全部用到我们今天使用的名称上,并以 git 作为主题,才是 GitOps 的真正意义所在。
GitOps 工具
从那时起,GitOps 的原则基本保持不变,但涌现出了许多不同的工具。在包括科技巨头在内的开源社区的大力贡献下,标准化逐渐成型。
GitOps 领域出现了两个最重要的工具:Argo CD 和 Flux。在撰写本文时,它们都是 CNCF 孵化级项目,并且都提供了许多强大的功能和辅助工具。GitOps 仅解决了 CI/CD 中的持续部署部分,因此我们需要来自不同产品的其他部分。这些其他部分包括渐进式交付工具(蓝绿部署、金丝雀部署)、持续集成工具、镜像控制器(等待新镜像推送并更新资源定义)等等。
Argo 项目家族包括工作流(持续集成)、事件(事件驱动的工作流自动化)、部署(渐进式交付)工具,除了 CD 工具之外,它还包含许多辅助工具。另一方面,Flux 项目家族除了 Flux 本身之外,还包含 Flagger 作为渐进式交付工具,并且在 GitOps Toolkit 框架下拥有许多辅助工具。当我们比较持续交付 (CD) 工具时,这两个项目都是非常出色的项目;如果我们将这种比较扩展到其他工具,Argo 家族似乎更加完整,因为 Argo Workflows(任何持续交付 (CI) 工具都可以与 Argo CD 或 Flux 配合使用)。它还有一个仪表板,虽然对大多数人来说意义不大,但在某些情况下确实很有帮助。如果您已经掌握了其他可观察性和可视化工具,则无需再添加太多仪表板。
还有一些 GitOps 工具,它们不如这两个工具成熟,但确实很有前景。Rancher Fleet 就是其中之一。他们秉持“规模化 GitOps”的理念,并致力于管理集群 Fleet,就像 Rancher 多年来一直在尝试的那样。但我们必须承认,如果没有 GitOps,这一切都不可能实现。你也可以使用 Argo CD 和 Flux 来管理集群。
GitOps 项目的数量呈爆炸式增长。除了我们熟悉的项目之外,还有 PipeCD、Werf、Atlantis 等等。
Argo CD 和 Flux 已经成为许多企业级 PAAS 服务的基石。例如,Azure Arc 和 WeaveCloud(不出所料)使用了 Flux,Openshift GitOps 和 Codefresh 使用了 Argo CD。
Flux 演示
要遵循本指南,您需要以下资源:
- 一个 Kubernetes 集群。。
- 一个具有代码库权限的 GitHub 个人访问令牌。请参阅 GitHub 文档,了解如何创建个人访问令牌。
- Flux CLI
导出您的凭据
导出您的 GitHub 个人访问令牌和用户名:
export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>
验证kubernetes 集群
ninjamac@ninjamacdeMacBook-Air fluxcd % flux check --pre
► checking prerequisites
✔ Kubernetes 1.32.2 >=1.30.0-0
✔ prerequisites checks passed
在集群中安装flux
ninjamac@ninjamacdeMacBook-Air fluxcd % flux bootstrap github \ --owner=$GITHUB_USER \ --repository=fluxcd \--branch=main \--path=. \ --personal
将 podinfo 仓库添加到 Flux
本示例使用公共仓库 github.com/stefanprodan/podinfo,podinfo 是一个用 Go 语言编写的小型 Web 应用程序。
创建一个指向 podinfo 仓库 master 分支的 GitRepository 清单:
flux create source git podinfo \--url=https://github.com/stefanprodan/podinfo \--branch=master \--interval=1m \--export > ./podinfo-source.yaml
提交并将 podinfo-source.yaml 文件推送到 fluxcd仓库:
git add -A && git commit -m "Add podinfo GitRepository"
git push origin main
部署 podinfo 应用
配置 Flux 以构建并应用位于 podinfo 仓库中的 kustomize 目录。
使用 flux create 命令创建应用 podinfo 部署的 Kustomization。
flux create kustomization podinfo \--target-namespace=default \--source=podinfo \--path="./kustomize" \--prune=true \--wait=true \--interval=30m \--retry-interval=2m \--health-check-timeout=3m \--export > ./podinfo-kustomization.yaml
提交 Kustomization 清单并将其推送到代码库:
git add -A && git commit -m "Add podinfo Kustomization"
git push origin main
监控 Flux 同步应用程序
使用 flux get 命令监控 podinfo 应用程序。
使用kubectl get 命令检查pod service 等信息:
对主分支中 podinfo Kubernetes 清单所做的更改会反映在您的集群中。
当从 podinfo 仓库中移除 Kubernetes 清单时,Flux 会将其从您的集群中移除。当您从 fluxcd 仓库中删除 Kustomization 时,Flux 会移除之前从该 Kustomization 应用的所有 Kubernetes 对象。
当您使用 kubectl edit 修改 podinfo 部署时,更改会还原到与 Git 中描述的状态一致。
暂停更新
暂停 Kustomization 的更新允许您直接编辑从 Kustomization 应用的对象,而不会根据 Git 中的状态还原您的更改。
要暂停 Kustomization 的更新,请运行命令 flux suspend kustomization <name>。
要恢复更新,请运行命令 flux resume kustomization <name>。
自定义 podinfo 部署
要从您无法控制的仓库自定义部署,您可以使用 Flux 内联补丁。以下示例展示了如何使用内联补丁更改 podinfo 部署。
将以下内容添加到 podinfo-kustomization.yaml 文件的字段规范中:
patches:- patch: |-apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: podinfospec:minReplicas: 3 target:name: podinfokind: HorizontalPodAutoscaler
提交并推送 podinfo-kustomization.yaml 的更改:
git add -A && git commit -m "Increase podinfo minimum replicas"
git push origin main
同步完成后,运行 kubectl get pods 应该会显示 3 个 pod。
总结
对于任何新技术,我们都必须思考的几个问题之一是它解决了哪些问题。之前的工具遗漏了什么?GitOps 工具带来了哪些新特性?
在 GitOps 工具出现之前,声明式期望状态就已经被使用。正如我们提到的,这是 GitOps 出现之前现代 IaC 工具的标志之一。声明式期望状态也应用于 Kubernetes 本身。可以说,GitOps 工具已经很好地采用了这种做法。
在 GitOps 工具出现之前,使用版本控制来存储期望状态也是一种常见的范例,但 GitOps 通过强制使用版本控制系统 (VCS) 将这种方法更进一步。其他工具可以从开发人员的机器上应用期望状态。使用 GitOps 时,必须将更改推送到远程 Git 存储库才能进行部署。
GitOps 为 IaC 生态系统带来的另一个新特性是从 Git 存储库中提取期望状态,而不是使用 CD 工具进行推送。这带来了一种新的安全强化方式。
我们可以毫不夸张地说,GitOps 工具带来的最大改进是持续的漂移检测和协调。这显然是真正的游戏规则改变者。通过此功能,我们可以构建不可变的基础设施并消除人为错误。如今,甚至有一些工具将此功能引入了 Terraform 领域。Flux Terraform Provider(实验性)和 Crossplane Terrajet Providers(在某种程度上,因为它们使用 Terraform Providers 生成 Kubernetes CRD)就是其中两个。
正如那句名言所说,没有灵丹妙药。每种技术都有其优缺点。我们在前面的段落中已经提到了 GitOps 的优点。多年来,凭借围绕云原生生态系统聚集的庞大社区,GitOps 工具已经解决了许多问题。大多数问题在早期的 GitOps 工具中都存在,但随着时间的推移,这些问题逐渐演变。现在是采用 GitOps 的好时机。列举一些目前相对存在的问题,大型云供应商提供的 PaaS 产品并不多(我们可以在这里列举 Anthos Config Management 和 Azure Arc),我们需要一个 Kubernetes 集群来应用 GitOps(对包括我在内的大多数社区成员来说这不是问题),Git 提供了回滚机制来回滚更改,但 git 有不同的回滚命令,因此必须谨慎处理,GitOps 和水平 Pod 自动伸缩器的协同工作也是另一个需要仔细思考的点。 GitOps 也不支持不同环境之间的传播,必须使用另一个 CI/CD 工具来处理。
相关文章:
解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署
前言 GitOps 是实现持续部署的云原生方式。它的名字来源于标准且占主导地位的版本控制系统 Git。GitOps 的 Git 在某种程度上类似于 Kubernetes 的 etcd,但更进一步,因为 etcd 本身不保存版本历史记录。毋庸置疑,任何源代码管理服务…...
【从零实现JsonRpc框架#1】Json库介绍
1.JsonCpp第三方库 JSONCPP 是一个开源的 C 库,用于解析和生成 JSON(JavaScript Object Notation)数据。它提供了简单易用的接口,支持 JSON 的序列化和反序列化操作,适用于处理配置文件、网络通信数据等场景。 2.Jso…...
使用FastAPI和React以及MongoDB构建全栈Web应用02 前言
Who this book is for 本书适合哪些人阅读 This book is designed for web developers who aspire to build robust, scalable, and efficient web applications. It caters to a broad spectrum of developers, from those with foundational knowledge to experienced prof…...
JavaScript中的数据类型
目录 前言 基本类型 Number 特殊的数值NaN Infinity和-Infinity String Boolean Undefined null Symbol Undefined和Null的区别 引用类型 Object(对象) Array(数组) Function(函数) 函数声…...
AI 助力,轻松进行双语学术论文翻译!
在科技日新月异的今天,学术交流中的语言障碍仍然是科研工作者面临的一大挑战。尤其是对于需要查阅大量外文文献的学生、科研人员和学者来说,如何高效地理解和翻译复杂的学术论文成为了一大难题。然而,由Byaidu团队推出的开源项目PDFMathTrans…...
第3.2.3节 Android动态调用链路的获取
3.2.3 Android App动态调用链路 在Android应用中,动态调用链路指的是应用在运行时的调用路径。这通常涉及到方法调用的顺序和调用关系,特别是在应用的复杂逻辑中,理解这些调用链路对于调试和性能优化非常重要。 1,动态调用链路获…...
【Android】文件分块上传尝试
【Android】文件分块上传 在完成一个项目时,遇到了需要上传长视频的场景,尽管可以手动限制视频清晰度和视频的码率帧率,但仍然避免不了视频大小过大的问题,且由于服务器原因,网络不太稳定。这个时候想到了可以将文件分…...
大模型中的三角位置编码实现
Transformer中嵌入表示 位置编码的实现 import torch import math from torch import nn# 词嵌入位置编码实现 class EmbeddingWithPosition(nn.Module):"""vocab_size:词表大小emb_size: 词向量维度seq_max_len: 句子最大长度 (人为设定,例如GPT2…...
深入详解人工智能数学基础——微积分中的自动微分及其在PyTorch中的实现原理
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
【Linux学习笔记】系统文件IO之重定向原理分析
【Linux学习笔记】系统文件IO之重定向原理分析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】系统文件IO之重定向原理分析前言一. 系统文件I/01.1 一种传递标志位的方法1.2 hello.c写文件:1.3 he…...
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
React Native与Flutter作为两款备受瞩目的跨平台开发框架,正深刻地影响着应用的构建方式。当聚焦于用户行为分析与埋点统计时,它们各自展现出独特的策略与工具选择,这些差异和共性不仅关乎开发效率,更与社交应用能否精准把握用户需…...
Cesium高度参考系统
🌍 Cesium高度参考系统趣味探索 🚀 高度参考系统形象比喻 想象一下,你正在玩一个积木游戏: CLAMP_TO_GROUND:积木被"强力胶水"粘在桌面上,无论桌面高低起伏如何 RELATIVE_TO_GROUND:积木放在"微型支架"上,始终保持离桌面固定距离 NONE:积木漂…...
海纳思(Hi3798MV300)机顶盒遇到海思摄像头
海纳思机顶盒遇到海思摄像头,正好家里有个海思Hi3516的摄像头模组开发板,结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口,确保网络正常通信。 …...
[python] 类
一 介绍 具有相同属性和行为的事物的通称,是一个抽象的概念 三要素: 类名,属性,方法 格式: class 类名: 代码块 class Pepole:name "stitchcool"def getname(self):return self.name 1.1 创建对象(实例化) 格式: 对象名 类名() p1 Pepole()…...
Python中的事件循环是什么?事件是怎么个事件?循环是怎么个循环
在Python异步编程中,事件循环(Event Loop)是核心机制,它通过单线程实现高效的任务调度和I/O并发处理。本文将从事件的定义、循环的运行逻辑以及具体实现原理三个维度展开分析。 一、事件循环的本质:协程与任务的调度器…...
单片机-STM32部分:11、ADC
飞书文档https://x509p6c8to.feishu.cn/wiki/OclUwlkifiRKR2k6iLbczn5tn8g STM32的ADC是一种逐次逼近型模拟数字转换器。 是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 逐次逼近型ADC的原理图下: STM32f103系列有3个ADC,精度为12…...
【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现
项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...
Laravel 安全:批量赋值 fillable 与 guarded
Laravel 的模型中有两个 protected 字段 fillable 与 guarded,注意:必须是 protected 以上开放程度。 我们经常通过提交表单进行数据的增删改,为了方便的进行数据批量修改操作 Laravel 提供了批量赋值机制: 假如我们想要在数据库…...
[杂谈随感-13]: 人的睡眠,如何布置床的位置比较有安全?感?
睡眠环境中的床位布置直接影响心理安全感与睡眠质量,需从空间防御性、人体感知机制及环境心理学多维度综合设计。 以下基于科学原理与实践案例,系统解析床位布置的核心策略: 一、空间防御性布局:构建心理安全边界 背靠实体墙&a…...
协议路由与路由协议
协议路由”和“路由协议”听起来相似,但其实是两个完全不同的网络概念。下面我来分别解释: 一、协议路由(Policy-Based Routing,PBR) ✅ 定义: 协议路由是指 根据预设策略(策略路由࿰…...
内网穿透系列三:开源本地服务公网映射工具 tunnelmole
以下是对 tunnelmole 简要介绍: tunnelmole 是一款开源的内网穿透工具,一行命令就能把本地http服务映射成公网可访问的链接提供公共免费的网络服务,直接下载运行命令即可使用,也支持自行配置搭建私有客户端、服务端参考开源地址&…...
发行基础:本地化BUG导致审核失败
1、早上收到邮件,Steam客服说本地化功能找不到,无法切换多国语言,所以正式版V1.0程序未通过。 大脑瞬间有要爆炸的感觉,测试后发现V1以及demo都存在同样问题。 属于重大BUG,需要立即解决,最高优先级。 2、…...
QB/T 1649-2024 聚苯乙烯泡沫塑料包装材料检测
聚苯乙烯泡沫塑料包装材料是指以可发行聚苯乙烯珠粒为原料,经加热预发泡后在模具中加热成型而制得,具有闭孔结构的聚苯乙烯泡沫塑料包装材料。 QB/T 1649-2024聚苯乙烯泡沫塑料包装材料检测项目: 测试项目 测试标准 外观 QB/T 1649 气味…...
【Day 24】HarmonyOS端云一体化开发:云函数
一、端云开发核心架构 1. 技术栈对比 维度传统开发模式HarmonyOS端云一体化方案优势 开发工具需独立配置前后端环境DevEco Studio统一开发端云代码降低60%环境搭建时间部署流程手动部署服务器与数据库一键部署至AGC Serverless免运维,自动弹性伸缩通信安全需自行实…...
大模型(LLMs)强化学习——RLHF及其变种
大模型(LLMs)强化学习——RLHF及其变种面 一、介绍一下 LLM的经典预训练Pipeline?二、预训练(Pre-training)篇 具体介绍一下 预训练(Pre-training)?三、有监督微调(Sup…...
20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题
1、h3-eflasher-friendlycore-jammy-4.14-armhf-20250402.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区,可以使用SD Card Formatter/SDCardFormatterv5…...
WinCC V7.2到V8.0与S71200/1500系列连接通讯教程以及避坑点
声明:WinCC与PLC连接详细指导与注意避坑点,部分图片和描述来源于网络,如有冒犯,请联系本人删除。 1.环境介绍 自WinCC V7.2版本起,软件新增加了 "SIMATIC S7-1200, S7-1500 Channel"通道,用于WinCC与 S7-1…...
WPF 性能 UI 虚拟化 软件开发人员的思考
UI 虚拟化是 WPF 采用的一项技术,框架会仅创建用户可见的 UI 元素。例如,如果 ListView 中有 1000 个文本块控件,但您只能查看其中的 10 个,那么 VisualTree 中也只会显示 10 个文本块。向下滚动时,不再可见的元素将被…...
服务器综合实验(实战详解)
该文章的目录部分 实验内容 实验完成步骤 虚拟机准备 配置两个虚拟机的本地仓库 虚拟机A: 虚拟机B: 配置SSH公钥互信 虚拟机A: 编辑 虚拟机B: 提供基于bind的DNS服务 虚拟机A: 项目需求1: …...
【动态导通电阻】软硬开关下GaN器件的动态RDSON
2019年,浙江大学的Rui Li、Xinke Wu等人基于双脉冲和多脉冲测试方法,研究了在硬开关和软开关条件下商用氮化镓(GaN)功率器件的动态导通电阻(R DSON )特性。实验结果表明,不同GaN器件在硬开关和软开关条件下的动态R DSON 表现出不同的行为,这些行为受关断电压和频率的影…...
Java基础 5.10
1.方法重写课堂练习 package com.logic.override_; //编写一个Person类 包括属性/private(name, age) 构造器 方法say(返回自我介绍的字符串) //编写一个Student类 继承Person类 增加id score 属性/private 以及构造器 //定义say方法(返回自我介绍的信息) //在main中 分别创建…...
通信原理绪论
(I)信息量:第j条消息中包含的信息定义为:I(j) 消息是信息的表现形式 消息是信息的一种抽象和本质内容 消息中所含的信息量是该消息出现概率的函数,即 I I[P(x)] P(x)越小,I越…...
Maven 插件配置分层架构深度解析
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
jMeter压测环境部署JDK+Groovy+JMeter+Proto+IntelliJ IDEA
为确保 Groovy、JDK 和 JMeter 三者的版本兼容性,需遵循以下核心原则和步骤: 一、版本兼容性对照表 组件推荐版本范围关键兼容规则JDKJava 8/11/17 (LTS)- JMeter 5.6 支持 Java 11/17GroovyGroovy 3.0.7 或 4.0- Groovy 3.x 支持 Java 8-17 - Groovy 4…...
c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录。 # 财务管理系统功能描述 1.可以自行设置记账科目,做凭…...
深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
一、典型故障现象与用户痛点 在高并发业务场景中,企业级 Spring Boot 应用常遇到以下连锁故障: 用户侧:网页访问超时、提交表单无响应,报错 “服务不可用”。运维侧:监控平台报警 “数据库连接池耗尽”,To…...
一种运动平台扫描雷达超分辨成像视场选择方法——论文阅读
一种运动平台扫描雷达超分辨成像视场选择方法 1. 专利的研究目标与意义1.1 研究目标1.2 实际意义2. 专利的创新方法与技术细节2.1 核心思路与流程2.1.1 方法流程图2.2 关键公式与模型2.2.1 回波卷积模型2.2.2 最大后验概率(MAP)估计2.2.3 统计约束模型2.2.4 迭代优化公式2.3 …...
【程序员AI入门:开发】11.从零构建智能问答引擎:LangChain + RAG 实战手册
1、技术选型 组件推荐方案说明文本嵌入模型sentence-transformers/all-MiniLM-L6-v2轻量级且效果较好的开源模型向量数据库FAISS高效的本地向量检索库大语言模型GPT-3.5/开源LLM(如ChatGLM3)根据资源选择云端或本地模型文档处理框架LangChain简化RAG流程…...
《深入理解Linux网络》笔记
《深入理解Linux网络》笔记 前言参考 前言 前段时间看了《深入理解Linux网络》这本书,虽然有些地方有以代码充篇幅的嫌疑,但总体来说还是值得一看的。在这里简单记录一下笔记,记录下对网络新的理解。 内核是如果接受网络包的? 如…...
【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术
优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…...
致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】
A8适用于中大型企业,基于"以人为中心"的产品理念,致力于为企业构建和完善“数字智能”的协同运营体系,以组织模型为基础,连接各项工作和业务,聚合信息、资源和能力,实现组织内和跨组织的高效协同…...
terminal 共享工具ttyd
ttyd 是一个非常轻量的工具,它可以将你的终端(如 bash)通过 Web 页面共享出去,适合教学、演示、远程协作等场景,而且 支持 macOS、ARM64、Linux 等平台。 ⸻ ✅ 一、ttyd 简介 • 将 shell 包装成 WebSocket 服务&am…...
右值引用的剖析
引入:为什么要有右值引用? 右值引用的存在,就是为了解决左值引用解决不了的问题! 左值引用的问题: 我们知道,左值引用在做参数和做返回值都可以提高效率;但是有时候,我们无法用左…...
MIT XV6 - 1.4 Lab: Xv6 and Unix utilities - find
接上文 MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes find 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution…...
PyTorch API 8 - 工具集、onnx、option、复数、DDP、量化、分布式 RPC、NeMo
文章目录 torch.nn.inittorch.nn.attention工具集子模块 torch.onnx概述基于 TorchDynamo 的 ONNX 导出器基于TorchScript的ONNX导出器贡献与开发 torch.optim如何使用优化器构建优化器每个参数的选项执行优化步骤optimizer.step()optimizer.step(closure) 基类算法如何调整学习…...
解决使用宝塔Linux部署前后端分离项目遇到的问题
问题一:访问域名转圈圈,显示404,403 没有解决跨域问题,在后端yml中设置content:/prod(生产环境),在前端.env文件中将http://127.0.0.1:8080/替换为公网IP,并在vite.conf…...
力扣top100 矩阵置零
开辟数组来标记元素为0的行和列,然后将对应的行和列的元素全部置为0; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …...
JavaScript基础-作用域概述
在学习JavaScript的过程中,理解其作用域(Scope)机制是至关重要的。它不仅影响变量的生命周期和可见性,还决定了代码执行期间如何查找变量值。本文将深入探讨JavaScript的作用域概念,包括全局作用域、函数作用域、块级作…...
【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施
【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施 问题现象定位过程问题根因解决方案将内核内核从6.8.0-60 降级到5.15.0-140。1、回滚内核版本2、解决重启系统,找不到选择内核版本的菜单问题3、将新版本的kernel卸…...
MQTT协议介绍
一、MQTT定义 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议ÿ…...