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

GitOps进化:深入探讨 Argo CD 及其对持续部署的影响

什么是 GitOps?

虽然软件开发生命周期的大部分已经实现自动化,但基础设施仍然在很大程度上依赖于人工,需要专业团队的参与。随着当今基础设施需求的不断增长,实施基础设施自动化变得越来越重要。现代基础设施需要具备弹性,以便能够有效管理持续部署所需的云资源。

现代云原生应用程序的开发都兼顾了速度和规模。拥有成熟 DevOps 文化的组织每天可以将代码部署到生产环境中数百次。DevOps 团队可以通过版本控制、代码审查和 CI/CD 流水线等开发最佳实践来实现这一点,这些实践可以自动化测试和部署。

GitOps 用于自动化基础设施的配置流程,尤其是现代云基础设施。与团队使用应用程序源代码的方式类似,采用 GitOps 的运营团队使用以代码形式存储的配置文件(即基础设施即代码)。GitOps 配置文件每次部署时都会生成相同的基础设施环境,就像应用程序源代码每次构建时都会生成相同的应用程序二进制文件一样。

Argo CD是什么?

Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。

 


Argo CD 的主要功能

  • 基于 Git 的工作流:以代码形式管理基础设施和应用程序。
  • 声明式应用程序管理和同步机制。
  • 支持多个 Git 仓库和应用程序源。
  • 自动回滚和应用程序状态健康检查。


Argo CD 的架构

Argo CD 组件

  • Web 应用

    Argo CD 附带一个强大的 Web 界面,可用于管理部署在给定 Kubernetes 集群中的应用程序。

  • CLI

    Argo CD 提供了一个 CLI,用户可以使用它与 Argo CD API 交互。该 CLI 还可用于自动化和脚本编写。

  • API 服务器

    定义 Argo CD 公开的专有 API,用于支持 Web 应用和 CLI 功能。

  • 应用程序控制器

    应用程序控制器负责协调 Kubernetes 中的应用程序资源,将所需的应用程序状态(由 Git 提供)与实时状态(由 Kubernetes 提供)同步。应用程序控制器还负责协调项目资源。

  • ApplicationSet 控制器

  ApplicationSet 控制器负责协调 ApplicationSet 资源。

  • Repo 服务器

  Repo 服务器在 Argo CD 架构中扮演着重要的角色,因为它负责与 Git 存储库交互,为属于给定应用程序的所有 Kubernetes 资源生成所需的状态。

  • Redis

Argo CD 使用 Redis 提供缓存层,以减少发送到 Kube API 以及 Git 提供程序的请求。它还支持一些 UI 操作。

  • Kube API

Argo CD 控制器将连接到 Kubernetes API 以运行协调循环。

  • Git

作为 gitops 工具,Argo CD 要求在 Git 存储库中提供 Kubernetes 资源的所需状态。

我们在这里使用“git”来代表实际的 git 存储库、Helm 存储库或 OCI 工件存储库。Argo CD 支持所有这些选项。

  • Dex

Argo CD 依赖 Dex 为外部 OIDC 提供程序提供身份验证。但是,可以使用其他工具代替 Dex。

Argo CD 与 Git 仓库和 Kubernetes 集群交互的工作流程。


安装和配置

1.创建namespace 

图片

2. 使用官方的yaml文件来安装

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

3. 等待Argo CD 组件启动和运行

ninjamac@ip-192-168-1-101 ~ % kubectl get pod -n argocd
NAME                                               READY   STATUS    RESTARTS      AGE
argocd-application-controller-0                    1/1     Running   0             12m
argocd-applicationset-controller-cc68b7b7b-fvdb8   1/1     Running   0             12m
argocd-dex-server-555b55c97d-2sbsl                 1/1     Running   1 (92s ago)   12m
argocd-notifications-controller-65655df9d5-xgtw9   1/1     Running   0             12m
argocd-redis-764b74c9b9-m7qn7                      1/1     Running   0             12m
argocd-repo-server-7dcbcd967b-k9nbz                1/1     Running   0             12m
argocd-server-5b9cc8b776-rkfkv                     1/1     Running   0             12m

4.访问Argo CD API server

使用 LoadBalancer 服务公开 Argo CD API 服务器(用于外部访问)或使用端口转发进行本地访问:

kubectl port-forward svc/argocd-server -n argocd 8080:443Forwarding from 127.0.0.1:8080 -> 8080Forwarding from [::1]:8080 -> 8080

获得Argo CD 管理员密码

ninjamac@ip-192-168-1-101 kong % argocd admin initial-password -n argocd
xxxxxxxxxxxxxx

登录Argo CD

在浏览器中输入http://127.0.0.1:8080,输入用户名admin和修改后的密码。


使用 Argo CD 管理应用程序

首先,我们需要运行以下命令将当前命名空间设置为 argocd:

ninjamac@ip-192-168-1-101 argocd % kubectl config set-context --current --namespace=argocd
Context "minikube" modified.

使用以下命令创建示例guestbook应用程序: 

