Go 语言除了 RPC(如 gRPC、Thrift 等)之外,确实有多种方式可以作为公共服务对外提供。以下是几种常见的方式:

1. RESTful API (HTTP/JSON)

最传统和广泛使用的方式,使用标准库 net/http 或框架(Gin、Echo、Fiber 等):

go

复制

// 使用标准库
http.HandleFunc("/api/users", handleUsers)
http.ListenAndServe(":8080", nil)

// 或使用 Gin 框架
r := gin.Default()
r.GET("/api/users", getUsers)
r.Run(":8080")

优点:简单、通用、易于调试、浏览器/移动端都支持
缺点:相比 RPC 性能稍低,需要手动处理序列化


2. GraphQL

使用 gqlgen 等库提供灵活的查询接口:

go

复制

// 定义 schema,自动生成代码
// 客户端可以精确请求需要的数据字段

优点:客户端决定返回数据结构,减少过度获取
缺点:学习成本较高,缓存策略复杂


3. WebSocket / SSE (Server-Sent Events)

用于实时双向通信或服务器推送:

go

复制

// WebSocket 示例(使用 gorilla/websocket)
upgrader := websocket.Upgrader{}
conn, _ := upgrader.Upgrade(w, r, nil)
// 双向通信

适用场景:聊天应用、实时通知、在线游戏、股票行情


4. 消息队列 (Message Queue)

通过中间件进行异步通信,而非直接调用:

  • KafkaRabbitMQNATSRocketMQ

  • 使用 Go 客户端发布/订阅消息

go

复制

// NATS 示例
nc, _ := nats.Connect(nats.DefaultURL)
nc.Publish("orders.created", data)
nc.Subscribe("orders.created", func(m *nats.Msg) {
    // 处理消息
})

优点:解耦、削峰填谷、高可靠
缺点:实时性不如直接调用,需要处理幂等性


5. gRPC-Gateway / Twirp

将 gRPC 服务同时暴露为 HTTP/JSON 接口:

go

复制

// gRPC-Gateway 自动生成 RESTful 代理
// 一份 proto 定义,同时支持 gRPC 和 HTTP

6. 云原生标准接口

  • CloudEvents:标准化的事件格式

  • OpenAPI/Swagger:API 文档和生成

  • Dapr:分布式应用运行时,抽象通信层


7. 传统 Socket / TCP 自定义协议

go

复制

// 纯 TCP 服务
listener, _ := net.Listen("tcp", ":8080")
conn, _ := listener.Accept()
// 自定义协议处理

适用场景:游戏服务器、高频交易系统、需要极致性能


对比总结

表格

复制

方式 性能 易用性 场景 浏览器支持
RESTful API ⭐⭐⭐ ⭐⭐⭐⭐⭐ 通用 Web
gRPC ⭐⭐⭐⭐⭐ ⭐⭐⭐ 微服务内部 ❌ (需 gRPC-Web)
GraphQL ⭐⭐⭐ ⭐⭐⭐ 复杂查询
WebSocket ⭐⭐⭐⭐ ⭐⭐⭐⭐ 实时通信
消息队列 ⭐⭐⭐ ⭐⭐⭐ 异步处理 N/A
纯 TCP ⭐⭐⭐⭐⭐ ⭐⭐ 特殊场景

实际建议

  • 对外暴露给浏览器/第三方RESTful APIGraphQL

  • 微服务内部通信gRPC消息队列

  • 实时场景WebSocketSSE

  • 需要同时支持多种客户端gRPC + Gateway

你的具体场景是什么?(内部微服务、对外 Open API、实时应用等)我可以给出更有针对性的建议。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