概述
GoFrame 框架提供了丰富的微服务组件和易用的 GRPC 脚手架模块。脚手架由 grpcx
社区包实现,包含多个核心模块。
服务端 (Server)
基本使用
服务端由 grpcx.Server
模块维护,用于创建和管理服务端对象。
package main
import (
"github.com/gogf/gf/contrib/rpc/grpcx/v2"
"github.com/gogf/gf/example/rpc/grpcx/basic/controller"
)
func main() {
s := grpcx.Server.New()
controller.Register(s)
s.Run()
}
注意事项
- 服务端创建通常结合配置文件使用
- 推荐查看服务端配置章节获取更多详细信息
客户端 (Client)
基本使用
客户端由 grpcx.Client
模块维护,用于创建和管理客户端对象。
package main
import (
"github.com/gogf/gf/contrib/rpc/grpcx/v2"
"github.com/gogf/gf/example/rpc/grpcx/basic/protobuf"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
var (
ctx = gctx.New()
conn = grpcx.Client.MustNewGrpcClientConn("demo")
client = protobuf.NewGreeterClient(conn)
)
res, err := client.SayHello(ctx, &protobuf.HelloRequest{Name: "World"})
if err != nil {
g.Log().Error(ctx, err)
return
}
g.Log().Debug(ctx, "Response:", res.Message)
}
重要提示
- 大多数场景下,服务间通信使用服务名称
-
建议复用 Client 对象,而非每次都创建新对象
- 提高效率
- 降低资源使用
- 对 GC 更友好
上下文管理 (Ctx)
grpcx.Ctx
模块用于实现客户端与服务端之间的自定义数据传递。
常用方法
NewIncoming(ctx context.Context, data ...g.Map) context.Context
NewOutgoing(ctx context.Context, data ...g.Map) context.Context
IncomingToOutgoing(ctx context.Context, keys ...string) context.Context
IncomingMap(ctx context.Context) *gmap.Map
OutgoingMap(ctx context.Context) *gmap.Map
使用示例
// 客户端:设置传出数据
ctx := grpcx.Ctx.NewOutgoing(gctx.New(), g.Map{
"UserId": "1000",
"UserName": "john",
})
// 服务端:接收传入数据
m := grpcx.Ctx.IncomingMap(ctx)
g.Log().Infof(ctx, `incoming data: %v`, m.Map())
数据传递特点
-
Outgoing
:客户端将要传递给服务端的自定义数据 -
Incoming
:服务端接收到的客户端数据 - 包含框架内置信息,如链路跟踪、客户端版本等
负载均衡 (Balancer)
grpcx.Balancer
模块管理多服务端地址的请求策略。
默认策略
- 默认使用轮询策略
- 可通过
grpcx.Balancer.WithRandom()
等方法自定义策略
随机策略示例
conn := grpcx.Client.MustNewGrpcClientConn("demo", grpcx.Balancer.WithRandom())
服务注册发现 (Resolver)
grpcx.Resolver
模块用于解析服务名称。
默认实现
- 默认使用本地文件系统(仅用于测试)
- 生产环境推荐使用 etcd、consul 等组件
etcd 注册示例
// 服务端
grpcx.Resolver.Register(etcd.New("127.0.0.1:2379"))
// 客户端
grpcx.Resolver.Register(etcd.New("127.0.0.1:2379"))
conn := grpcx.Client.MustNewGrpcClientConn("demo")
最佳实践
- 复用 Client 对象
- 选择合适的注册发现组件
- 利用上下文传递自定义数据
- 根据需求选择负载均衡策略
结论
GoFrame 的微服务脚手架提供了灵活、高效的微服务开发工具,支持多种服务治理特性,帮助开发者快速构建可靠的分布式系统。