ninjamac@ip-192-168-1-101 argocd % argocd login 127.0.0.1:8080 --username admin --password argocd2025WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y   
'admin:login' logged in successfully
Context '127.0.0.1:8080' updated
ninjamac@ip-192-168-1-101 argocd % argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
application 'guestbook' created


将 Argo CD 与 Jenkins 流水线集成

生成token 

ninjamac@ip-192-168-1-101 argocd % curl -X POST https://localhost:8080/api/v1/session -H "Content-Type: application/json" -d '{"username": "admin", "password": "xxxxxxxx"}' -k   
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjpsb2dpbiIsImV4cCI6MTc0NTcxNjkzNCwibmJmIjoxNzQ1NjMwNTM0LCJpYXQiOjE3NDU2MzA1MzQsImp0aSI6ImU0ZDQwNjk0LTNkYTktNDBiNS1hODRmLWM1ZWU0NDJkMGQxMCJ9.OkmofUhhb7EG9TDSm_ZQNE9-HQBCYpSVKVXtN70wAJI"}

 创建jenkins file

pipeline {agent anyenvironment {ARGOCDSERVER = "https://argocd-server.example.com"ARGOCDPROJECT = "my-project"ARGOCDAPP = "my-app"K8SCONTEXT = "my-k8s-context"K8SNAMESPACE = "my-namespace"ARGOCDSYNCOPTIONS = "--sync-policy=auto --prune"}stages {stage('Deploy') {steps {script {def argocdToken = credentials('argocd-token')def appSpecFile = readFile("argocd/myapp.yaml")def argocd = new Argocd(server: ARGOCDSERVER, token: argocdToken)argocd.createApplication(appSpecFile, project: ARGOCDPROJECT)argocd.syncApplication(ARGOCDAPP, ARGOCDSYNCOPTIONS)}}}}
}

创建myapp.yaml 

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: myapp
spec:destination:server: https://kubernetes.default.svcnamespace: myappproject: defaultsource:repoURL: https://github.com/myorg/myapp.gittargetRevision: HEADpath: kubernetes/overlays/devsyncPolicy:automated:prune: trueselfHeal: truesyncOptions:- --skip-hookshelm:valueFiles:- values.yaml

创建deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: myapplabels:app: myapp
spec:replicas: 1selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myorg/myapp:latestports:- containerPort: 8080env:- name: MYAPP_ENVvalue: "prod"

创建service.yaml

apiVersion: v1
kind: Service
metadata:name: myapplabels:app: myapp
spec:selector:app: myappports:- name: httpport: 80targetPort: 8080type: LoadBalancer

  

Argo CD 与GitLab CI的集成


让我们深入了解 ArgoCD 与 GitLab CI 集成的详细步骤。

GitLab 和 ArgoCD 简化了 CI/CD 工作流程,支持无缝部署到 Kubernetes 集群。


配置 GitLab CI/CD 流水线


设置您的 GitLab CI 流水线,通过 ArgoCD 触​​发部署。

在您的 git 仓库根目录中创建 .gitlab-ci.yaml 文件

stages:- build- deployvariables:# Set your Docker image name to nginxIMAGE_NAME: nginxIMAGE_TAG: latest# Define your AWS ECR repository URLECR_REPOSITORY: your-account-id.dkr.ecr.your-region.amazonaws.com/nginx

# Define your Kubernetes context for EKSKUBE_CONTEXT: dev-eks-clusterAWS_ACCESS_KEY_ID: $DEV_AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY: $DEV_AWS_SECRET_ACCESS_KEYbuild:stage: buildScript:- apk add --no-cache aws-cli  - aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID} --profile default- aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY} --profile default- echo "Building the Nginx Docker image"- docker build -t $IMAGE_NAME:$IMAGE_TAG .- echo "Logging in to AWS ECR..."- aws ecr get-login-password --region your-region | docker login --username AWS --password-stdin $ECR_REPOSITORY- echo "Tagging Docker image for ECR..."- docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPOSITORY:$IMAGE_TAG- echo "Pushing Docker image to ECR..."- docker push $ECR_REPOSITORY:$IMAGE_TAGonly:- devdeploy:stage: deployScript:- apk add --no-cache aws-cli  - aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID} --profile default- aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY} --profile default- echo "Deploying to Kubernetes"- echo "Setting Kubernetes context to $KUBE_CONTEXT"- kubectl config use-context $KUBE_CONTEXT  # Switch to the specified Kubernetes context- kubectl apply -f k8s/deployment.yamlonly:- dev


上述流水线包含一个构建阶段和一个部署阶段,部署阶段将在构建成功后触发 Kubernetes 部署。

设置 ArgoCD 以跟踪您的 GitLab 代码库


现在,配置 ArgoCD 以监控 Git 代码库的更改并自动部署更新。

创建 ArgoCD 应用程序 YAML:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: gitlab-appnamespace: argocd
spec:project: defaultsource:repoURL: 'https://gitlab.com/repo-name.git'path: 'k8s'targetRevision: developerdestination:server: 'https://kubernetes.default.svc'namespace: argocdsyncPolicy:automated:prune: trueselfHeal: true


现在,使用以下命令应用上述文件:

Kubectl apply -f gitlab-argo.yaml -nargocd


