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

相关推荐
衍余未了1 小时前
k8s除了主server服务器可正常使用kubectl命令,其他节点不能使用原因,以及如何在其他k8s节点正常使用kubectl命令??
云原生·容器·kubernetes
To_再飞行1 小时前
K8s 存储配置资源
linux·云原生·容器·kubernetes
qb2 小时前
vue3.5.18源码-编译-入口
前端·vue.js·架构
To_再飞行3 小时前
K8s 调度管理
linux·云原生·kubernetes
milanyangbo3 小时前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式·后端·云原生·架构
失散133 小时前
分布式专题——1.1 Redis单机、主从、哨兵、集群部署
java·数据库·redis·分布式·架构
刘一说3 小时前
Linux调试命令速查:Java/微服务必备
java·linux·微服务
刘一说3 小时前
Spring Boot+Nacos+MySQL微服务问题排查指南
spring boot·mysql·微服务
2301_779503764 小时前
MySQL集群高可用架构---mysql高可用之组复制 (MGR)
数据库·mysql·架构