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

实践 DevOps 项目:使用 Terraform、Helm、SonarQube 和 GitLab CI/CD 在 AWS EKS 上实践全栈部署

在当今快节奏的软件开发领域,自动化至关重要。在本文中,我将向您展示如何构建一个全面的 DevOps 流水线,该流水线能够:

  • 使用 Terraform 预置完整的 AWS 基础设施。
  • 部署一个包含私有子网和公共子网、RDS PostgreSQL 以及完整配置的网络堆栈的 EKS 集群。
  • 通过 Helm 安装关键的 Kubernetes 组件,包括 cert-manager(集成 Let’s Encrypt)、ingress-nginx、ArgoCD 和 SonarQube。
  • 使用 GitLab CI/CD 流水线自动化基础设施和应用程序工作流。

让我们开始吧!

架构概览


我们的解决方案包含以下几个层级:

1. 基础设施配置:
我们将使用 Terraform 模块创建:

  • 一个包含公有/私有子网、路由表、NAT 网关、IGW 和 EIP 的 VPC。
  • 一个包含工作节点的 EKS 集群(使用成熟的 Terraform 模块)。
  • 一个用于持久存储的 RDS PostgreSQL 实例。
  • Route53 中的 DNS 管理,用于证书验证。

2. 通过 Helm 进行 Kubernetes 部署:

集群运行后,我们将部署:

  • cert-manager(已为 Let’s Encrypt 配置 ClusterIssuer)用于管理 TLS 证书。
  • ingress-nginx 作为我们的入口控制器。
  • ArgoCD 用于基于 GitOps 的持续交付。
  • SonarQube 用于静态代码分析。

3. 使用 GitLab 的 CI/CD 流水线:
我们设置了两个 GitLab 流水线:

  • 一个用于管理 Terraform 代码(初始化、验证、规划和应用)。
  • 另一个用于构建、测试(通过 SonarQube)和部署应用程序(从 new-app)。

1. 使用 Terraform 预配 AWS 基础设施


我们将首先创建一个模块化的 Terraform 项目。以下是简化的项目结构:

.
├── modules
│   ├── vpc
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   ├── eks
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   └── rds
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
├── helm
│   ├── ingress-nginx-values.yaml
│   ├── argocd-values.yaml
│   ├── sonarqube-values.yaml
│   └── cert-manager-values.yaml
├── main.tf
├── variables.tf
├── outputs.tf
└── providers.tf

provider.tf

我们配置 AWS 以及 Kubernetes 和 Helm 提供程序。请注意,Kubernetes 提供程序使用来自我们 EKS 模块的输出:

// providers.tf
provider "aws" {region = var.aws_region
}
provider "kubernetes" {host                   = module.eks.cluster_endpointcluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)token                  = data.aws_eks_cluster_auth.cluster.token
}
provider "helm" {kubernetes {host                   = module.eks.cluster_endpointcluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)token                  = data.aws_eks_cluster_auth.cluster.token}
}
data "aws_eks_cluster_auth" "cluster" {name = module.eks.cluster_name
}

Variables.tf


定义 AWS、VPC、EKS 和 RDS 配置的变量:

// variables.tf
variable "aws_region" {description = "AWS region for resources"type        = stringdefault     = "us-west-2"
}
variable "vpc_cidr" {description = "CIDR block for the VPC"type        = stringdefault     = "10.0.0.0/16"
}
variable "public_subnet_cidrs" {description = "List of public subnet CIDRs"type        = list(string)default     = ["10.0.1.0/24", "10.0.2.0/24"]
}
variable "private_subnet_cidrs" {description = "List of private subnet CIDRs"type        = list(string)default     = ["10.0.101.0/24", "10.0.102.0/24"]
}
variable "availability_zones" {description = "List of availability zones to use"type        = list(string)default     = ["us-west-2a", "us-west-2b"]
}
variable "cluster_name" {description = "EKS Cluster name"type        = stringdefault     = "my-eks-cluster"
}
variable "db_username" {description = "RDS PostgreSQL username"type        = string
}
variable "db_password" {description = "RDS PostgreSQL password"type        = stringsensitive   = true
}
variable "db_name" {description = "RDS PostgreSQL database name"type        = stringdefault     = "mydatabase"
}