此配置指示 ArgoCD 跟踪 GitLab 代码库中的更改并将更新部署到 Kubernetes 集群中。

触发 GitLab CI 流水线


将更改推送到 GitLab 中的开发者分支,.gitlab-ci.yml 中定义的流水线将触发:

  1. 构建阶段:执行测试或构建 Docker 镜像并将其推送到 aws ecr 代码库。
  2. 部署阶段:推送配置更改,这些更改将由 ArgoCD 同步并自动应用到您的 Kubernetes 集群。

您可以在 ArgoCD 用户界面中监控部署进度,从而可以直观地了解应用程序的状态。

将 GitLab CI 的灵活性与 ArgoCD 的强大功能相结合,您的 Kubernetes 工作流程将焕然一新。


监控和可观察性

应用控制器


ArgoCD 中的应用控制器负责管理和协调应用程序的预期状态。监控应用控制器时,您可以收集和分析以下指标和信息:

  • 应用同步状态:您可以监控应用程序的同步状态,包括它们是否为最新版本或是否遇到同步错误。
  • 资源健康状况:监控应用程序内资源(例如 Pod、服务)的健康状况,以检测崩溃或资源过度使用等问题。
  • 应用部署历史记录:跟踪应用程序部署和回滚的历史记录,以识别趋势和异常。
  • 性能指标:收集与应用控制器的资源消耗和响应时间相关的性能指标。
  • 错误和事件日志:收集应用控制器生成的日志和事件,以诊断和解决问题。


ArgoCD 服务器


ArgoCD 服务器是核心组件,它提供基于 Web 的用户界面和 API,用于管理应用程序和 GitOps 工作流。监控 ArgoCD 服务器时,您可以捕获以下信息:

  • API 请求指标:监控 ArgoCD REST API 的使用情况和性能,包括请求数量、响应时间和错误率。
  • 用户身份验证和授权:跟踪用户登录、身份验证失败和访问控制事件,以确保安全性和合规性。
  • 资源使用情况:监控服务器资源利用率(CPU、内存),以检测性能瓶颈和扩展需求。
  • 应用程序活动:收集有关应用程序 CRUD(创建、读取、更新、删除)操作和部署的信息。
  • 仪表板指标:如果 ArgoCD 提供基于 Web 的仪表板,您可以监控仪表板的使用情况、用户交互和导航模式。

代码库服务器


ArgoCD 中的代码库服务器负责与 Git 代码库交互,以获取应用程序清单并同步应用程序状态。监控代码库服务器时,您可以收集以下数据:

  • Git 代码库同步:监控 Git 代码库同步的状态,包括同步错误和代码库获取时间。
  • 资源缓存:跟踪 Git 仓库资源的缓存,这有助于减少频繁获取数据的需求,从而优化性能。
  • 身份验证和访问:监控 Git 仓库的身份验证和访问控制,以确保对 Git 仓库的安全访问。
  • 资源完整性:验证 Git 仓库数据的完整性,并识别任何损坏或不一致问题。
  • 资源使用情况:监控仓库服务器的资源利用率,例如 CPU 和内存消耗。


在本文中,我将仅指导如何通过应用程序控制器和 ArgoCD 服务器公开指标,并使用其 CRD 在 Prometheus 端收集这些指标。

ArgoCD 服务器指标 (8083)


编辑 argocd-server svc 文件 (kubectl edit svc argocd-server -n argocd)
如果 argocd-server svc 文件中不存在该端口,请在 spec.ports 下添加指标端点端口,目标端口为 8083

编辑 argocd-server 部署文件 (kubectl edit deploy argocd-server -n argocd)
在 argocd-server 部署文件的 spec.template.annotations 下添加以下内容:

在 argocd-server 部署文件的 spec.template.spec.containers.args 下添加以下内容:

在 ports.containerPort 下,根据需要将端口更改为 8083
完成上述所有步骤后,您可以验证指标是否在 8083 端口公开。
操作方法:kubectl port-forward -n argocd svc/argocd-server 8083
检查 localhost:8083/metrics 是否可用。

验证成功后,可以在 Prometheus 端设置服务监视器,以便在该端点查找指标。
argocd-server 指标的 ServiceMonitor:

SVC 名称应准确指定,例如:argocd-server

ServiceMonitor 配置成功后,它应该以如下方式在 Prometheus 用户界面中可见。

应用程序控制器指标 (8082)


在本例中,Argocd-application-controller 是一个 StatefulSet。我们可以通过以下命令检查 StatefulSet 配置:kubectl edit statefulset <name> -n <namespace>

在 spec.template.metadata.annotations 下添加:

值得注意的是,在服务监视器或 Pod 监视器的 matchLabels 下,必须准确指定标签,否则可能导致 CRD 配置错误。
实际上,指定的名称应该与选择器下相关 Pod 或服务中的键值对匹配。如下图所示。

完成这些步骤后,我们可以运行以下命令进行端口转发,以便在 8082 端口收集指标:kubectl port-forward -n argocd pod/argocd-application-controller-0 8082
与 argocd-server 类似,可以通过检查 localhost:8082/metrics 端点来验证指标是否从 argocd 公开。

