共419行
2026-05-26 18:03:08
一、对外/网关层:HTTP/HTTPS(最主流)
1. JSON(99% 业务首选)
Go 对应结构体: struct + json 标签go
type User struct {
ID int json:"id"
Name string json:"name"
}
2. Form-Data / x-www-form-urlencoded:表单、文件上传
3. XML:老旧系统对接,新项目极少用
二、微服务内部调用:RPC 系列(服务间通信)
Go 微服务内部跨服务调用优先 RPC,性能、序列化远优于 HTTP。
(1)gRPC(Go 生态第一首选)
(2)Thrift
(3)纯 TCP 自定义协议
三、消息队列(异步微服务/解耦)
微服务异步通信、削峰、事件驱动用 MQ:
1. 协议- Kafka:TCP 自定义协议
四、服务注册/配置/网关 配套协议
五、最简总结(面试/实战直接记)
1. 前端 ↔︎ 网关/应用
协议:HTTP/HTTPS
数据:JSON
2. 微服务 内部互相调用
主流:gRPC + Protobuf
兼容老系统:HTTP + JSON
3. 异步事件/解耦(MQ)
协议:Kafka/RabbitMQ 私有 TCP/AMQP
数据:JSON
4. 数据结构对应 Go:- JSON → Go struct (json tag)
补充:选型建议
下面按「Web API 框架」「微服务RPC/全栈框架」「配套生态」三类给你推荐,直接附选型结论。
一、Web API 框架(对外HTTP接口,90%微服务首选)
go
r := gin.Default()
r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{"msg":"pong"}) })
r.Run(":8080")
二、微服务全栈/RPC框架(服务间调用+治理)
三、配套核心生态(必选)
四、选型结论(2026实战)
1. 90%中小微服务:Gin(HTTP)+ gRPC(内部RPC)+ GORM + Redis
2. 国内企业/高并发:go-zero(一体化,开箱即用)
3. 大型复杂微服务:Kratos(云原生+可观测)
4. 极致RPC性能:Kitex(字节生产验证)
5. 极简/标准库风格:Chi
这里提供两套最小可运行骨架:
1. 组合方案:Gin(HTTP 对外) + 原生gRPC(服务内调用)(通用经典架构)
2. 一体化方案:go-zero 最简微服务(国内生产主流,一键生成)
环境前置:
bash
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
一、方案一:Gin + 原生gRPC 混合微服务骨架
项目结构
plaintext
demo-service/
├── go.mod
├── go.sum
├── main.go # 入口:同时启动 HTTP + gRPC
└── pb/
└── user.proto # gRPC 协议文件
bash
mkdir demo-service && cd demo-service
go mod init demo-service
go get github.com/gin-gonic/gin
go get google.golang.org/grpc
go get google.golang.org/protobuf
protobuf
syntax = "proto3";
package pb;
option go_package = "./pb;pb";
// 请求体
message GetUserReq {
int64 id = 1;
}
// 响应体
message GetUserResp {
string name = 1;
int32 age = 2;
}
// gRPC 服务
service UserService {
rpc GetUser(GetUserReq) returns (GetUserResp);
}
bash
protoc --go_out=. --go-grpc_out=. pb/user.proto
执行后会自动生成: pb/user_grpc.pb.go 、 pb/user.pb.go
go
package main
import (
"context"
"fmt"
"net"
"net/http"
"time"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
"demo-service/pb"
)
// 实现 gRPC 服务
type userServer struct {
pb.UnimplementedUserServiceServer
}
func (u *userServer) GetUser(ctx context.Context, req *pb.GetUserReq) (*pb.GetUserResp, error) {
// 模拟业务逻辑
return &pb.GetUserResp{
Name: "张三",
Age: 20,
}, nil
}
// 启动 gRPC 服务
func startGRPC() {
lis, err := net.Listen("tcp", ":9000")
if err != nil {
panic(err)
}
s := grpc.NewServer()
pb.RegisterUserServiceServer(s, &userServer{})
fmt.Println("gRPC server run on :9000")
if err := s.Serve(lis); err != nil {
panic(err)
}
}
// 启动 Gin HTTP 服务(HTTP 调用内部 gRPC)
func startHTTP() {
r := gin.Default()
// HTTP 接口:对外暴露,内部调用 gRPC
r.GET("/user/:id", func(c *gin.Context) {
// 连接本地 gRPC 服务
conn, err := grpc.Dial("127.0.0.1:9000", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
c.JSON(500, gin.H{"error": "connect grpc failed"})
return
}
defer conn.Close()
client := pb.NewUserServiceClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 调用 gRPC 方法
resp, err := client.GetUser(ctx, &pb.GetUserReq{Id: 1})
if err != nil {
c.JSON(500, gin.H{"error": "call grpc failed"})
return
}
c.JSON(200, gin.H{
"name": resp.Name,
"age": resp.Age,
})
})
fmt.Println("HTTP server run on :8080")
_ = r.Run(":8080")
}
func main() {
// 协程启动 gRPC
go startGRPC()
// 主线程启动 HTTP
startHTTP()
}
bash
go run main.go
访问地址:
二、方案二:go-zero 一体化微服务(企业常用)
go-zero 内置 HTTP + gRPC + 服务治理 + 代码生成,开箱即用。
bash
go install github.com/zeromicro/go-zero/tools/goctl@latest
bash
mkdir gozero-demo && cd gozero-demo
goctl api new user
goctl rpc new user
生成后目录结构完整,包含路由、handler、logic、proto、配置文件。
启动 RPC 服务
bash
cd user/rpc
go run user.go -f etc/user.yaml
启动 HTTP API 服务
新开终端:
bash
cd user/api
go run user.go -f etc/user.yaml
访问默认接口即可测试,框架已封装熔断、限流、日志、监控、服务发现等能力。
补充说明
1. 方案一适用场景
自主掌控架构、只想用 Gin + 原生 gRPC、学习/小型项目、原有系统改造。
2. 方案二适用场景
企业级微服务、快速迭代、需要完整服务治理、团队协作。
3. 扩展方向:后续可自行接入 etcd 服务注册、 Redis 缓存、 GORM 数据库、链路追踪。