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

概述

GoFrame 框架提供了丰富的微服务组件和易用的 GRPC 脚手架模块。脚手架由 grpcx 社区包实现,包含多个核心模块。

服务端 (Server)

基本使用

服务端由 grpcx.Server 模块维护,用于创建和管理服务端对象。

go 复制代码
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 模块维护,用于创建和管理客户端对象。

go 复制代码
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

使用示例

go 复制代码
// 客户端:设置传出数据
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() 等方法自定义策略

随机策略示例

go 复制代码
conn := grpcx.Client.MustNewGrpcClientConn("demo", grpcx.Balancer.WithRandom())

服务注册发现 (Resolver)

grpcx.Resolver 模块用于解析服务名称。

默认实现

  • 默认使用本地文件系统(仅用于测试)
  • 生产环境推荐使用 etcd、consul 等组件

etcd 注册示例

go 复制代码
// 服务端
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 的微服务脚手架提供了灵活、高效的微服务开发工具,支持多种服务治理特性,帮助开发者快速构建可靠的分布式系统。

相关推荐
海兰19 小时前
【 Kafka进阶3】Apache Kafka 分布式事件流平台:架构原理与微服务解耦机制简要分析
分布式·架构·kafka
江畔柳前堤19 小时前
LLM + Agent 模型效果评估:从入门到工业级体系构建的完整指南
开发语言·人工智能·自然语言处理·chatgpt·架构·json·batch
Rain的Java大神之路20 小时前
如何避免订单重复提交
java·redis·后端·面试·架构·rabbitmq·rocketmq
chaochaoIT12320 小时前
2026中小企业进销存技术选型标准|从架构、数据、运维多维度商用能力核验
大数据·运维·架构·能源·制造·零售·交通物流
ZYJCSZKJ20 小时前
面向东盟多语种场景的AIGEO与AI数字人融合架构及区域实践
人工智能·架构·#ai数字人·aigeo
fiveym1 天前
05 - 黄金镜像与全自动还原
运维·服务器·架构
小马9261 天前
插件化 Agent 架构:DeepSeek Harness 如何让智能体重构不再需要 Fork
架构·deepseek·agent架构
雨白1 天前
深入理解 Java/Kotlin 反射、注解与泛型:从原理到实战
android·架构
Python私教1 天前
多个项目怎么安全合并?先适配,再切换
后端·python·架构
hey you~1 天前
呼叫中心系统全链路自研架构:如何实现99.999%通话高可用
架构·故障切换·多活架构·呼叫中心高可用·全链路自研·通信paas