将指标获取到 Prometheus

由于应用程序控制器指标通过 statefulSet 公开,因此必须创建一个 PodMonitor。如果为此目的创建了 servicemonitor,argocd-application-controller 将不会被列为活动目标之一,因此标签会被丢弃,从而导致 servicemonitor 中 matchLabels 下提到的标签无法匹配。因此,必须实现 podmonitor。

成功配置 PodMonitor 后,它应该会以这样的方式显示在 Prometheus 界面中。

终于!您可以通过 Prometheus 查看指标了 


使用 Argo CD 的最佳实践

1. 拥抱 GitOps 原则

Argo CD 的核心是一款 GitOps 工具。为了有效地使用它,您应该完全拥抱 GitOps 原则:

使用 Git 作为单一事实来源:所有应用程序清单、配置文件和环境状态都应驻留在受版本控制的 Git 仓库中。这种方法可确保您的 Kubernetes 集群始终反映 Git 中定义的状态,从而提高一致性和可追溯性。
使用 Git 提交自动同步:配置 Argo CD 以自动将应用程序状态与 Git 提交同步。此设置可确保推送到仓库的任何更改都能快速一致地反映在您的 Kubernetes 集群中。


2. 合理组织仓库和清单


合理组织仓库和清单对于可维护性和可扩展性至关重要:

使用多仓库方法:对于较大的组织或项目,可以考虑将清单拆分到多个仓库中——一个用于应用程序清单,一个用于特定于环境的配置,另一个用于共享资源。这种结构使权限管理、关注点分离和维护清晰的历史记录更加容易。
利用 Helm Charts 或 Kustomize:使用 Helm 或 Kustomize 管理您的 Kubernetes 清单。这些工具提供的模板功能可以减少重复,简化配置管理,并更轻松地处理应用程序的多个环境或版本。

3. 正确配置 Argo CD 应用程序


Argo CD 使用“应用程序”来表示部署。正确的配置是关键:

使用声明式应用程序定义:在 Git 代码库中以声明式方式定义您的 Argo CD 应用程序。这种做法使您能够将应用程序作为代码进行管理、版本控制更改并强制一致性。
设置适当的同步策略:配置同步策略以匹配您的部署策略。对于持续部署到非生产环境,请使用“自动同步”,对于可能需要人工审批的生产部署,请使用“手动同步”。


4. 实施强大的安全实践


在管理大规模部署时,安全性至关重要。以下是一些关键实践:

使用 RBAC 进行访问控制:在 Argo CD 中实施基于角色的访问控制 (RBAC),以限制对关键操作的访问。为不同的团队定义角色,并确保只有授权用户才有权部署或修改应用程序。
启用单点登录 (SSO) 和外部身份验证:将 Argo CD 与外部身份验证提供程序(例如 OAuth、SAML 或 LDAP)集成,以启用单点登录 (SSO)。此设置简化了用户管理,增强了安全性,并符合组织标准。
监控访问日志和审计跟踪:定期监控 Argo CD 访问日志和审计跟踪,以跟踪用户活动。这些日志对于检测未经授权的访问或配置更改以及满足合规性要求至关重要。


5. 优化应用程序健康和同步设置


Argo CD 提供健康检查和同步选项,以确保应用程序保持理想状态:

定义自定义健康检查:使用自定义健康检查来验证除默认 Kubernetes 探测之外的应用程序健康状况。这可能包括对应用程序功能至关重要的特定服务、端点或业务逻辑的检查。
启用资源修剪:Argo CD 允许您修剪 Git 代码库中不再定义的资源。此功能有助于防止配置漂移,并确保您的集群始终与所需状态同步。
利用同步:使用同步波来控制资源同步的顺序。当您需要确保某些资源(例如 ConfigMap 或 Secret)先于其他资源(例如 Deployment)创建时,此做法尤为有用。


Argo CD 监控和可观察性最佳实践


1. 启用详细指标和警报
监控对于维护应用程序的健康和性能至关重要。Argo CD 提供了多种内置监控功能:

启用 Prometheus 指标:配置 Argo CD 以将指标公开给 Prometheus。此集成允许您跟踪各种指标,例如同步操作的数量、同步时长和应用程序健康状况。
为关键事件设置警报:使用 Prometheus Alertmanager 或 Grafana Alerts 等警报工具,为关键事件(例如同步失败、应用程序降级或漂移检测)创建通知。警报可帮助您快速响应事件并保持高可用性。

2. 有效利用 Argo CD 仪表板
Argo CD 仪表板提供应用程序及其状态的实时视图:

监控应用程序的健康状况和状态:定期检查仪表板了解应用程序的状态,包括同步状态、健康检查和错误消息。仪表板提供可视化概览,帮助您快速识别和解决问题。
使用事件日志进行故障排除:Argo CD 的事件日志会捕获与应用程序相关的所有同步操作、错误和事件。利用此日志来解决问题、了解根本原因并实施纠正措施。
3. 与外部可观察性工具集成
虽然 Argo CD 提供了基本的监控功能,但与外部可观察性工具集成可以增强可见性:

