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

news2024/11/30 6:49:32

第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 main

import (
    "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: 3
  selector:
    matchLabels:
      app: go-web
  template:
    metadata:
      labels:
        app: go-web
    spec:
      containers:
      - name: go-web
        image: your-docker-repo/go-web-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  selector:
    app: go-web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: 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-container
    image: your-image
    resources:
      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/v1
    kind: Deployment
    name: go-web-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 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-web
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 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 main

import (
    "database/sql"
    "fmt"
    "log"
    "net/http"

    _ "github.com/go-sql-driver/mysql"
    "github.com/gin-gonic/gin"
)

var db *sql.DB

func initDB() {
    var err error
    dsn := "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 int
        var name string
        if 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: 3
  selector:
    matchLabels:
      app: go-web
  template:
    metadata:
      labels:
        app: go-web
    spec:
      containers:
      - name: go-web
        image: your-docker-repo/go-web-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_HOST
          value: "db-service"
        - name: MYSQL_PORT
          value: "3306"
        - name: MYSQL_USER
          value: "user"
        - name: MYSQL_PASSWORD
          value: "password"
        - name: MYSQL_DB
          value: "dbname"
---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  selector:
    app: go-web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: 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: 3
  selector:
    matchLabels:
      app: go-web
  template:
    metadata:
      labels:
        app: go-web
    spec:
      containers:
      - name: go-web
        image: your-docker-repo/go-web-app:latest
        ports:
        - containerPort: 8080
        envFrom:
        - 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-ingress
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: go-web-canary
            port:
              number: 80
---
apiVersion: v1
kind: Service
metadata:
  name: go-web-canary
spec:
  selector:
    app: go-web-canary
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
2. 蓝绿部署

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

示例

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-web-app-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-web-green
  template:
    metadata:
      labels:
        app: go-web-green
    spec:
      containers:
      - name: go-web
        image: your-docker-repo/go-web-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  selector:
    app: go-web-green
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: 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 Pipeline

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.17

    - name: Build application
      run: go build -o app .

    - name: Build Docker image
      run: docker build -t your-docker-repo/go-web-app:latest .

    - name: Push Docker image
      run: |
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker push your-docker-repo/go-web-app:latest

    - name: Deploy to Kubernetes
      run: |
        kubectl apply -f k8s/deployment.yaml
        kubectl apply -f k8s/service.yaml
      env:
        KUBECONFIG: ${{ secrets.KUBECONFIG }}
2. Jenkins

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

示例

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

pipeline {
    agent any

    stages {
        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-stdin
                        docker 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.coloradmin.cn/o/2250271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

道路机器人识别交通灯,马路,左右转,黄线,人行道,机器人等路面导航标志识别-使用YOLO标记

数据集分割 train组66% 268图片 validation集22% 91图片 test集12&#xff05; 48图片 预处理 没有采用任何预处理步骤。 增强 未应用任何增强。 数据集图片&#xff1a; 交通灯 马路 右转 向右掉头 机器人识别 人行横道 黄线 直行或右转 数据集下载&#xff1a; 道路…

【四轴】利用PWM捕获解析接收机信号

在学习这部分之间&#xff0c;建议大家先看之前这篇博客&#xff0c;里面包含对PWM一些重要概念的基本介绍。 【四轴】利用PWM输出驱动无刷电机-CSDN博客 1. 基本原理 1.1 PWM是什么 这一部分可以看我之前的博客&#xff0c;已经对PWM有了基本的介绍。 1.2 什么叫捕获PWM波&…

洛谷 P1162 填涂颜色 C语言 bfs

题目&#xff1a; https://www.luogu.com.cn/problem/P1162 由数字 0 组成的方阵中&#xff0c;有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如&#xff1a;66的方阵&#xff08;n6&#xff09;&#xff0c;涂色前和涂色后的方阵如下&am…

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

霍夫变换:原理剖析与 OpenCV 应用实例

简介&#xff1a;本文围绕霍夫变换相关内容展开&#xff0c;先是讲解霍夫变换基本原理&#xff0c;包含从 xy 坐标系到 kb 坐标系及极坐标系的映射等。接着介绍了 cv2.HoughLines、cv2.HoughLinesP 概率霍夫变换、cv2.HoughCircles 霍夫圆变换的函数用法、参数含义、与常规霍夫…

【Debug】hexo-github令牌认证 Support for password authentication was removed

title: 【Debug】hexo-github令牌认证 date: 2024-07-19 14:40:54 categories: bug解决日记 description: “Support for password authentication was removed on August 13, 2021.” cover: https://pic.imgdb.cn/item/669b38ebd9c307b7e9f3e5e0.jpg 第一章 第一篇博客记录一…

JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】

前言&#xff1a; 前面我们分析怎么去预估系统资源&#xff0c;怎么去设置 JVM 参数以及怎么去看 GC 日志&#xff0c;本篇我们分享一些常用的 JVM 调优工具&#xff0c;我们在进行 JVM 调优的时候&#xff0c;通常需要借助一些工具来对系统的进行相关分析&#xff0c;从而确定…

net9 abp vnext 多语言通过数据库动态管理

通过数据库加载实现动态管理&#xff0c;用户可以自己修改界面显示的文本&#xff0c;满足国际化需求 如图所示,前端使用tdesign vnext 新建表TSYS_Localization与TSYS_LocalizationDetail 国旗图标下载网址flag-icons: Free Country Flags in SVG 在Shared下创建下图3个文件 …

Vue:使用 KeepAlive 缓存切换掉的 component

一、内置特殊元素 不是组件 <component>、<slot> 和 <template> 具有类似组件的特性&#xff0c;也是模板语法的一部分。但它们并非真正的组件&#xff0c;同时在模板编译期间会被编译掉。因此&#xff0c;它们通常在模板中用小写字母书写。 1.1 <compone…

Spring中每次访问数据库都要创建SqlSession吗?

一、SqlSession是什么二、源码分析1&#xff09;mybatis获取Mapper流程2&#xff09;Spring创建Mapper接口的代理对象流程3&#xff09;MapperFactoryBean#getObject调用时机4&#xff09;SqlSessionTemplate创建流程5&#xff09;SqlSessionInterceptor拦截逻辑6&#xff09;开…

【数据结构】填空集

基本术语 顺序队列在实现的时候&#xff0c;通常将数组看成是一个首尾相连的循环队列&#xff0c;这样做的目的是为避免产生&#xff08;溢出&#xff09;现象 数组q[M]&#xff08;M等于6&#xff09;存储一个循环队&#xff0c;first和last分别指向首尾指针。已知first2,la…

【趣味升级版】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 开始游戏 手动升级&#xff08;满100%即可升级&#xff09; 升级完成&#xff0c;即可解锁打怪模式 新增功能说明&#xff1a; 如何操作&#xff1a; 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建…

【在Linux世界中追寻伟大的One Piece】多线程(三)

目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…

AI数据分析工具(一)

Looker Studio&#xff08;谷歌&#xff09;-免费 优点 免费使用&#xff1a;对于中小型企业和个人用户来说&#xff0c;没有任何费用压力&#xff0c;可以免费享受到数据可视化和报表创建的功能。与Google服务集成&#xff1a;特别适合使用Google产品生态的企业&#xff0c;…

个人博客接入github issue风格的评论,utteranc,gitment

在做个人博客的时候&#xff0c;如果你需要评论功能&#xff0c;但是又不想构建用户体系和评论模块&#xff0c;那么可以直接使用github的issue提供的接口&#xff0c;对应的开源项目有utteranc和gitment&#xff0c;尤其是前者。 它们的原理是一样的&#xff1a;在博客文章下…

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

探索Python WebSocket新境界:picows库揭秘

文章目录 探索Python WebSocket新境界&#xff1a;picows库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;picows库概述第三部分&#xff1a;安装picows库第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第…

【Linux】-学习笔记06

第二章、时间同步服务器 2.1时间同步服务器的使用 2.1.1系统时区时间的管理 timedatectl set-time "2024-02-13 10:41:55" ##设定系统时间 timedatectl list-timezones ##显示系统的所有时区 timedatectl set-timezone "Asia/Shangh…

Mac使用charles抓包

一、官网下载安装 二、配置Help--->SSL Proxying 有证书选择全部信任即可 三、设置系统代理&#xff0c;mac每次重启都需要选择&#xff0c;否则会没有数据 四、设置端口&#xff08;如果无法获取https&#xff09; 五、手机链接&#xff0c;从网页下载证书保存到手机&…

3d扫描建模产品开发-三维扫描检测蓝光检测

现当下&#xff0c;汽车制造、航空航天&#xff0c;还是消费电子、医疗器械&#xff0c;三维扫描检测与蓝光技术正以前所未有的精度和效率&#xff0c;推动着产品从概念到实物的快速转化。 三维扫描技术&#xff0c;简而言之&#xff0c;就是通过激光、结构光&#xff08;如蓝…