《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(下)

简介: 《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)

《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(上)+https://developer.aliyun.com/article/1487020


10.2.3 拓展案例 1:多阶段构建优化

在Docker容器化的上下文中,多阶段构建是一种优化技术,它允许在一个Dockerfile中使用多个构建阶段,但最终只将必要的文件复制到最终镜像中。这样做的好处是可以显著减小最终镜像的大小,同时保持构建过程的清晰和高效。

功能描述

为了展示多阶段构建优化,我们将使用前面创建的Go Web服务案例,并优化其Dockerfile,以减小最终产生的Docker镜像的大小。

步骤一:优化 Dockerfile

以下是针对Go Web服务的多阶段构建优化后的Dockerfile:

# 第一阶段:构建环境
FROM golang:1.16-alpine AS builder
WORKDIR /app
# 复制Go模块和依赖文件
COPY go.mod go.sum ./
RUN go mod download
# 复制源代码
COPY . .
# 编译Go应用为静态链接的二进制文件
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o go-web-app .
# 第二阶段:运行环境
FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# 从构建阶段复制编译好的二进制文件
COPY --from=builder /app/go-web-app .
# 暴露端口
EXPOSE 8080
# 定义入口点
CMD ["./go-web-app"]

在这个优化后的Dockerfile中,我们在第二阶段使用了alpine:latest作为基础镜像,而不是scratch。这是因为alpine镜像虽然相对较小,但包含了运行大多数应用所需的最小系统和库,包括ca-certificates,这对于执行HTTPS请求非常重要。同时,通过使用CGO_ENABLED=0编译Go应用,我们确保生成的二进制文件是静态链接的,没有依赖于C库,这让它可以在几乎任何Linux环境下运行。

步骤二:构建和运行容器

使用优化后的Dockerfile,按照之前的步骤构建并运行容器:

docker build -t go-web-app-optimized .
docker run -d -p 8080:8080 go-web-app-optimized

步骤三:验证镜像大小的优化

你可以使用以下命令来比较优化前后镜像的大小,看到多阶段构建优化带来的效果:

docker images | grep go-web-app

你应该会注意到,使用多阶段构建优化后的镜像大小要比原始镜像小得多。

测试服务

确保服务正常运行,通过访问http://localhost:8080或使用curl命令测试:

curl http://localhost:8080

应返回“Hello, Dockerized World!”的欢迎信息。

通过这个拓展案例,你学会了如何通过多阶段构建来优化Go应用的Docker镜像大小,使其更适合生产环境部署。这种优化不仅减少了资源消耗,还加快了镜像的传输和部署速度,是容器化应用部署中的一个重要实践。随着你深入探索Docker和容器技术,你将能够构建更高效、更安全的容器化应用。

10.2.3 拓展案例 2:为 Go 微服务创建 Docker Compose 环境

在微服务架构中,通常需要同时管理多个服务。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过使用Docker Compose,你可以使用YAML文件来配置应用的服务,并且通过一个简单的命令来启动和停止所有服务。

功能描述

假设我们有两个Go微服务:一个是用户服务,用于处理用户的注册和登录请求;另一个是产品服务,用于管理产品信息。我们将使用Docker Compose来定义这两个服务,并确保它们可以在同一网络中相互通信。

步骤一:准备用户服务和产品服务

为了简化,我们将为用户服务和产品服务各自创建一个简单的HTTP服务器。每个服务都监听不同的端口,并提供基本的RESTful API。

用户服务(UserService):

// userService/main.go
package main
import (
    "fmt"
    "net/http"
)
func main() {
    http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "User service is up!")
    })
    fmt.Println("User service listening on port 8081...")
    http.ListenAndServe(":8081", nil)
}

产品服务(ProductService):

// productService/main.go
package main
import (
    "fmt"
    "net/http"
)
func main() {
    http.HandleFunc("/products", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Product service is up!")
    })
    fmt.Println("Product service listening on port 8082...")
    http.ListenAndServe(":8082", nil)
}