使用 Grafana 进行高级可视化:设置 Grafana 以可视化从 Argo CD 收集的 Prometheus 指标。创建自定义仪表板来监控部署的性能、健康状况和状态。
与集中式日志系统集成:将 Argo CD 日志转发到 Elasticsearch、Loki 或 Fluentd 等集中式日志解决方案。此集成支持高级日志分析、搜索以及与其他基础架构组件的关联。
4. 实施 GitOps 监控工具
GitOps 监控工具提供用于观察和管理 GitOps 工作流的专用功能:

使用 Argo CD 通知:配置 Argo CD 通知,以便直接在 Slack、Microsoft Teams 或电子邮件等工具中接收警报和通知。此集成可帮助团队实时了解部署事件和应用程序状态。
利用 Flux 或 Weave GitOps 等工具:将 Argo CD 与其他 GitOps 工具(例如 Flux 或 Weave GitOps)结合使用,以扩展跨多个集群或环境的监控和可观察性功能。


优化 Argo CD 性能的技巧


扩展 Argo CD 以实现高可用性:以高可用性模式部署 Argo CD,每个组件(例如 API 服务器、控制器和存储库服务器)均有多个副本,以处理大规模部署并确保冗余。
调整资源限制和请求:为 Argo CD 组件定义适当的资源请求和限制,以确保最佳性能,避免资源争用。定期监控资源使用情况,并根据工作负载调整限制。
使用缓存存储库实现更快同步:在 Argo CD 中启用存储库缓存以加快同步操作速度,尤其适用于大型存储库或包含多个应用程序的环境。缓存可减少从 Git 获取清单并将其应用于集群所需的时间。
定期清理旧应用程序和资源:从 Argo CD 和 Git 存储库中删除未使用的应用程序、资源和清单。此清理操作可减少混乱,最大限度地降低资源消耗,并确保精简高效的部署环境。


结论

通过遵循这些最佳实践和技巧,您可以充分利用 Argo CD 的强大功能,在 Kubernetes 环境中实现无缝的应用程序部署和监控。从拥抱 GitOps 原则、优化部署配置到增强可观察性和安全性,Argo CD 提供了一套全面的功能,可简化您的持续交付工作流程。

相关文章:

GitOps进化:深入探讨 Argo CD 及其对持续部署的影响

什么是 GitOps&#xff1f; 虽然软件开发生命周期的大部分已经实现自动化&#xff0c;但基础设施仍然在很大程度上依赖于人工&#xff0c;需要专业团队的参与。随着当今基础设施需求的不断增长&#xff0c;实施基础设施自动化变得越来越重要。现代基础设施需要具备弹性&#x…...

有源晶振与无源晶振详解:区别、应用与选型指南

一、基本定义 无源晶振&#xff08;Crystal&#xff0c;晶体谐振器&#xff09; 结构&#xff1a;仅包含石英晶体&#xff0c;无内置振荡电路。 工作原理&#xff1a;依赖外部电路&#xff08;如MCU的振荡器&#xff09;驱动&#xff0c;通过机械振动产生谐振频率。 核心公式…...

机器学习:逻辑回归实现二元分类

本例子以鸡蛋受精卵为例,假设未受精的鸡蛋在某个区域聚集,受精的在另一个区域。比如,用正态分布生成两个类别的数据,均值不同,方差相同或不同。例如,未受精的鸡蛋的特征均值为[1,1],受精的为[4,4],这样两类数据点可以在二维空间中被分开。 首先,生成数据。使用sklear…...

Android学习总结之kotlin篇(一)

1. open 关键字的用法和作用深入源码分析 类的 open 修饰&#xff1a;在 Kotlin 字节码层面&#xff0c;对于一个open类&#xff0c;编译器会在生成的字节码中添加ACC_SUPER和ACC_OPEN标志。例如&#xff0c;定义一个open class TestOpenClass&#xff0c;反编译其字节码可以看…...

arcgis空间分析理论研究

arcgis的空间分析功能有&#xff08;1&#xff09;地形与地表分析&#xff1b;&#xff08;2&#xff09;距离与成本分析&#xff1b;&#xff08;3&#xff09;密度分析&#xff1b;&#xff08;4&#xff09;水文分析&#xff1b;&#xff08;5&#xff09;统计分析&#xff…...

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬到楼顶。…...

Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类&#xff08;稠密矩阵&#xff09; 模板参数 cpp Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> Scalar: 元素类型&#xff08;如 float, double, int&#xff09;。 Rows/Cols: 行数和列数&#xff08;Dynamic 表示动态大小&#xff09;。 O…...

立创EDA

空格键&#xff1a;旋转 alt w : 布线 alt v : 放置过孔 shift x &#xff1a;先在原理图中框选&#xff0c;按下shiftx&#xff0c;批量选中pcd中的对应元件 shift h : 选中的网络持续高亮/取消高亮 更改位号&#xff1a;举例 框选要更改的电阻 右侧栏属性 --> 位号…...

计算机网络笔记(十二)——2.5数字传输系统

