共419行

go web,微服务,一般使用的协议和数据结构是什么

2026-05-26 18:03:08

Go Web + 微服务:主流协议 & 数据结构(实战常用)

一、对外/网关层:HTTP/HTTPS(最主流)

  1. 协议
  1. 数据结构(传输格式)

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. 主流 RPC 协议 & 对应数据格式

(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)

 

补充:选型建议

推荐一些Go Web微服务的优秀框架

下面按「Web API 框架」「微服务RPC/全栈框架」「配套生态」三类给你推荐,直接附选型结论。

 

一、Web API 框架(对外HTTP接口,90%微服务首选)

  1. Gin(★★★★★ 首选)

go
r := gin.Default()
r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{"msg":"pong"}) })
r.Run(":8080")
 

  1. Echo(★★★★☆ 平衡之选)
  1. Fiber(★★★★☆ 极致性能)
  1. Chi(★★★★ 轻量标准库)

 

二、微服务全栈/RPC框架(服务间调用+治理)

  1. go-zero(★★★★★ 国内首选,CNCF)
  1. Kratos(★★★★☆ B站开源,云原生)
  1. Kitex(★★★★☆ 字节开源,极致RPC)
  1. Go-Micro(★★★★ 老牌通用)

 

三、配套核心生态(必选)

 

四、选型结论(2026实战)

1. 90%中小微服务:Gin(HTTP)+ gRPC(内部RPC)+ GORM + Redis
2. 国内企业/高并发:go-zero(一体化,开箱即用)
3. 大型复杂微服务:Kratos(云原生+可观测)
4. 极致RPC性能:Kitex(字节生产验证)
5. 极简/标准库风格:Chi

可直接运行的最小项目骨架(Gin+gRPC+goctl示例)

这里提供两套最小可运行骨架:

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 协议文件
 

  1. 初始化模块 & 安装依赖

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
 

  1. 编写 Protobuf 文件  pb/user.proto 

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);
}
 

  1. 生成 gRPC 代码

bash
protoc --go_out=. --go-grpc_out=. pb/user.proto
 

执行后会自动生成: pb/user_grpc.pb.go 、 pb/user.pb.go 

  1. 主程序  main.go (同时启 HTTP + gRPC)

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()
}
 

  1. 运行 & 测试

bash
go run main.go
 

访问地址:

 

二、方案二:go-zero 一体化微服务(企业常用)

go-zero 内置 HTTP + gRPC + 服务治理 + 代码生成,开箱即用。

  1. 安装 goctl 工具

bash
go install github.com/zeromicro/go-zero/tools/goctl@latest
 

  1. 一键生成 HTTP + RPC 双服务骨架

bash

创建项目目录

mkdir gozero-demo && cd gozero-demo

生成 API 服务(对外 HTTP)

goctl api new user

生成 RPC 服务(内部调用)

goctl rpc new user
 

生成后目录结构完整,包含路由、handler、logic、proto、配置文件。

  1. 直接运行

启动 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  数据库、链路追踪。