GoFrame 微服务脚手架模块 (v2.8.x)

时间:2025-02-07 07:34:03

概述

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

最佳实践

  1. 复用 Client 对象
  2. 选择合适的注册发现组件
  3. 利用上下文传递自定义数据
  4. 根据需求选择负载均衡策略

结论

GoFrame 的微服务脚手架提供了灵活、高效的微服务开发工具,支持多种服务治理特性,帮助开发者快速构建可靠的分布式系统。