第33章 - Go语言 云原生开发

第33章 - 云原生开发将深入探讨云原生技术及其在现代软件开发中的应用。我们将从云原生的基本概念开始,逐步介绍Kubernetes的基本使用方法,并结合具体的云服务提供商实例,通过Go语言编写的应用程序来展示如何实现云原生开发。

33.1 云原生的概念

云原生(Cloud Native)是一种构建和运行应用程序的方法,它充分利用云计算的优势,以快速、灵活、可扩展的方式开发和部署应用。云原生应用通常具备以下特点:

  • 微服务架构:将应用拆分为一系列小的服务,每个服务实现特定的业务功能,并且可以独立地进行开发、测试、部署和扩展。
  • 容器化:使用容器(如Docker)来打包应用及其依赖,确保应用在不同环境中具有一致的行为。
  • 持续集成/持续部署 (CI/CD):自动化地构建、测试和部署应用,加快软件交付速度。
  • 动态管理:利用云平台提供的服务自动管理应用的生命周期,包括负载均衡、自动扩缩容等。
  • 面向服务的架构:强调服务之间的解耦,使系统更加模块化,易于维护和更新。

33.2 Kubernetes入门

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化的应用。Kubernetes的主要组件包括:

  • Pods:Kubernetes中最小的部署单元,可以包含一个或多个容器。
  • Services:定义了访问Pods的方式,提供负载均衡和网络服务发现。
  • Deployments:描述了应用的理想状态,Kubernetes会自动保证这个状态。
  • ReplicaSets:确保任意时刻都有指定数量的Pod副本处于运行状态。
  • Volumes:为Pods提供存储卷,支持数据持久化。

33.3 云服务提供商

云服务提供商(CSPs)提供了丰富的服务来支持云原生开发,例如:

  • 阿里云:提供了一站式的云原生解决方案,包括容器服务ACK、Serverless应用引擎SAE等。
  • AWS:Amazon Web Services 提供了广泛的云原生服务,如EKS(Elastic Kubernetes Service)、Lambda等。
  • Google Cloud:提供了GKE(Google Kubernetes Engine)等服务,支持高效管理和扩展Kubernetes集群。

33.4 结合案例及源代码

假设我们正在开发一个基于Go语言的简单Web应用,该应用将部署在一个Kubernetes集群上,并使用阿里云的容器服务ACK来管理这个集群。

应用设计

我们的应用将是一个简单的RESTful API服务器,提供用户信息的查询和创建功能。

技术栈
  • 后端:Go语言 + Gin框架
  • 数据库:MySQL
  • 容器化:Docker
  • 编排:Kubernetes
  • 云服务:阿里云容器服务ACK
源代码示例

下面是一个简单的Go应用示例,使用Gin框架实现了一个基本的API接口。

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 路由处理r.GET("/users", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello from the user service!",})})// 启动服务r.Run(":8080")
}
Dockerfile

为了容器化我们的应用,我们需要创建一个Dockerfile文件:

FROM golang:1.17-alpine as builder
WORKDIR /app
COPY . .
RUN go build -o app .FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]
部署到Kubernetes

创建一个Kubernetes Deployment和Service来部署我们的应用:

apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-webports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
使用阿里云ACK
  1. 在阿里云控制台创建一个新的Kubernetes集群。
  2. 将上面的YAML文件应用到你的集群中,可以通过kubectl apply -f deployment.yaml命令完成。
  3. 访问Service的外部IP地址,测试你的应用是否正常工作。

33.5 优化应用性能

在云原生环境中,优化应用性能是至关重要的。以下是一些常见的优化策略:

1. 资源限制与请求

在Kubernetes中,可以为Pod设置资源限制(limits)和请求(requests),以确保每个Pod都能获得所需的资源,同时防止某个Pod占用过多资源导致其他Pod资源不足。

apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: example-containerimage: your-imageresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"
2. 水平自动扩展

Kubernetes提供了Horizontal Pod Autoscaler(HPA),可以根据CPU使用率或其他自定义指标自动调整Pod的数量。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: go-web-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: go-web-appminReplicas: 3maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
3. 缓存与CDN

使用缓存和内容分发网络(CDN)可以显著提高应用的响应时间和用户体验。例如,可以使用Redis作为缓存层,或者使用阿里云的CDN服务来加速静态资源的加载。

33.6 确保应用安全性

在云原生环境中,安全是不可忽视的重要方面。以下是一些常见的安全措施:

1. 网络策略

Kubernetes网络策略(Network Policies)可以控制Pod之间的通信,确保只有授权的流量才能到达目标Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: go-web-app-policy
spec:podSelector:matchLabels:app: go-webingress:- from:- podSelector:matchLabels:app: frontendports:- protocol: TCPport: 8080
2. 身份验证与授权