数字传输系统是光纤通信中实现高速数据传输的核心技术&#xff0c;解决了传统模拟传输的速率不统一、同步性差等问题。 一、早期数字传输的问题 速率标准不统一&#xff1a;北美&#xff08;T1: 1.544Mbps&#xff09;和欧洲&#xff08;E1: 2.048Mbps&#xff09;采用不同的…...

[FPGA Video IP] Video Processing Subsystem

Xilinx Video Processing Subsystem IP (PG231) 详细介绍 概述 Xilinx LogiCORE™ IP Video Processing Subsystem (VPSS)&#xff08;PG231&#xff09;是一个高度可配置的视频处理模块&#xff0c;设计用于在单一 IP 核中集成多种视频处理功能&#xff0c;包括缩放&#xf…...

java基础之枚举和注解

枚举 简介 枚举&#xff1a;enumeration&#xff0c;jdk1.5中引入的新特性&#xff0c;用于管理和使用常量 入门案例 第一步&#xff1a;定义枚举&#xff0c;这里定义一个动物类&#xff0c;里面枚举了多种动物 public enum AnimalEnum {CAT, // 猫DOG, // 狗PIG // …...

前端开发本地配置 HTTPS 全面详细教程

分为两步&#xff1a;生成证书、本地服务配置使用证书一、HTTPS 的基本概念 HTTPS 是一种安全的 HTTP 协议&#xff0c;它通过 SSL/TLS 对数据进行加密&#xff0c;确保数据在传输过程中不被窃取或篡改。在前端开发中&#xff0c;某些功能&#xff08;如 Geolocation API、Web…...

C语言中宏的高级应用

一、宏的核心高级特性 1. 变参宏&#xff08;Variadic Macros&#xff09; 支持不定数量参数&#xff0c;用于灵活处理格式化字符串、日志输出等场景。 #include <stdio.h>// 定义支持可变参数的调试宏 #define DEBUG_LOG(format, ...) \printf("[DEBUG] %s:%d |…...

Simulink 数据字典(Data Dictionary)详解:使用场景、存储内容与调用方法

1. 引言 在 Simulink 建模中&#xff0c;随着模型复杂度增加&#xff0c;参数管理变得尤为重要。传统方法&#xff08;如 MATLAB 工作区变量或脚本&#xff09;在团队协作或大型项目中容易导致数据分散、版本混乱。数据字典&#xff08;Data Dictionary&#xff09; 提供了一种…...

部署yolo到k230教程

训练&#xff1a;K230 借助 AICube部署AI 视觉模型 YOLO等教程_嘉楠 ai cube多标签分类-CSDN博客K230模型训练ai cube报错生成部署文件异常_aicube部署模型显示生成部署文件异常-CSDN博客 部署&#xff1a; # 导入必要的库和模块 import os import ujson # 超快的JS…...

【高频考点精讲】第三方库安全审计:如何避免引入带漏洞的npm包

大家好,我是全栈老李。今天咱们聊一个前端工程师必须掌握的生存技能——如何避免把带漏洞的npm包引入项目。这可不是危言耸听,去年某大厂就因为在生产环境用了有漏洞的lodash版本,被黑客利用原型污染漏洞直接攻破后台系统。 为什么npm包会变成"定时炸弹"? npm生…...

【后端】主从单体数据库故障自动切换,容灾与高可用

在现代企业级应用中,数据库的高可用性和容灾能力是保障业务连续性的关键。尤其是在一些对稳定性要求较高的业务场景中,当主数据库发生故障时,如何快速切换到备用数据库并确保业务不受影响,成为了一个重要课题。本文将介绍一种基于 SpringBoot 和 Druid 数据源的解决方案,通…...

AI编程案例拆解|基于机器学习XX评分系统-后端篇

文章目录 5. 数据集生成使用KIMI生成数据集 6. 后端部分设计使用DeepSeek生成神经网络算法设计初始化项目在Cursor中生成并提问前后端交互运行后端命令 注意事项 关注不迷路&#xff0c;励志拆解100个AI编程、AI智能体的落地应用案例为了用户的隐私性&#xff0c;关键信息会全部…...

数据库设置外键的作用

数据库外键&#xff08;Foreign Key&#xff09;是关系型数据库中用于建立表与表之间关联关系的重要约束&#xff0c;其核心作用是确保数据的一致性、完整性和关联性。以下是外键的主要作用及相关说明&#xff1a; 1. 建立表间关联关系 外键通过引用另一张表的主键&#xff0…...

从基础到实战的量化交易全流程学习:1.1 量化交易本质与行业生态

从基础到实战的量化交易全流程学习&#xff1a;1.1 量化交易本质与行业生态 在金融市场数字化转型的浪潮中&#xff0c;量化交易凭借数据驱动的科学性与自动化执行的高效性&#xff0c;成为连接金融理论与技术实践的核心领域。本文作为系列开篇&#xff0c;将从本质解析、行业生…...

路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid

拓扑图 &#xff08;1&#xff09;通过 LSW1 交换机配置 GVRP 协议同步 VLAN 信息到所有接入层设备。 基于 GARP 机制&#xff1a;GVRP 是通用属性注册协议 GARP&#xff08;Generic Attribute Registration Protocol&#xff09;的一种应用&#xff0c;用于注册和注销 VLAN 属…...

