在企业级微服务架构中,如何让流量既高效、安全,又可观测,一直是每位 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 update2. 创建命名空间
kubectl create ns apisix3. 安装 APISIX
helm install apisix apisix/apisix --create-namespace --namespace apisix4. 验证 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:day802. 创建 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. 部署appkubectl apply -f app.yaml4. 确认 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小程序 “加班计”)
如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。