使用OAuth2、OpenID Connect等协议进行身份验证和授权,确保只有经过认证的用户才能访问应用的敏感数据。

3. 加密传输

使用HTTPS协议加密传输数据,确保数据在传输过程中不被窃取或篡改。

33.7 利用云服务提供商的高级特性

云服务提供商通常提供许多高级特性来提升应用的可靠性和可维护性。以下是一些常见的高级特性:

1. 监控与日志

使用阿里云的ARMS(Application Real-Time Monitoring Service)和SLS(Log Service)来监控应用的性能和日志,及时发现并解决问题。

2. 备份与恢复

利用阿里云的RDS(Relational Database Service)自动备份功能,确保数据的安全性和可恢复性。

3. 服务网格

使用阿里云的服务网格ASM(Alibaba Cloud Service Mesh)来管理微服务之间的通信,提供统一的服务治理能力。

33.8 实战案例

假设我们正在开发一个电商应用,该应用需要处理大量的用户请求和数据操作。以下是具体的技术方案和步骤:

1. 应用架构
  • 前端:React应用,托管在阿里云OSS(Object Storage Service)上,使用CDN加速。
  • 后端:Go语言开发的API服务,使用Gin框架。
  • 数据库:MySQL,托管在阿里云RDS上。
  • 缓存:Redis,托管在阿里云KVStore上。
  • 消息队列:RabbitMQ,托管在阿里云MQ上。
  • 容器编排:Kubernetes,使用阿里云ACK管理。
2. 部署流程
  1. 代码仓库:将应用代码托管在GitHub或GitLab上。
  2. 持续集成/持续部署(CI/CD):使用Jenkins或GitHub Actions自动化构建和测试流程。
  3. 镜像构建:使用Docker构建应用镜像,并推送到阿里云CR(Container Registry)。
  4. Kubernetes部署:使用Helm或Kustomize管理Kubernetes资源文件,通过kubectl命令将应用部署到ACK集群。
  5. 服务发现:使用Kubernetes的Service和Ingress资源进行服务发现和路由管理。
  6. 监控与告警:使用Prometheus和Grafana监控应用性能,使用Alertmanager配置告警规则。
3. 示例代码

以下是一个简单的Go应用示例,展示了如何连接到MySQL数据库并执行查询操作:

package mainimport ("database/sql""fmt""log""net/http"_ "github.com/go-sql-driver/mysql""github.com/gin-gonic/gin"
)var db *sql.DBfunc initDB() {var err errordsn := "user:password@tcp(db-service:3306)/dbname"db, err = sql.Open("mysql", dsn)if err != nil {log.Fatal(err)}if err = db.Ping(); err != nil {log.Fatal(err)}
}func getUser(c *gin.Context) {rows, err := db.Query("SELECT id, name FROM users")if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}defer rows.Close()var users []map[string]interface{}for rows.Next() {var id intvar name stringif err := rows.Scan(&id, &name); err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}users = append(users, map[string]interface{}{"id": id, "name": name})}c.JSON(http.StatusOK, users)
}func main() {initDB()defer db.Close()r := gin.Default()r.GET("/users", getUser)r.Run(":8080")
}
4. Dockerfile
FROM golang:1.17-alpine as builder
WORKDIR /app
COPY . .
RUN go build -o app .FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]
5. Kubernetes资源配置
apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080env:- name: MYSQL_HOSTvalue: "db-service"- name: MYSQL_PORTvalue: "3306"- name: MYSQL_USERvalue: "user"- name: MYSQL_PASSWORDvalue: "password"- name: MYSQL_DBvalue: "dbname"
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-webports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer

33.9 总结

通过本章的学习,我们深入了解了云原生开发的核心概念和技术栈,掌握了如何使用Kubernetes和阿里云服务来构建、部署和管理云原生应用。通过实际的案例和源代码,我们展示了如何优化应用性能、确保应用安全,并利用云服务提供商的高级特性来提升应用的可靠性和可维护性。

接下来我们将继续深入探讨一些高级主题,包括如何进行故障排除、如何实现多环境管理、如何进行灰度发布和蓝绿部署,以及如何利用云原生工具进行持续集成和持续部署(CI/CD)。

33.10 故障排除

在云原生环境中,故障排除是一项重要技能。以下是一些常见的故障排除方法和工具:

1. 日志分析

使用Kubernetes的kubectl logs命令查看Pod的日志,帮助诊断应用问题。

kubectl logs <pod-name>