main.tf (Root Module)

在我们的根模块中,我们调用子模块并定义 Helm 部署:

// main.tf
terraform {required_version = ">= 1.0.0"required_providers {aws = {source  = "hashicorp/aws"version = "~> 4.0"}kubernetes = {source  = "hashicorp/kubernetes"version = "~> 2.0"}helm = {source  = "hashicorp/helm"version = "~> 2.0"}}
}
// VPC Module
module "vpc" {source               = "./modules/vpc"vpc_cidr             = var.vpc_cidrpublic_subnet_cidrs  = var.public_subnet_cidrsprivate_subnet_cidrs = var.private_subnet_cidrsavailability_zones   = var.availability_zonesaws_region           = var.aws_region
}
// EKS Module (using a well-known module from the Terraform Registry)
module "eks" {source          = "terraform-aws-modules/eks/aws"version         = ">= 18.0.0"cluster_name    = var.cluster_namecluster_version = "1.24"subnets         = module.vpc.private_subnet_idsvpc_id          = module.vpc.vpc_idnode_groups = {default = {desired_capacity = 2max_capacity     = 3min_capacity     = 1instance_type    = "t3.medium"subnets          = module.vpc.private_subnet_ids}}
}
// RDS Module for PostgreSQL
module "rds" {source             = "./modules/rds"vpc_id             = module.vpc.vpc_idprivate_subnet_ids = module.vpc.private_subnet_idsdb_username        = var.db_usernamedb_password        = var.db_passworddb_name            = var.db_nameaws_region         = var.aws_region
}
// Deploy cert-manager via Helm
resource "helm_release" "cert_manager" {name       = "cert-manager"repository = "https://charts.jetstack.io"chart      = "cert-manager"version    = "v1.9.1"namespace  = "cert-manager"create_namespace = trueset {name  = "installCRDs"value = "true"}
}
// Create a ClusterIssuer for Let's Encrypt (for automatic TLS certs)
resource "kubernetes_manifest" "letsencrypt_clusterissuer" {manifest = {"apiVersion" = "cert-manager.io/v1""kind"       = "ClusterIssuer""metadata" = {"name" = "letsencrypt-prod"}"spec" = {"acme" = {"email"         = "your-email@example.com"  // Replace with your email"server"        = "https://acme-v02.api.letsencrypt.org/directory""privateKeySecretRef" = {"name" = "letsencrypt-prod"}"solvers" = [{"dns01" = {"route53" = {"region" = var.aws_region// Optionally, you can specify hosted zone details here.}}}]}}}depends_on = [helm_release.cert_manager]
}
// Deploy ingress-nginx via Helm
resource "helm_release" "ingress_nginx" {name       = "ingress-nginx"repository = "https://kubernetes.github.io/ingress-nginx"chart      = "ingress-nginx"version    = "4.7.0"namespace  = "ingress-nginx"create_namespace = truevalues = [file("${path.module}/helm/ingress-nginx-values.yaml")]
}
// Deploy SonarQube via Helm
resource "helm_release" "sonarqube" {name       = "sonarqube"repository = "https://SonarSource.github.io/helm-chart-sonarqube"chart      = "sonarqube"version    = "9.6.0"namespace  = "sonarqube"create_namespace = truevalues = [file("${path.module}/helm/sonarqube-values.yaml")]
}
// Deploy ArgoCD via Helm with ingress exposure
resource "helm_release" "argocd" {name       = "argocd"repository = "https://argoproj.github.io/argo-helm"chart      = "argo-cd"version    = "4.10.2"namespace  = "argocd"create_namespace = truevalues = [file("${path.module}/helm/argocd-values.yaml")]
}

2. Terraform Modules

VPC Module

此模块创建您的 VPC、子网、NAT 网关、IGW 和相关路由表。
modules/vpc/main.tf:

resource "aws_vpc" "this" {cidr_block           = var.vpc_cidrenable_dns_support   = trueenable_dns_hostnames = truetags = {Name = "terraform-vpc"}
}
resource "aws_internet_gateway" "this" {vpc_id = aws_vpc.this.idtags = {Name = "terraform-igw"}
}
resource "aws_subnet" "public" {count                   = length(var.public_subnet_cidrs)vpc_id                  = aws_vpc.this.idcidr_block              = var.public_subnet_cidrs[count.index]availability_zone       = element(var.availability_zones, count.index)map_public_ip_on_launch = truetags = {Name = "terraform-public-${count.index}"}
}
resource "aws_subnet" "private" {count                   = length(var.private_subnet_cidrs)vpc_id                  = aws_vpc.this.idcidr_block              = var.private_subnet_cidrs[count.index]availability_zone       = element(var.availability_zones, count.index)map_public_ip_on_launch = falsetags = {Name = "terraform-private-${count.index}"}
}
// NAT Gateway resources (using the first public subnet)
resource "aws_eip" "nat" {vpc = true
}
resource "aws_nat_gateway" "this" {allocation_id = aws_eip.nat.idsubnet_id     = aws_subnet.public[0].idtags = {Name = "terraform-nat"}
}
// Public route table
resource "aws_route_table" "public" {vpc_id = aws_vpc.this.idroute {cidr_block = "0.0.0.0/0"gateway_id = aws_internet_gateway.this.id}tags = {Name = "terraform-public-rt"}
}
resource "aws_route_table_association" "public" {count          = length(aws_subnet.public)subnet_id      = aws_subnet.public[count.index].idroute_table_id = aws_route_table.public.id
}
// Private route table (using NAT Gateway)
resource "aws_route_table" "private" {vpc_id = aws_vpc.this.idroute {cidr_block     = "0.0.0.0/0"nat_gateway_id = aws_nat_gateway.this.id}tags = {Name = "terraform-private-rt"}
}
resource "aws_route_table_association" "private" {count          = length(aws_subnet.private)subnet_id      = aws_subnet.private[count.index].idroute_table_id = aws_route_table.private.id
}

modules/vpc/variables.tf:

variable "vpc_cidr" {description = "VPC CIDR block"type        = string
}
variable "public_subnet_cidrs" {description = "List of public subnet CIDRs"type        = list(string)
}
variable "private_subnet_cidrs" {description = "List of private subnet CIDRs"type        = list(string)
}
variable "availability_zones" {description = "List of availability zones"type        = list(string)
}
variable "aws_region" {description = "AWS region"type        = string
}

modules/vpc/outputs.tf:

output "vpc_id" {value = aws_vpc.this.id
}
output "public_subnet_ids" {value = aws_subnet.public[*].id
}
output "private_subnet_ids" {value = aws_subnet.private[*].id
}

EKS Module

我们利用了流行的 Terraform EKS 模块。您可以按所示方式包装它,也可以直接在根模块中调用它。

modules/eks/main.tf:

module "eks" {source          = "terraform-aws-modules/eks/aws"version         = ">= 18.0.0"cluster_name    = var.cluster_namecluster_version = var.cluster_versionsubnets         = var.subnetsvpc_id          = var.vpc_idnode_groups = var.node_groupstags = {Environment = "dev"}
}

modules/eks/variables.tf:

output "cluster_name" {value = module.eks.cluster_name
}
output "cluster_endpoint" {value = module.eks.cluster_endpoint
}
output "cluster_certificate_authority_data" {value = module.eks.cluster_certificate_authority_data
}

RDS Module

该模块在私有子网中配置一个 RDS PostgreSQL 实例。

modules/rds/main.tf:

resource "aws_db_subnet_group" "this" {name       = "${var.db_name}-subnet-group"subnet_ids = var.private_subnet_idstags = {Name = "${var.db_name}-subnet-group"}
}
resource "aws_db_instance" "this" {allocated_storage       = 20engine                  = "postgres"engine_version          = "13.7"instance_class          = "db.t3.micro"name                    = var.db_nameusername                = var.db_usernamepassword                = var.db_passworddb_subnet_group_name    = aws_db_subnet_group.this.namevpc_security_group_ids  = var.db_security_group_idsskip_final_snapshot     = truepublicly_accessible     = falsetags = {Name = "${var.db_name}-rds"}
}

modules/rds/variables.tf:

variable "vpc_id" {type = string
}
variable "private_subnet_ids" {type = list(string)
}
variable "db_username" {type = string
}
variable "db_password" {type      = stringsensitive = true
}
variable "db_name" {type = string
}
variable "db_security_group_ids" {description = "List of security group IDs for the DB instance"type        = list(string)default     = []
}

modules/rds/outputs.tf:

output "rds_endpoint" {value = aws_db_instance.this.endpoint
}

3. Helm Deployments in EKS

我们的 Helm 部署管理着 Kubernetes 资源。以下值文件(位于 helm/ 目录中)可自定义我们的安装。

ingress-nginx-values.yaml

controller:service:annotations:service.beta.kubernetes.io/aws-load-balancer-type: "nlb"admissionWebhooks:enabled: true

argocd-values.yaml

server:ingress:enabled: trueingressClassName: "nginx"hosts:- argocd.example.com  # Replace with your domainannotations:kubernetes.io/ingress.class: "nginx"cert-manager.io/cluster-issuer: "letsencrypt-prod"

sonarqube-values.yaml

service:type: ClusterIP
ingress:enabled: trueingressClassName: "nginx"hosts:- sonarqube.example.com  # Replace with your domainannotations:kubernetes.io/ingress.class: "nginx"cert-manager.io/cluster-issuer: "letsencrypt-prod"

cert-manager-values.yaml

如果您需要对 cert-manager 进行进一步的自定义,可以在此处添加。我们的 Helm 版本已通过设置 installCRDs=true 启用 CRD。

4. GitLab CI/CD Pipelines

我们现在设置了两个管道——一个用于 Terraform 代码,另一个用于应用程序。这种分离使基础设施变更和应用程序部署保持独立。

Terraform Pipeline (.gitlab-ci.terraform.yml)

# .gitlab-ci.terraform.yml
image: hashicorp/terraform:latest
stages:- init- validate- plan- apply
variables:TF_ROOT: "./terraform"TF_IN_AUTOMATION: "true"AWS_DEFAULT_REGION: "us-west-2"
before_script:- cd $TF_ROOT- terraform --version
terraform_init:stage: initscript:- terraform initartifacts:paths:- .terraform/expire_in: 1 hour
terraform_validate:stage: validatescript:- terraform validate
terraform_plan:stage: planscript:- terraform plan -out=tfplanartifacts:paths:- tfplanexpire_in: 1 hour
terraform_apply:stage: applywhen: manualscript:- terraform apply -auto-approve tfplan

Application Pipeline (.gitlab-ci.app.yml)

该管道验证 YAML 文件、为您的应用程序构建 Docker 映像、运行 SonarQube 分析并部署到 Kubernetes:

# .gitlab-ci.app.yml
stages:- validate- build- test- deploy
# Validate YAML files
yaml_lint:stage: validateimage: cytopia/yamllint:latestscript:- yamllint .only:- merge_requests- master
# Build Docker image
build_app:stage: buildimage: docker:latestservices:- docker:dindvariables:DOCKER_DRIVER: overlay2script:- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY- docker build -t $CI_REGISTRY_IMAGE:new-app .- docker push $CI_REGISTRY_IMAGE:new-apponly:- merge_requests- master
# SonarQube analysis
sonarqube_scan:stage: testimage: sonarsource/sonar-scanner-cli:latestscript:- sonar-scanner \-Dsonar.projectKey=new-app \-Dsonar.sources=. \-Dsonar.host.url=$SONAR_HOST_URL \-Dsonar.login=$SONAR_TOKENonly:- merge_requests- master
# Deploy to Kubernetes
deploy_app:stage: deployimage: bitnami/kubectl:latestscript:- kubectl apply -f k8s/only:- masterenvironment:name: productionurl: http://your-app-domain.example.com

5. 最终步骤与执行


1. Terraform 工作流:
初始化:terraform init
验证:terraform validate
计划:terraform plan -out=tfplan
应用(手动批准):terraform apply -auto-approve tfplan
2. Helm 部署:
EKS 集群准备就绪后,Helm 提供程序将部署 cert-manager(使用 ClusterIssuer 为 Let’s Encrypt 提供程序)、ingress-nginx、SonarQube 和 ArgoCD。
更新您的 DNS (Route53),以便您的域名(例如 argocd.example.com、sonarqube.example.com)指向 Ingress 负载均衡器。

3. GitLab CI/CD 管道:

Terraform 管道可自动执行基础架构变更。
应用程序管道构建、测试(通过 SonarQube)并将您的应用程序部署到 EKS。
4. 保护您的机密信息:
在 GitLab CI/CD 变量中配置 AWS 凭证、SonarQube 令牌和 Docker 镜像仓库凭证。

结论


本项目提供了一个强大的端到端解决方案,集成了 Terraform 的基础设施配置、Helm 的 Kubernetes 应用管理以及 GitLab CI/CD 的自动化流水线。通过结合这些工具,您可以以最少的人工干预交付一个云原生、安全且可扩展的环境。

请记住,实际部署可能需要进一步的定制和安全增强(例如,完善的 IAM 策略或额外的监控)。请将本指南作为坚实的起点,并随着项目的进展不断迭代。

欢迎在评论区分享您的经验或提问,或直接通过 Mohamed.ElEmam.Hussin@gmail.com 和 Mohamed ElEmam | LinkedIn 联系我。祝您编程愉快,DevOps 愉快!

相关文章:

实践 DevOps 项目:使用 Terraform、Helm、SonarQube 和 GitLab CI/CD 在 AWS EKS 上实践全栈部署

在当今快节奏的软件开发领域,自动化至关重要。在本文中,我将向您展示如何构建一个全面的 DevOps 流水线,该流水线能够: 使用 Terraform 预置完整的 AWS 基础设施。部署一个包含私有子网和公共子网、RDS PostgreSQL 以及完整配置的…...

EFT干扰和共模干扰

EFT干扰本质上属于共模干扰的一种具体表现形式,但严格来说不能简单等同于共模干扰。以下从原理、特征及区别角度展开分析: 1. EFT干扰的原理 定义:EFT(Electrical Fast Transient,电快速瞬变脉冲群)干扰是…...

android 下提示 SQLITECIPHER driver not loaded

问题描述: 在android下出现 SQLITECIPHER driver not loaded 错误 解决办法: 在QT的Android目录下面放入 libplugins_sqldrivers_sqlitecipher_arm64-v8a.so...

[D1,2]回溯刷题

文章目录 组合 组合 回溯的基础结构 #组合总和 注意startIndex的更新是用i来更新的,不然会产生重复的组合...

使用 VBA 宏创建一个选择全部word图片快捷指令,进行图片格式编辑

使用 VBA 宏批量选择图片 ✅ 第一步:创建 .dotm 加载项文件 1、使用环境 office word 365,文件格式为.docx 图片格式为.PNG 2、创建 .dotm 加载项文件 打开 Word,新建一个空白文档。 按下 Alt F11 打开 VBA 编辑器。 点击菜单栏&#xff…...

SQL 关键字

SQL 包含许多关键字,这些关键字用于执行各种数据库操作。以下是主要的 SQL 关键字分类: 数据查询语言 (DQL) SELECT - 从数据库中选择数据 FROM - 指定要查询的表 WHERE - 指定查询条件 GROUP BY - 对结果集进行分组 HAVING - 对分组结果进行过滤 …...

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…...

TCP和UDP协议

前言 TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议;它们在连接方式、可靠性、效率等方面有显著区别。 关键对比 差异总结 可靠性: TCP通过确认应答、重传等机制确保数据可靠传输&#…...

高并发内存池(三):PageCache(页缓存)的实现

前言: 在前两期内容中,我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略,能够快速响应线程的内存需求,减少锁竞争,提升程序性能。 本期…...

使用pybind11开发可供python使用的c++扩展模块

在做紫微斗数程序的时候用到了padas库,不过也只用了它下面几个功能: 1、读入csv文件,构造DataFrame; 2、通过行列标题查找数据; 3、通过行标题读取一行数据。 用这几个功能却导入了pandas、numpy、dateutil、pytz等一堆库,多少有点划不来,于是想用c++开发一个实现这几…...

系统与网络安全------网络通信原理(5)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接(不同端口号,代表不同的应用程序) TCP协议概述 TCP(Transm…...

JavaScript防抖与节流

目录 防抖(Debounce) 一、防抖的定义 二、防抖的实现原理 三、防抖的代码实现 四、代码解析 五、使用示例 1. 输入框实时搜索(延迟执行模式) 2. 按钮防重复点击(立即执行模式) 六、总结 节流&…...

Java网络编程实战(多人聊天室-CS模式)

一、C/S模式核心原理 1.1 基本架构 C/S(Client/Server)模式采用客户端-服务器架构: 服务器端:持续运行,负责消息路由和广播客户端:用户交互界面,连接服务器进行通信通信协议:TCP&…...

Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类

Vue3.5 Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型 一、完整依赖安装 npm install --save-dev stylelint stylelint-config-standard postcss-html # 解析 Vue/HTML 文件中的样式postcss-scss …...

23种设计模式Java版(带脑图,带示例源码)

设计模式 1、创建型 1.1、单例模式(Singleton pattern) 确保一个类只有一个实例,并提供该实例的全局访问点。 1.2、工厂方法(Factory Method) 它定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 1.3、抽象…...

mapbox高阶,使用graphology、graphology-shortest-path前端插件和本地geojson数据纯前端实现路径规划

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️graphology 插件1.3.1 ☘️概念1.3.2 ☘…...

【已解决】vscode升级后连接远程异常:“远程主机可能不符合XXX的先决条件”解决方法

vscode提示升级,每次都升了,突然某次关闭后无法连接远程,查询资料是因为从VS Code 1.86.1版本开始(2024年1月)要求glibc版本>2.28。 命令“ ldd --version”可查看glibc版本为2.27: rootXXXXXXX:~$ ld…...

Springboot整合JAVAFX

Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...

【算法】——一键解决动态规划

前言 动态规划是一种高效解决​​重叠子问题​​和​​最优子结构​​问题的算法思想。它通过​​分治记忆化​​&#xff0c;将复杂问题分解为子问题&#xff0c;并存储中间结果&#xff0c;避免重复计算&#xff0c;从而大幅提升效率。 ​​为什么重要&#xff1f;​ ​​优化…...

Git使用与管理

一.基本操作 1.创建本地仓库 在对应文件目录下进行&#xff1a; git init 输入完上面的代码&#xff0c;所在文件目录下就会多一个名为 .git 的隐藏文件&#xff0c;该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令&#xff08;注意要先下载tree插件&#xff09…...

npm、nvm、nrm

NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具&#xff0c;允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令&#xff1a; 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如&#xff1a;…...

Java 文件内容转换为MD5哈希值

若要把读取到的 files 列表里的内容转换为 MD5 哈希值&#xff0c;你可以逐个遍历 files 列表中的元素&#xff0c;将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码&#xff0c;展示了如何实现这一功能&#xff1a; import java.io.BufferedInputStream…...

未来郴州:科技与自然的交响诗篇

故事背景 故事发生在中国湖南郴州&#xff0c;描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景&#xff0c;展现雾能转化系统、立体生态书库、智能稻田等创新设计&#xff0c;编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...

UE5 运行时动态将玩家手部模型设置为相机的子物体

在编辑器里&#xff0c;我们虽然可以手动添加相机&#xff0c;但是无法将网格体设置为相机的子物体&#xff0c;只能将相机设置为网格体的子物体 但是为了使用方便&#xff0c;我们希望将网格体设置为相机的子物体&#xff0c;这样我们直接旋转相机就可以旋转网格体&#xff0…...

Ubuntu系统下的包管理器APT

Ubuntu系统下的包管理器APT 在Linux操作系统生态中&#xff0c;软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版&#xff0c;其强大的包管理系统APT&#xff08;Advanced Packaging Tool&#xff09;为开发者与系统管理员提供了便捷的软件生命周…...

超级码科技发布镂空AI保险胶带,重塑包装防伪新标准

在酒类、物流、奢侈品、电子产品等领域&#xff0c;包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用&#xff0c;导致商品被仿冒的风险居高不下。 为此&#xff0c;超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...

微软Exchange管理中心全球范围宕机

微软已确认Exchange管理中心&#xff08;Exchange Admin Center&#xff0c;EAC&#xff09;发生全球性服务中断&#xff0c;导致管理员无法访问关键管理工具。该故障被标记为关键服务事件&#xff08;编号EX1051697&#xff09;&#xff0c;对依赖Exchange Online的企业造成广…...

前端通信库fetch-event-source实现丰富的SSE

环境:SpringBoot3.4.0 + Vue3 1. 简介 SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端单向推送实时数据的轻量级协议,配合浏览器原生EventSource API,可实现高效实时通信。前端通过创建EventSource对象订阅服务端流,自动处理连接、重试与数据解析;服务端设置C…...

JVM 中Minor GC、Major GC、Full GC 的区别?

Minor GC、Major GC 和 Full GC 是 Java 虚拟机 (JVM) 垃圾回收 (Garbage Collection) 中的不同类型的 GC 事件&#xff0c;它们在范围、触发条件、停顿时间等方面有所不同。 1. Minor GC (Young GC): 范围&#xff1a; 只针对新生代 (Young Generation) 进行垃圾回收。触发条…...

2747. 统计没有收到请求的服务器数目

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> countServers(int n, vector<vector<int>>& logs, int x, vector<int>& queries) {sort(logs.begin(), logs.end(), [](vector<int> &a, v…...

设计模式:抽象工厂 - 掌控多产品族的创建之道

一、什么是抽象工厂模式&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们的具体类。 核心思想 1.定义多个产品的抽象接口&#xff0c;统一管理具体产品和工厂的创建逻辑。…...

图神经网络+多模态:视频动作分割的轻量高效新解法

一、引言 在智能监控、自动驾驶、人机交互等领域&#xff0c;准确理解视频中的动作序列至关重要。然而&#xff0c;传统方法依赖复杂的视觉模型&#xff0c;计算成本高且难以捕捉长时依赖。近期&#xff0c;一项名为 Semantic2Graph 的研究通过图神经网络&#xff08;GNN&am…...

技术与情感交织的一生 (五)

目录 初入“江湖” 分工 陌生 CraneOffice 内功 宝典 枪手 回到大二 通关 小聚 唱一首歌 初入“江湖” 分工 软件工作室是坐落在和平区宜昌道的一间民房&#xff0c;和我想象中的公司形象多少有些偏差。天津的道路有点凌乱&#xff0c;初次的时候不太好找&#xf…...

简单-快速-高效——模块化解析Pulid(实现不同风格下的人脸一致)

资源 论文&#xff1a;https://arxiv.org/abs/2404.16022 github&#xff1a;https://github.com/ToTheBeginning/PuLID?tabreadme-ov-file comfyui插件&#xff1a;https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced 讲解参考 https://zhuanlan.zhihu.com/p/69684…...

XYZ to xyY 求解

免责声明&#xff1a;本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…...

科技自然的协奏曲-深圳

故事背景 故事发生在中国广东深圳的现代城市环境&#xff0c;这里呈现出未来科技与自然生态共生的独特图景。没有具体的角色&#xff0c;却通过多样的场景描绘&#xff0c;展现出未来生活的活力与创新&#xff0c;反映出社会创新与人类情感的紧密结合。 故事内容 在未来的深…...

idea 创建 maven-scala项目

文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1&#xff09;创建scala目录并标记成【源目录】2&#xff09;导入scala环境3&#xff09;测试环境 idea 创建 maven-scala项目 1、创建普通maven项目并且配置pom.xml文件 maven依赖…...

C++项目:高并发内存池_下

目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…...

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…...

多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:

RAGFlow 介绍 RAGFlow 是一款基于深度文档理解的开源检索增强生成&#xff08;RAG&#xff09;引擎&#xff0c;通过结合信息检索与生成式 AI 技术&#xff0c;解决复杂场景下的数据处理和可信问答问题。其核心设计目标是提供透明化、可控化的文档处理流程&#xff0c;并通过多…...

docker compose安装智能体平台N8N

使用 docker volume create n8n_data 创建了一个名为 n8n_data 的数据卷。你通过 docker run 启动容器&#xff0c;映射了端口 5678&#xff0c;并挂载了 n8n_data 数据卷。 以下是对应的 docker-compose.yml 配置文件&#xff1a; version: "3.7"services:n8n:ima…...

FRP调用本地摄像头完成远程拍照

from flask import Flask, Response import cv2app Flask(__name__)# 基础文字回复 app.route(/) def hello_world():return <h1>你好啊世界</h1><img src"/camera" width"640" /># 摄像头拍照并返回图像 app.route(/camera) def captu…...

【Linux】39.一个基础的HTTP Web服务器

文章目录 1. 实现一个基础的HTTP Web服务器1.1 功能实现&#xff1a;1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现&#xff1a; 总体功能&#xff1a; 提供We…...

蓝桥杯-小明的背包(动态规划-Java)

0/1背包问题介绍 0/1背包问题是经典的动态规划问题&#xff0c;具体描述如下&#xff1a; 解题思路&#xff1a; 输入数据 首先&#xff0c;程序通过 Scanner 从输入中读取数据&#xff1a; n 表示物品的数量。 v 表示背包的最大容量。 接着读取每个物品的重量和价值&#xff…...

(四十一)Dart 中的空安全与 `late` 关键字教程

Dart 中的空安全与 late 关键字教程 空安全简介 空安全&#xff08;Null Safety&#xff09;是 Dart 语言的一项重要特性&#xff0c;旨在帮助开发者避免空指针异常&#xff08;NullPointerException&#xff09;。空安全通过在编译时检查变量是否可能为 null&#xff0c;从而…...

GaussDB使用指南

目录 1. GaussDB 概述 1.1 GaussDB 简介 1.2 核心技术架构 1.3 适用场景与行业案例 2. GaussDB 安装与部署 2.1 环境准备与依赖检查 2.2 单机版安装&#xff08;Linux&#xff09; 2.3 分布式集群部署 3. GaussDB 基础操作与语法 3.1 数据库连接与用户管理 3.2 DDL …...

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

dubbo配置中心

配置中心 简介 配置中心&#xff08;config-center&#xff09;在dubbo中可承担两类职责&#xff1a; 外部化配置&#xff1a;启动配置的集中式存储。流量治理规则存储。 Dubbo动态配置中心定义了两个不同层次的隔离选项&#xff0c;分别是namespace和group。 namespace&a…...

移动端六大语言速记:第11部分 - 内存管理

移动端六大语言速记&#xff1a;第11部分 - 内存管理 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在内存管理方面的特性&#xff0c;帮助开发者理解和掌握各语言的内存管理机制。 11. 内存管理 11.1 垃圾回收机制对比 各语言垃圾回收…...

对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?

在Java中&#xff0c;对象的创建方式及其在虚拟机中的具体过程如下&#xff1a; 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式&#xff0c;直接调用类的构造方法。 MyClass obj new MyClass();反射&#xff08;Reflection&#xff09; 通过 Class 或 Constructor…...