步骤二:编写 Dockerfile

为每个服务编写一个Dockerfile。由于这两个服务结构类似,Dockerfile也会非常相似。

# Dockerfile
FROM golang:1.16-alpine
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o service
EXPOSE 8081 # 对于用户服务
# EXPOSE 8082 # 对于产品服务
CMD ["./service"]

请根据实际服务调整EXPOSE行。

步骤三:编写 Docker Compose 文件

创建docker-compose.yml文件来定义用户服务和产品服务。

version: '3.8'
services:
  user-service:
    build:
      context: ./userService
      dockerfile: Dockerfile
    ports:
      - "8081:8081"
  product-service:
    build:
      context: ./productService
      dockerfile: Dockerfile
    ports:
      - "8082:8082"

这个docker-compose.yml文件定义了两个服务:user-serviceproduct-service。它们分别映射了对应的端口到宿主机,以便你可以从宿主机访问这些服务。

步骤四:启动服务

在包含docker-compose.yml文件的目录中运行以下命令来构建和启动服务:

docker-compose up --build

这将根据每个服务的Dockerfile构建镜像,然后启动容器。--build选项确保在启动服务之前构建或重新构建镜像。

测试服务

一旦服务启动,你可以通过访问http://localhost:8081/usershttp://localhost:8082/products来测试用户服务和产品服务是否正常运行。

通过这个拓展案例,你已经学会了如何使用Docker Compose来定义和管理多个Go微服务。Docker Compose不仅简化了多容器应用的开发和测试流程,还提供了一种在生产环境中部署和扩展服务的有效方法。随着你对Docker Compose的进一步探索,你将能够更加灵活和高效地部署复杂的微服务架构。

10.3 云原生技术栈与 Go - Go 语言在云上的航行

10.3.1 基础知识讲解

云原生技术是指那些为开发者提供构建和运行可扩展应用程序在现代动态环境中(如公有云、私有云和混合云)的技术集合。这些技术使得应用更加灵活、可维护,并易于扩展。

云原生技术栈的关键组件包括:

  • 容器化:容器提供了一种轻量级的、一致的软件打包方式,使应用在不同的计算环境中运行得更加可靠。
  • 微服务架构:通过将应用拆分为一组小服务,微服务架构使得应用更容易开发和扩展。
  • 声明式自动化:使用Kubernetes等工具自动管理容器化应用,实现自我修复、自动扩展和滚动更新等。
  • DevOps和持续交付:云原生鼓励更快的迭代速度和更高的部署频率,通过自动化的构建、测试和部署来实现。

Go 在云原生中的角色

Go语言因其简单、高效和强大的并发支持,在云原生生态系统中占据了重要地位。许多关键的云原生项目,如Kubernetes、Docker和Istio,都是用Go编写的。Go的这些特性使其成为开发高性能、可扩展的云原生应用的理想选择。

10.3.2 重点案例:Go 微服务在 Kubernetes 上的部署

让我们通过一个具体的示例来演示如何将Go编写的微服务容器化并部署到Kubernetes集群上。这个过程涵盖了应用的容器化、创建Docker镜像、推送到镜像仓库,以及编写和应用Kubernetes部署配置。

步骤一:准备 Go 微服务

首先,我们复用之前创建的简单HTTP服务器代码,该服务监听8080端口并返回欢迎消息。

main.go:

package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Kubernetes World!")
}
func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Starting server on port 8080...")
    http.ListenAndServe(":8080", nil)
}

步骤二:容器化 Go 微服务

为微服务创建一个Dockerfile:

# 使用Go官方镜像作为构建环境
FROM golang:1.16-alpine AS build
# 设置工作目录
WORKDIR /app
# 复制并下载依赖
COPY go.mod ./
COPY go.sum ./
RUN go mod download
# 复制源代码并编译
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o webapp .
# 使用scratch作为运行环境
FROM scratch
COPY --from=build /app/webapp /webapp
EXPOSE 8080
ENTRYPOINT ["/webapp"]

