实践 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 编辑器。 点击菜单栏ÿ…...
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文件如下: <?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…...
【算法】——一键解决动态规划
前言 动态规划是一种高效解决重叠子问题和最优子结构问题的算法思想。它通过分治记忆化,将复杂问题分解为子问题,并存储中间结果,避免重复计算,从而大幅提升效率。 为什么重要? 优化…...
Git使用与管理
一.基本操作 1.创建本地仓库 在对应文件目录下进行: git init 输入完上面的代码,所在文件目录下就会多一个名为 .git 的隐藏文件,该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令(注意要先下载tree插件)…...
npm、nvm、nrm
NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具,允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令: 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如:…...
Java 文件内容转换为MD5哈希值
若要把读取到的 files 列表里的内容转换为 MD5 哈希值,你可以逐个遍历 files 列表中的元素,将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码,展示了如何实现这一功能: import java.io.BufferedInputStream…...
未来郴州:科技与自然的交响诗篇
故事背景 故事发生在中国湖南郴州,描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景,展现雾能转化系统、立体生态书库、智能稻田等创新设计,编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...
UE5 运行时动态将玩家手部模型设置为相机的子物体
在编辑器里,我们虽然可以手动添加相机,但是无法将网格体设置为相机的子物体,只能将相机设置为网格体的子物体 但是为了使用方便,我们希望将网格体设置为相机的子物体,这样我们直接旋转相机就可以旋转网格体࿰…...
Ubuntu系统下的包管理器APT
Ubuntu系统下的包管理器APT 在Linux操作系统生态中,软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版,其强大的包管理系统APT(Advanced Packaging Tool)为开发者与系统管理员提供了便捷的软件生命周…...
超级码科技发布镂空AI保险胶带,重塑包装防伪新标准
在酒类、物流、奢侈品、电子产品等领域,包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用,导致商品被仿冒的风险居高不下。 为此,超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖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 事件,它们在范围、触发条件、停顿时间等方面有所不同。 1. Minor GC (Young GC): 范围: 只针对新生代 (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…...
设计模式:抽象工厂 - 掌控多产品族的创建之道
一、什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。 核心思想 1.定义多个产品的抽象接口,统一管理具体产品和工厂的创建逻辑。…...
图神经网络+多模态:视频动作分割的轻量高效新解法
一、引言 在智能监控、自动驾驶、人机交互等领域,准确理解视频中的动作序列至关重要。然而,传统方法依赖复杂的视觉模型,计算成本高且难以捕捉长时依赖。近期,一项名为 Semantic2Graph 的研究通过图神经网络(GNN&am…...
技术与情感交织的一生 (五)
目录 初入“江湖” 分工 陌生 CraneOffice 内功 宝典 枪手 回到大二 通关 小聚 唱一首歌 初入“江湖” 分工 软件工作室是坐落在和平区宜昌道的一间民房,和我想象中的公司形象多少有些偏差。天津的道路有点凌乱,初次的时候不太好找…...
简单-快速-高效——模块化解析Pulid(实现不同风格下的人脸一致)
资源 论文:https://arxiv.org/abs/2404.16022 github:https://github.com/ToTheBeginning/PuLID?tabreadme-ov-file comfyui插件:https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced 讲解参考 https://zhuanlan.zhihu.com/p/69684…...
XYZ to xyY 求解
免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济…...
科技自然的协奏曲-深圳
故事背景 故事发生在中国广东深圳的现代城市环境,这里呈现出未来科技与自然生态共生的独特图景。没有具体的角色,却通过多样的场景描绘,展现出未来生活的活力与创新,反映出社会创新与人类情感的紧密结合。 故事内容 在未来的深…...
idea 创建 maven-scala项目
文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1)创建scala目录并标记成【源目录】2)导入scala环境3)测试环境 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 是一款基于深度文档理解的开源检索增强生成(RAG)引擎,通过结合信息检索与生成式 AI 技术,解决复杂场景下的数据处理和可信问答问题。其核心设计目标是提供透明化、可控化的文档处理流程,并通过多…...
docker compose安装智能体平台N8N
使用 docker volume create n8n_data 创建了一个名为 n8n_data 的数据卷。你通过 docker run 启动容器,映射了端口 5678,并挂载了 n8n_data 数据卷。 以下是对应的 docker-compose.yml 配置文件: 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 功能实现:1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现: 总体功能: 提供We…...
蓝桥杯-小明的背包(动态规划-Java)
0/1背包问题介绍 0/1背包问题是经典的动态规划问题,具体描述如下: 解题思路: 输入数据 首先,程序通过 Scanner 从输入中读取数据: n 表示物品的数量。 v 表示背包的最大容量。 接着读取每个物品的重量和价值ÿ…...
(四十一)Dart 中的空安全与 `late` 关键字教程
Dart 中的空安全与 late 关键字教程 空安全简介 空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量是否可能为 null,从而…...
GaussDB使用指南
目录 1. GaussDB 概述 1.1 GaussDB 简介 1.2 核心技术架构 1.3 适用场景与行业案例 2. GaussDB 安装与部署 2.1 环境准备与依赖检查 2.2 单机版安装(Linux) 2.3 分布式集群部署 3. GaussDB 基础操作与语法 3.1 数据库连接与用户管理 3.2 DDL …...
算法训练之动态规划(一)
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
dubbo配置中心
配置中心 简介 配置中心(config-center)在dubbo中可承担两类职责: 外部化配置:启动配置的集中式存储。流量治理规则存储。 Dubbo动态配置中心定义了两个不同层次的隔离选项,分别是namespace和group。 namespace&a…...
移动端六大语言速记:第11部分 - 内存管理
移动端六大语言速记:第11部分 - 内存管理 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在内存管理方面的特性,帮助开发者理解和掌握各语言的内存管理机制。 11. 内存管理 11.1 垃圾回收机制对比 各语言垃圾回收…...
对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?
在Java中,对象的创建方式及其在虚拟机中的具体过程如下: 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式,直接调用类的构造方法。 MyClass obj new MyClass();反射(Reflection) 通过 Class 或 Constructor…...