在企业级微服务架构中,如何让流量既高效、安全,又可观测,一直是每位 Go 工程师关心的问题。今天,我们将在本地 Kind 集群中,手把手搭建一个APISIX 网关 + Linkerd 微服务网格的完整实践环境,让你轻松体验高可用、高可观测、零侵入的微服务架构。

从客户端发出的请求,通过 APISIX 作为南北向网关进入集群,再由 Linkerd sidecar 自动管理东西向流量,实现mTLS 加密、熔断保护和指标采集。整个过程无需修改业务代码,Gin、Go 服务可以专注于业务逻辑,而微服务网格在后台默默保障流量安全与稳定。

无论你是初次接触 APISIX、Linkerd,还是希望在本地快速复现企业级微服务架构,这篇文章都将带你几分钟从零搭建到可访问的完整环境

一、整体架构回顾

在 Kind 里的目标拓扑是这样的:

Client
  |
  v
APISIX (Gateway / Ingress)
  |
  v
K8s Service
  |
  v
Linkerd Proxy (sidecar)
  |
  v
Backend Pod (User / Live / Msg / Media)

核心点:

  • APISIX 不进 mesh
  • 业务服务进 Linkerd
  • APISIX 通过普通 Service 访问后端,Linkerd 在 sidecar 层做 mTLS、熔断、可观测

二、Kind集群准备

参考地址:每日一Go-64、Go工程师必看!30分钟在Docker Desktop打造高可用K8s集群实战

三、在 Kind 里安装 APISIX 

1. 添加 Helm 仓库

helm repo add apisix https://charts.apiseven.com
helm repo update

2. 创建命名空间

kubectl create ns apisix

3. 安装 APISIX 

helm install apisix apisix/apisix --create-namespace --namespace apisix

图片

4. 验证 APISIX 是否启动成功

kubectl get pods -n apisix

图片

四、部署一个被 Linkerd 管理的后端服务

1. 创建gin-app

package main
import (
    "github.com/gin-gonic/gin"
)
// main 函数是应用程序的入口点
// 创建一个 Gin 路由器并定义 API 端点
func main() {
    // 创建 Gin 路由器,默认包含 Logger 和 Recovery 中间件
    r := gin.Default()
    // 定义 GET /user/:id 路由
    // 该路由处理用户信息查询请求
    r.GET("/:id", func(c *gin.Context) {
        // 返回 JSON 响应,包含应用名称信息
        c.JSON(200, gin.H{
            "message": "golang-per-day-80-user",
        })
    })
    // 启动 HTTP 服务器,监听 8080 端口
    r.Run(":8080")
}
# 第一阶段:编译阶段
# 使用 golang:1.25.5-alpine 作为基础镜像,体积小且包含 Go 编译环境
FROM golang:1.25.5-alpine AS builder
# 设置环境变量
# GO111MODULE=on:启用 Go 模块
# GOPROXY:设置 Go 模块代理,国内环境使用 goproxy.cn 加快下载速度
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct
# 设置工作目录
WORKDIR /app
# 复制依赖文件并下载(利用 Docker 缓存)
# 先复制 go.mod 和 go.sum,只有当依赖文件变化时才会重新下载
COPY go.mod go.sum ./
RUN go mod download
# 复制源代码并编译
COPY . .
# CGO_ENABLED=0:禁用 CGO,确保静态链接,能在 alpine 下运行
# GOOS=linux GOARCH=amd64:设置目标操作系统和架构
# go build -o main .:编译生成名为 main 的可执行文件
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .
# 第二阶段:运行阶段
# 使用 alpine:latest 作为基础镜像,体积非常小
FROM alpine:latest
# 安装基础工具(可选)
# ca-certificates:包含 SSL 证书,用于 HTTPS 连接
RUN apk --no-cache add ca-certificates
# 设置工作目录
WORKDIR /root/
# 从编译阶段复制二进制文件
# 使用 --from=builder 从之前的构建阶段复制文件
COPY --from=builder /app/main .
# 暴露应用监听的端口
# 8080:Gin 服务器监听的端口
EXPOSE 8080
# 运行应用
# 启动编译生成的 main 可执行文件
CMD ["./main"]
docker build -t imoowi/golang_per_day:day80 .
docker push imoowi/golang_per_day:day80

图片

2. 创建 app.yaml

# Kubernetes Deployment 配置
# 定义 user-service 应用的部署
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service  # 部署名称
  namespace: default   # 命名空间
spec:
  replicas: 1          # 副本数
  selector:
    matchLabels:
      app: user        # 标签选择器,匹配 app=user 的 Pod
  template:
    metadata:
      labels:
        app: user      # Pod 标签
      annotations:
        linkerd.io/inject: enabled  # 启用 Linkerd 服务网格注入
    spec:
      containers:
      - name: app      # 容器名称
        image: imoowi/golang_per_day:day81  # 容器镜像
        imagePullPolicy: IfNotPresent  # 镜像拉取策略
        ports:
        - containerPort: 8080  # 容器暴露的端口
---
# Kubernetes Service 配置
# 为 user-service 提供网络访问
apiVersion: v1
kind: Service
metadata:
  name: user-service  # Service 名称
spec:
  selector:
    app: user        # 标签选择器,匹配 app=user 的 Pod
  ports:
  - port: 8080        # Service 暴露的端口
    targetPort: 8080  # 目标 Pod 端口03. 部署app
kubectl apply -f app.yaml

4. 确认 sidecar

kubectl get pod -o jsonpath='{.items[0].spec.containers[*].name}'

图片

5. 检查部署情况

kubectl port-forward svc/user-service 8080:8080 

图片

五、配置 APISIX 路由转发到 Linkerd 服务

1. apisix-route.yaml

# APISIX 路由配置
# 定义从 APISIX API 网关到后端服务的路由规则
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: user-route  # 路由名称
  namespace: default  # 命名空间
spec:
  http:
  - name: user  # HTTP 路由名称
    match:
      paths:
      - /user/*  # 匹配路径,* 表示通配符
    backends:
    - serviceName: user-service  # 后端服务名称
      servicePort: 8080  # 后端服务端口

2. 部署

kubectl apply -f apisix-route.yaml

六、修改apisix-gateway端口映射

kubectl edit svc apisix-gateway -n apisix

找到类似这一段:

spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30643

改成你想要的 NodePort(30080):

spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080

保存退出即可。Kubernetes 会自动更新 Service。

访问 http://localhost:30080/user/12即可获得正确返回。


*源码地址*

1、公众号“Codee君”回复“源码”获取源码

2、https://pan.baidu.com/s/1B6pgLWfSgMngVeFfSTcPdg?pwd=jc1s

3、加班费计算器:(vx小程序 “加班计”)


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!


codeejun
1 声望0 粉丝