构建并推送镜像到Docker Hub或其他容器镜像仓库:

docker build -t yourusername/go-webapp-k8s .
docker push yourusername/go-webapp-k8s

请确保替换yourusername为你的Docker Hub用户名。

步骤三:编写 Kubernetes 部署配置

创建webapp-deployment.yaml文件,定义微服务的部署和服务对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-webapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-webapp
  template:
    metadata:
      labels:
        app: go-webapp
    spec:
      containers:
      - name: go-webapp
        image: yourusername/go-webapp-k8s
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: go-webapp-service
spec:
  type: LoadBalancer
  ports:
  - port: 8080
    targetPort: 8080
  selector:
    app: go-webapp

替换image字段中的yourusername/go-webapp-k8s为你的镜像名称。

步骤四:部署到 Kubernetes

使用kubectl应用部署配置,将应用部署到Kubernetes集群:

kubectl apply -f webapp-deployment.yaml

查看部署状态和服务:

kubectl get deployments
kubectl get services

步骤五:访问微服务

如果你在本地使用Minikube,使用以下命令找到服务的URL:

minikube service go-webapp-service --url

在浏览器中访问该URL,或使用curl命令,你应该能够看到“Hello, Kubernetes World!”的消息。

通过这个案例,你已经学会了如何将Go微服务容器化并在Kubernetes上部署。这不仅展示了从代码到部署的完整流程,还体现了云原生应用开发中的关键实践,包括容器化、微服务架构和声明式自动化部署。随着你深入探索Kubernetes和云原生技术栈,你将能够构建和管理更加复杂和强大的应用。

10.3.3 拓展案例 1:使用 Helm 管理 Go 应用的 Kubernetes 部署

Helm是Kubernetes的包管理器,它使得定义、安装和升级Kubernetes应用变得简单。通过Helm,我们可以将应用及其依赖打包到一个chart中,然后通过简单的命令来部署和管理这个chart。这个案例将展示如何使用Helm来管理之前创建的Go微服务的部署。

步骤一:创建 Helm Chart

首先,确保你已经安装了Helm。然后在命令行中执行以下命令来创建一个新的Helm chart:

helm create go-webapp-chart

这将在当前目录下创建一个名为go-webapp-chart的文件夹,里面包含了chart的初始文件和文件夹结构。

步骤二:定制化 Chart

定制化你的Helm chart来适配Go微服务。修改go-webapp-chart/values.yaml文件来定义一些默认配置,比如镜像的仓库和标签:

# values.yaml
replicaCount: 2
image:
  repository: yourusername/go-webapp-k8s
  pullPolicy: IfNotPresent
  # tag: "If you have a specific version"
service:
  type: LoadBalancer
  port: 8080

确保将image.repository的值替换为你的容器镜像地址。

接下来,修改go-webapp-chart/templates/deployment.yaml文件,确保它使用values.yaml中定义的值:

# deployment.yaml 中的部分内容
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
        - name: go-webapp
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          ports:
            - containerPort: {{ .Values.service.port }}

步骤三:打包和部署 Chart

在chart目录(go-webapp-chart)中,打包你的chart:

helm package .

然后,使用Helm安装你的chart到Kubernetes集群:

helm install go-webapp-release ./go-webapp-chart-0.1.0.tgz

这里go-webapp-release是release的名字,你可以根据需要自定义。

步骤四:验证部署

使用以下命令来检查release的状态:

helm list
kubectl get services

找到你的服务的外部IP或端口(如果你在本地如Minikube上测试,使用minikube service go-webapp-service --url获取URL),然后在浏览器中访问或使用curl命令来验证服务是否正常运行。

步骤五:更新和升级

如果需要更新应用配置,你可以修改values.yaml文件,然后使用以下命令更新部署:

