当前位置: 首页 > article >正文

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

概述

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


http://www.kler.cn/a/535078.html

相关文章:

  • mounted钩子函数里如何操作子组件的DOM?
  • 安卓开发,Reason: java.net.SocketTimeoutException: Connect timed out
  • SpringUI Web高端动态交互元件库
  • C++ 学习:深入理解 Linux 系统中的冯诺依曼架构
  • 【自学笔记】Agent的重点知识点-持续更新
  • 哈夫曼树原理及其C语言实现
  • LeetCode 72.编辑距离
  • UE5 蓝图学习计划 - Day 14:搭建基础游戏场景
  • MySQL InnoDB引擎 高度为3的B+树,可以存储的数据量
  • 高级java每日一道面试题-2025年01月30日-框架篇[SpringBoot篇]-如何理解 Spring Boot 配置加载顺序 ?
  • 树欲静而凤不止
  • redis之RDB持久化过程
  • Spring Boot整合MQTT
  • 2025游戏行业的趋势预测
  • GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读
  • Docker镜像管理:掌握save/load与export/import的精髓
  • 90.子集||
  • python学opencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理
  • node.js使用mysql2对接数据库
  • 【分布式理论五】分布式调用(3):服务注册与发现
  • Python批量重命名文件的实用案例
  • 【Linux高级IO】五种IO模型
  • 手写MVVM框架-渲染v-for列表(修改List)
  • VUE 集成企微机器人通知
  • hot100(8)
  • 《工业4.0时代?!》