重定向和语言级缓冲区【Linux操作系统】

文章目录 重定向重定向的原理重定向系统调用接口进程替换不会影响重定向bash命令行中输入&#xff0c;输出&#xff0c;追加重定向的区别输出重定向输入重定向追加重定向命令行中只支持向文件描述符为0&#xff0c;1&#xff0c;2的标准流进行>&#xff0c;>>&#xf…...

Channel如何安全地尝试发送数据

在 Go 语言中&#xff0c;无法直接检查 channel 是否关闭&#xff08;没有类似 IsClosed(ch) 的方法&#xff09;&#xff0c;但可以通过 非阻塞发送 或 select 语句 安全地尝试发送数据&#xff0c;避免向已关闭的 channel 发送数据导致 panic。以下是具体实现方式&#xff1a…...

MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点

MH21xx和MH22xx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接 口&#xff0c;包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。 ● JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。 ● 串行调试接口(SW-DP)为AHP-AP模块提供2针(时钟&#xff0…...

Tortoise-ORM级联查询与预加载性能优化

title: Tortoise-ORM级联查询与预加载性能优化 date: 2025/04/26 12:25:42 updated: 2025/04/26 12:25:42 author: cmdragon excerpt: Tortoise-ORM通过异步方式实现级联查询与预加载机制,显著提升API性能。模型关联关系基础中,定义一对多关系如作者与文章。级联查询通过s…...

【C++11】列表初始化

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲C11引入的列表初始化{}&#xff0c;注意这不是构造函数里的初始化列表&#xff01;&#xff01;&#xff01; 在阅读文章之前&#xff0c;请你记住一句重点&#xff1a;万物皆可{}初始化 &#x1f3ac;个人简介&#xff1a;努…...

基于Cherry Studio + DeepSeek 搭建本地私有知识库!

在当今数字化时代&#xff0c;知识管理变得越来越重要。无论是个人还是企业&#xff0c;都希望能够高效地存储、管理和检索知识。而借助 AI 技术&#xff0c;我们可以实现更加智能的知识库系统。本文将详细介绍如何使用 Cherry Studio 和 DeepSeek 搭建本地私有知识库&#xff…...

栈相关算法题解题思路与代码实现分享

目录 前言 一、最小栈&#xff08;LeetCode 155&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 二、栈的压入、弹出序列&#xff08;剑指 Offer JZ31&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 总结…...

MongoDB Atlas与MongoDB连接MCP服务器的区别解析

MongoDB Atlas作为全托管的云数据库服务&#xff0c;与本地自建MongoDB实例在连接MCP&#xff08;Model Context Protocol&#xff09;服务器时存在显著差异。以下从配置方式、安全机制、功能特性三个维度对比两者的区别&#xff1a; 连接配置差异 • 本地MongoDB&#xff1a;…...

服务器传输数据存储数据建议 传输慢的原因

一、JSON存储的局限性 1. 性能瓶颈 全量读写&#xff1a;JSON文件通常需要整体加载到内存中才能操作&#xff0c;当数据量大时&#xff08;如几百MB&#xff09;&#xff0c;I/O延迟和内存占用会显著增加。 无索引机制&#xff1a;查找数据需要遍历所有条目&#xff08;时间复…...

【大模型】Coze AI 智能体工作流从配置到使用实战详解

目录 一、前言 二、工作流介绍 2.1 什么是工作流 2.2 工作流与对话流 2.2.1 两者区别 2.3 工作流节点介绍 2.3.1 工作流节点说明 2.3.2 开始节点与结束节点 2.4 工作流入口 2.4.1 自定义智能体入口 2.4.2 从资源库新增工作流 2.5 工作流使用限制 三、工作流配置与使…...

Java后端开发——分层解耦详解

文章目录 一、三层架构1.1 概述1.2 具体实现方法 二、分层解耦2.1 以往问题2.2 概念解释2.3 解耦思路 三、Spring核心&#xff1a;IOC & DI3.1 快速入门3.2 IOC&#xff08;控制反转&#xff09;详解3.3 DI&#xff08;依赖注入&#xff09;详解 注入方式 标签&#xff1a;…...

论文如何降低AIGC?(完整指南版)

最近一段时间&#xff0c;关于论文AIGC率太高怎么办的问题&#xff0c;真的是知乎、小红书、B站到处都是&#xff01; 尤其是今年知网一升级&#xff0c;连纯手写的内容都能给你标疑似AIGC&#xff0c;简直离谱啊兄弟姐妹们&#x1f62d;&#xff01; 那论文到底怎么降低AIGC…...

【LCMM】纵向轨迹模型,组轨迹模型

latent_class_mixed_models 基础知识 增长混合模型&#xff08;GMM&#xff09;和潜在类别增长模型&#xff08;LCGA&#xff09;的核心区别确实主要在于是否允许类别内存在随机效应&#xff0c;但两者的差异还涉及模型灵活性、假设和应用场景等方面。以下是详细对比&#xf…...

Flask + ajax上传文件(三)--图片上传与OCR识别