helm upgrade go-webapp-release ./go-webapp-chart

通过这个案例,你学会了如何使用Helm来管理Go应用的Kubernetes部署。Helm不仅简化了Kubernetes应用的部署流程,还提供了版本控制、回滚等功能,极大地提高了云原生应用管理的效率和可靠性。随着你对Helm的深入学习,你将能够更加高效地管理复杂的Kubernetes应用。

10.3.4 拓展案例 2:实现 Go 微服务的自动扩展

Kubernetes的水平自动扩展(HPA,Horizontal Pod Autoscaler)允许根据监测到的CPU使用率或其他选定的度量自动增加或减少Pod的数量。这个案例将演示如何为Go编写的微服务实现自动扩展功能,以确保应用能够根据负载自动调整其运行实例的数量。

步骤一:准备 Go 微服务

假设我们已经有一个Go微服务,它已经被容器化并部署到Kubernetes上,如之前的“Go微服务在Kubernetes上的部署”案例所示。

步骤二:为微服务启用资源请求和限制

为了使HPA能够根据CPU使用情况自动扩展Pod,首先需要在微服务的Deployment配置中指定每个容器的资源请求和限制。编辑你的deployment.yaml文件,为containers部分添加resources字段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-webapp
spec:
  ...
  template:
    ...
    spec:
      containers:
      - name: go-webapp
        image: yourusername/go-webapp-k8s
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
          limits:
            cpu: "200m"
            memory: "200Mi"
        ports:
        - containerPort: 8080

这里的requests字段指定了每个Pod启动时的最小资源需求,而limits字段则指定了Pod可以消耗的最大资源量。

步骤三:创建 HPA

接下来,使用kubectl命令创建HPA,以自动扩展你的Go微服务。以下命令创建一个HPA,它将根据目标Pod的平均CPU使用率自动调整Pod的数量。当CPU使用率超过50%时,Kubernetes会尝试增加Pod的数量,直到最多10个Pod。

kubectl autoscale deployment go-webapp --cpu-percent=50 --min=1 --max=10

步骤四:测试自动扩展

为了测试HPA,你可以通过增加向微服务发送的请求来人为增加负载。这可以通过编写简单的脚本不断请求你的服务来实现。

监控HPA和Pod的状态,以查看是否根据CPU负载自动调整了Pod的数量:

kubectl get hpa
kubectl get pods

步骤五:调整 HPA 策略(可选)

根据应用的具体需求,你可能需要调整HPA的行为。这可以通过编辑HPA的配置来实现:

kubectl edit hpa go-webapp

在编辑器中,你可以修改例如--cpu-percent--min/--max参数等HPA的配置项。

通过这个案例,你学会了如何为Go编写的微服务实现Kubernetes的自动扩展功能。利用HPA,你的应用可以根据实时负载自动调整资源使用,从而保证应用的性能和响应速度。这是构建高可用云原生应用的关键技术之一,随着你对Kubernetes和云原生技术栈的深入学习,你将能够构建更加灵活和强大的应用系统。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
85 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
2月前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战####
本文探讨了云原生技术在现代企业IT架构中的关键作用,分析了其带来的优势和面临的主要挑战。通过实际案例分析,揭示了如何有效应对这些挑战,以实现业务敏捷性和技术创新的平衡。 ####
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
11天前
|
监控 编译器 Go
1 行命令引发的Go应用崩溃
这篇文章分析了Go编译时插桩工具导致go build -race竞态检测产生崩溃的原因。
|
2月前
|
Kubernetes Cloud Native 物联网
云原生技术在现代软件开发中的应用与挑战####
本文探讨了云原生技术的兴起背景、核心理念及其在现代软件开发中的广泛应用。通过具体案例分析,揭示了云原生架构如何促进企业数字化转型,并指出了在实施过程中面临的主要挑战及应对策略。 ####
|
17天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 12 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 12 月产品动态。
|
22天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 12 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
110 12
|
2月前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建