如果应用使用了集中式日志系统(如阿里云SLS),可以通过日志搜索和分析工具来快速定位问题。

2. 事件查看

使用kubectl get events命令查看集群中的事件,了解Kubernetes资源的状态变化。

kubectl get events --sort-by=.metadata.creationTimestamp
3. 网络调试

使用kubectl exec命令进入Pod内部,使用网络工具(如curlnetstat)进行网络调试。

kubectl exec -it <pod-name> -- /bin/sh
4. 性能监控

使用Prometheus和Grafana监控应用的性能指标,如CPU使用率、内存使用率、请求延迟等。

33.11 多环境管理

在云原生开发中,通常需要管理多个环境,如开发环境、测试环境和生产环境。以下是一些常见的多环境管理方法:

1. Kubernetes命名空间

使用Kubernetes命名空间(Namespace)隔离不同的环境,每个环境使用一个独立的命名空间。

apiVersion: v1
kind: Namespace
metadata:name: dev
---
apiVersion: v1
kind: Namespace
metadata:name: test
---
apiVersion: v1
kind: Namespace
metadata:name: prod
2. 配置管理

使用ConfigMap和Secret管理环境变量和敏感信息,避免硬编码在代码中。

apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:app.env: "dev"app.log.level: "debug"
---
apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:db.password: <base64-encoded-password>
3. 环境变量注入

在Deployment中注入环境变量,根据不同的环境配置不同的值。

apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app
spec:replicas: 3selector:matchLabels:app: go-webtemplate:metadata:labels:app: go-webspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080envFrom:- configMapRef:name: app-config- secretRef:name: app-secret

33.12 灰度发布和蓝绿部署

灰度发布和蓝绿部署是两种常见的发布策略,可以帮助减少新版本上线的风险。

1. 灰度发布

灰度发布是指在新版本完全上线之前,先让一部分用户使用新版本,收集反馈和监控数据,再决定是否全面推广。

示例

使用Kubernetes的Ingress和Service实现灰度发布。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: go-web-ingressannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10"
spec:rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: go-web-canaryport:number: 80
---
apiVersion: v1
kind: Service
metadata:name: go-web-canary
spec:selector:app: go-web-canaryports:- protocol: TCPport: 80targetPort: 8080
2. 蓝绿部署

蓝绿部署是指在新版本上线时,保留旧版本的运行环境,新版本在新的环境中运行,确认无误后再切换流量到新版本。

示例

使用Kubernetes的Deployment和Service实现蓝绿部署。

apiVersion: apps/v1
kind: Deployment
metadata:name: go-web-app-green
spec:replicas: 3selector:matchLabels:app: go-web-greentemplate:metadata:labels:app: go-web-greenspec:containers:- name: go-webimage: your-docker-repo/go-web-app:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: go-web-service
spec:selector:app: go-web-greenports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer

33.13 持续集成和持续部署(CI/CD)

CI/CD是现代软件开发的重要实践,可以帮助团队更快、更可靠地交付软件。以下是一些常见的CI/CD工具和实践:

1. GitHub Actions

GitHub Actions是一个强大的CI/CD工具,可以直接在GitHub仓库中配置流水线。

示例

创建一个.github/workflows/ci-cd.yml文件,配置CI/CD流水线。

name: CI/CD Pipelineon:push:branches:- mainjobs:build-and-deploy:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: 1.17- name: Build applicationrun: go build -o app .- name: Build Docker imagerun: docker build -t your-docker-repo/go-web-app:latest .- name: Push Docker imagerun: |echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdindocker push your-docker-repo/go-web-app:latest- name: Deploy to Kubernetesrun: |kubectl apply -f k8s/deployment.yamlkubectl apply -f k8s/service.yamlenv:KUBECONFIG: ${{ secrets.KUBECONFIG }}
2. Jenkins

Jenkins是一个流行的CI/CD工具,支持多种插件和集成方式。

示例

创建一个Jenkinsfile,配置CI/CD流水线。

pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/your-repo/go-web-app.git'}}stage('Build') {steps {sh 'go build -o app .'}}stage('Test') {steps {sh 'go test ./...'}}stage('Build Docker Image') {steps {sh 'docker build -t your-docker-repo/go-web-app:latest .'}}stage('Push Docker Image') {steps {withCredentials([usernamePassword(credentialsId: 'docker-credentials', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {sh '''echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdindocker push your-docker-repo/go-web-app:latest'''}}}stage('Deploy to Kubernetes') {steps {withKubeConfig([credentialsId: 'kubeconfig-credentials']) {sh 'kubectl apply -f k8s/deployment.yaml'sh 'kubectl apply -f k8s/service.yaml'}}}}
}

33.14 总结

通过本章的学习,我们不仅深入探讨了云原生开发的核心概念和技术栈,还学习了如何进行故障排除、多环境管理、灰度发布和蓝绿部署,以及如何利用CI/CD工具实现持续集成和持续部署。

希望这些内容能够帮助你在云原生开发的道路上更进一步,构建出高效、稳定、可扩展的应用。如果你有任何问题或需要进一步的帮助,请随时联系我。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cesium 3Dtiles变量

原本有一个变亮的属性luminanceAtZenith&#xff0c;但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…

Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源 源起 Java语言最初是由Sun Microsystems公司&#xff08;该公司于2009年被Oracle公司收购&#xff09;开发的一种编程语言。其创造者是詹姆斯高斯林&#xff08;James Gosling&#xff09;&#xff0c;他是一位加拿大计算机科学家。其前身名为Oak&#xff08;橡…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…

使用 Spring AI + Elasticsearch 让 RAG 变得简单

作者&#xff1a;来自 Elastic Laura Trotta 使用私人数据定制你的人工智能聊天机器人体验。 Spring AI 最近将 Elasticsearch 添加为向量存储&#xff0c;Elastic 团队为其提供了优化。我们很高兴展示使用 Spring AI 和 Elasticsearch 向量数据库&#xff08;vector database&…

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是 8GB/16GB/32GB 等&#xff0c;那这些内存空间…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel&#xff08;没有一次性将数据读取到内存…

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能&#xff0c;这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…

Linux中使用ping提示“未知的名称或服务”

Linux中使用ping提示“未知的名称或服务” 问题&#xff1a;在linux系统中使用ping、telnet命令提示“未知的名称或服务”或 bad address。以centos系统为例&#xff1a; 问题原因&#xff1a; 1、未安装ping服务 2、操作系统未设置DNS&#xff08;尝试ping IP地址&#xff0…

【C++】深入解析 using namespace std 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是 std&#xff1f;&#x1f4af;using namespace std; 的作用&#x1f4af;为什么需要 std 命名空间&#xff1f;&#x1f4af;using namespace std; 的优缺点优点缺点…

Android音频框架总结

1、AudioFlinger&#xff1a;接收多个APP的数据&#xff0c;合并下发&#xff1b;是策略的执行者&#xff0c;例如具体如何与音频设备通信&#xff0c;如何维护现有系统中的音频设备&#xff0c;以及多个音频流的混音如何处理等等都得由它来完 成。 AudioFlinger主要包含3个主…

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题&#xff1f;最近遇到挺多工业相机维修咨询这个不能触发拍照的案例&#xff0c;所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…

68000汇编实战01-编程基础

文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…

wsl2的Ubuntu18.04安装ros和anaconda

参考&#xff1a;超详细 WSL2 安装 ros 和 anaconda_wsl2安装anaconda-CSDN博客 一.安装ros 1. 更换系统源 输入 wget http://fishros.com/install -O fishros && . fishros 和上面的链接一样&#xff0c;依次输入5-2-1 2. 安装ros 输入 wget http://fishros.c…

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …

【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)

&#x1f5fa;️博客地图 &#x1f4cd;1、报错发现 &#x1f4cd;2、原因分析 &#x1f4cd;3、解决办法 &#x1f4cd;4、测试结果 1、报错发现 装好了CentOS操作系统&#xff0c;使用ssh远程登陆CentOS&#xff0c;出现如下告警信息&#xff1a; bash: 警告:setlocale…

【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈

目录 一、双向链表 定义类和封装函数以及测试样例如下&#xff1a; 注意事项&#xff1a; 二、循环链表 单循环列表的类和函数封装如下&#xff1a; 注意事项&#xff1a; 三、双向循环链表 结点类和双循环链表的定义部分 函数封装之判空和尾插 双循环链表遍历 双循…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接&#xff08;Cross&#xff09;、内连接&#xff08;Inner&#xff09;、自然连接&#xff08;Natural&#xff09;、外连接&#xff08;Outer&#xff09; 2. ORDER BY to produce ordered output 3. 聚合函数&#xff08;Aggregate Functio…

systemverilog约束中:=和:/的区别

“x dist { [100:102] : 1, 200 : 2, 300 : 5}” 意味着其值等于100或101或102或200或300其中之一&#xff0c; 其权重比例为1:1:1:2:5 “x dist { [100:102] :/ 1, 200 : 2, 300 : 5}” 意味着等于100&#xff0c;101&#xff0c;102或200&#xff0c;或300其…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识&#xff0c;不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统&#xff0c;它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统&#xff0c;并将其部署到生产环境中以维护其代…