本教程将详细介绍如何使用Flask框架构建一个图片上传与文字识别(OCR)的Web应用。我们将使用EasyOCR作为OCR引擎,实现一个支持中文和英文识别的完整应用。 环境准备 首先,确保你已经安装了Python 3.7+环境,然后安装必要的依赖库: pip install flask easyocr pillow werkz…...

观察者模式 (Observer Pattern)

观察者模式(Observer Pattern)是一种行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己的状态。 一、基础 1. 意图 核心目的:定义对象间的一种一对…...

【Leetcode 每日一题】2444. 统计定界子数组的数目

问题背景 给你一个整数数组 n u m s nums nums 和两个整数 m i n K minK minK 以及 m a x K maxK maxK。 n u m s nums nums的定界子数组是满足下述条件的一个子数组&#xff1a; 子数组中的 最小值 等于 m i n K minK minK。子数组中的 最大值 等于 m a x K maxK maxK…...

LeetCode热题100——70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&#xff1a; …...

黑马Java基础笔记-4

方法 什么是方法 方法是程序中最小的执行单元。 形参和实参 调用 直接调用 getSum(10,20,30);赋值调用 int sum getSum(10,20,30);输出调用 System.out.println(getSum(10,20,30));方法的重载 在同一个类中&#xff0c;定义了多个同名的方法&#xff0c;这些同名的方法…...

【Python】Python中的浅拷贝和深拷贝

在Python中&#xff0c;浅拷贝&#xff08;shallow copy&#xff09;和深拷贝&#xff08;deep copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在复制对象时的行为有所不同&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是创建一个新对象&…...

使用 LangGraph 和 Elasticsearch 构建强大的 RAG 工作流

作者&#xff1a;来自 Elastic Neha Saini 在这篇博客中&#xff0c;我们将向你展示如何配置和自定义 LangGraph Retrieval Agent 模板与 Elasticsearch&#xff0c;以构建一个强大的 RAG 工作流&#xff0c;实现高效的数据检索和由 AI 驱动的响应。 Elasticsearch 原生集成了…...

云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)

1、Docker基本概念 &#xff08;1&#xff09;、定义 Docker是一种开源的应用容器引擎&#xff0c;是基于操作系统级虚拟化技术。允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后发布到任何支持Docker的环境中运行。Docker容器是轻量级、独立且可执…...

智慧园区IOT项目与AI时代下的机遇 - Java架构师面试实战

在互联网大厂的Java求职者面试中&#xff0c;面试官通常会针对实际业务场景提出一系列问题。以下是关于智慧园区IOT项目及AI时代下的机遇的面试模拟对话。 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简要介绍下智慧园区IOT项目的整体架构设计。 马架构&#xff1a;…...

Unity中文件上传以及下载,获取下载文件大小的解决方案

首先现在Unity插件那么的广泛的情况下,很多东西都不需要自己实现,直接使用第三方插件就可以了,但为什么这里需要自己写,接下来说明原因。 在Unity商城中有很多关于关于网络接口调用的插件,其中有一款叫BestHTTP这款使用比较广泛的插件,不知道朋友们是不是都知道,是不是…...

Word/WPS 删除最后一页空白页,且保持前面布局样式不变

如题&#xff0c;试了多种方法&#xff0c;都不行。主要是可能的原因太多了&#xff0c;没有通解&#xff0c;这只是适用于我的情况。 解决方案&#xff1a; 首先光标放在倒数第二页&#xff08;即想保留的最后一页&#xff09;&#xff0c;点击页面右下角这个小箭头&#xff…...

MySQL长事务的隐患:深入剖析与解决方案

MySQL长事务的隐患&#xff1a;深入剖析与解决方案 一、什么是长事务&#xff1f; 在数据库系统中&#xff0c;长事务(Long Transaction)通常指执行时间超过预期或系统设定阈值的事务。对于MySQL而言&#xff0c;虽然没有严格的时间定义&#xff0c;但一般认为执行时间超过数…...

【Tauri】桌面程序exe开发 - Tauri+Vue开发Windows应用 - 比Electron更轻量!8MB!

效果图 Tauri的二进制文件体积显著小于Electron&#xff0c;安装包通常缩小80%以上。应用启动更快&#xff0c;内存占用更低&#xff0c;尤其在老旧设备上体验更流畅。 写在前面 Tauri官网 https://tauri.app/zh-cn/支持语言&#xff1a;js、ts、rust、.net编译出来的exe文件&…...

2025春季NC:3.1TheTrapeziumRule

3.1TheTrapeziumRule 📐 The Idea Instead of finding the exact area under a curve y = f ( x ) y = f(x) y=...

【摩尔定律】

一、摩尔定律的核心定义​​ ​​原始表述&#xff08;1965年&#xff09;​​ “集成电路上可容纳的晶体管数量&#xff0c;每隔约 ​​18-24个月​​ 便会增加一倍&#xff0c;同时性能提升一倍&#xff0c;而成本下降一半。” ​​简化理解​​ 芯片的 ​​晶体管密度​​ 和…...

Maven 依赖冲突调解与版本控制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...