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

goweb3系列解析6:gorpc 模块解析gorpc 是 goweb3 项目中基于 go-micro 框架构建的 gRPC 通信模块,提供服务端启动、客户端调用、服务注册与发现等微服务通信能力

gorpc 模块解析

gorpc是 goweb3 项目中基于go-micro框架构建的 gRPC 通信模块,提供服务端启动、客户端调用、服务注册与发现等完整的微服务通信能力。


一、模块架构

plainText

gorpc/ ├── server/ # 服务端 │ ├── main.go # 入口文件 │ ├── startgrpc/startgrpc.go # 启动封装 │ ├── register/grpc_register.go # 服务注册 │ └── handler/ # 业务处理器 ├── client/ # 客户端 │ ├── hello/hello_cli.go # 示例客户端 │ └── dbgorpc/ # 数据库RPC客户端 └── goconfig/gogrpc/ # 配置层 ├── gorpcserver/ # 服务端核心 ├── gorpcclient/ # 客户端核心 ├── gofacade/ # RPC门面 └── proto/ # Protobuf定义

二、核心组件详解

1. GogrpcServer - 服务端核心

go

type GogrpcServer struct { basedto.BaseEntitySingle registerGrpc IgogrpcRegister // 服务注册器 }

服务启动流程

go

func Start(reg IgogrpcRegister, dto *baseconfig.RpcServerDto) { // 1. 创建服务实例 gogrpcServer := NewGogrpcServer(reg) // 2. 运行服务 gogrpcServer.RunServer(dto) } func (server *GogrpcServer) RunServer(serverDto *baseconfig.RpcServerDto) { // 1. 初始化服务(注册到 etcd) service := server.Init(serverDto) // 2. 注册 Handler server.registerGrpc.RegisterGrpc(service) // 3. 启动服务 service.Run() }

服务初始化

go

func (server *GogrpcServer) Init(serverDto *baseconfig.RpcServerDto) micro.Service { // 1. 创建 etcd 注册中心 register := etcd.NewRegistry(func(options *registry.Options) { options.Addrs = strutil.Split(serverDto.EtcdHost, ",") }) // 2. 配置服务选项 opts := []micro.Option{ micro.Name(serverDto.ServerName), micro.Version(version), micro.RegisterTTL(time.Second * 90), // 服务过期时间 micro.RegisterInterval(time.Second * 30), // 心跳间隔 micro.Registry(register), micro.Address(":" + serverDto.ServerPort), } // 3. 创建服务 service := micro.NewService(opts...) service.Init() return service }
2. GorpcCli - 泛型客户端

go

type GorpcCli[S any] struct { rpcClient S // 泛型 RPC 客户端 RpcServiceName string // 服务名称 FuncNew func(name string, c client.Client) S // 客户端构造函数 }

客户端初始化

go

func (g *GorpcCli[S]) init(funcNew func(name string, c client.Client) S) *GorpcCli[S] { // 使用 go-micro 共享客户端 g.rpcClient = funcNew(g.RpcServiceName, *common.Client()) return g }

客户端管理

go

var RpcCliMap sync.Map // 线程安全的客户端缓存 func Register[S any](s string, rpcli *GorpcCli[S]) { RpcCliMap.Store(s, rpcli) } func Find[S any](s string) *GorpcCli[S] { ci, ok := RpcCliMap.Load(s) if ok { return ci.(*GorpcCli[S]) } return nil }
3. GrpcRegister - 服务注册器

go

type GrpcRegister struct { basedto.BaseEntitySingle } func (grpcRegister *GrpcRegister) RegisterGrpc(service micro.Service) { // 注册各个 Handler helloProto.RegisterHelloYeahHandler(service.Server(), handler.NewHelloRpc()) godbProto.RegisterGeneralGodbHandler(service.Server(), handler.NewGeneralGodbRpc()) }

三、服务发现机制

plainText

┌─────────────────────────────────────────────────────────────┐ │ 服务发现流程 │ ├─────────────────────────────────────────────────────────────┤ │ 服务端 │ │ ├── 启动时注册到 etcd │ │ ├── 定时发送心跳(30s) │ │ └── TTL 过期自动下线(90s) │ ├─────────────────────────────────────────────────────────────┤ │ 客户端 │ │ ├── 从 etcd 查询服务地址 │ │ ├── 负载均衡选择实例 │ │ └── 建立连接调用 │ └─────────────────────────────────────────────────────────────┘

配置项

配置项说明默认值
RegisterTTL服务存活时间90秒
RegisterInterval心跳间隔30秒
EtcdHostetcd 地址localhost:2379

四、配置与依赖

RPC 配置(来自 IchubConfig)

yaml

rpc: servername: rpcweb.website.com version: v1.0 serverport: "8081" clientname: rpcweb-client etcd: server: hosturl: localhost:2379
核心依赖
依赖版本用途
github.com/micro/go-micro/v2v2微服务框架
github.com/micro/go-micro/v2/registry/etcdv2etcd 服务发现
google.golang.org/grpc-gRPC 核心

五、使用示例

1. 服务端启动

go

func main() { // 读取 RPC 配置 rpc := ichubconfig.FindBeanIchubConfig().ReadVar2Rpc("rpc") // 启动服务 startgrpc.Start(rpc) }
2. 定义 Handler

go

type HelloRpc struct{} func NewHelloRpc() *HelloRpc { return &HelloRpc{} } func (h *HelloRpc) SayHello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error { rsp.Message = "Hello " + req.Name return nil }
3. 客户端调用

go

// 创建门面 facade := gofacade.NewRpcFacade() // 调用 RPC req := &proto.HelloRequest{Name: "World"} rsp, err := facade.HelloService.RpcClient().SayHello(context.Background(), req)
4. 注册服务

go

func (grpcRegister *GrpcRegister) RegisterGrpc(service micro.Service) { proto.RegisterHelloYeahHandler(service.Server(), handler.NewHelloRpc()) }

六、设计亮点

特性实现方式优势
泛型客户端GorpcCli[S]泛型结构体类型安全,支持任意服务
服务发现go-micro + etcd自动服务注册、健康检查
心跳机制RegisterTTL + RegisterInterval自动剔除故障节点
客户端缓存sync.Map复用连接,减少开销
依赖注入basedi 容器统一管理,易于测试

七、完整调用链路

plainText

客户端请求 ↓ RpcFacade.HelloService.RpcClient() ↓ GorpcCli[S].rpcClient(从 etcd 获取服务地址) ↓ gRPC 网络调用 ↓ 服务端 Handler 处理 ↓ 返回响应

八、代码生成支持

项目提供了 RPC 代码生成能力,通过模板自动生成:

  • config/factroy/template/gorpc/Rpc.template- Handler 模板
  • config/factroy/template/gorpc/Rpc.proto.template- Proto 模板

生成的代码结构:

plainText

domain/internal/db/gorpc/ ├── service/xxx_gorpc.go # Handler 实现 └── proto/ ├── xxx_proto.pb.go # Go 代码 ├── xxx_proto.pb.micro.go # go-micro 封装 └── pb/xxx_proto.proto # Proto 定义

九、典型应用场景

  1. 微服务间通信:替代 HTTP,实现高效的跨服务调用
  2. 数据库代理:通过 RPC 封装数据库操作,实现读写分离
  3. 分布式计算:将计算任务分发到多个 RPC 服务节点
  4. API 网关:通过 RPC 聚合多个后端服务
  5. 消息处理:与 NATS 配合,实现异步消息的同步处理
http://www.zskr.cn/news/1480816.html

相关文章:

  • 抖音无水印批量下载器:5分钟快速上手完整指南
  • 2026年AI论文网站实测认证:5款神器从选题到排版全流程通关秘籍
  • 汽车CAN总线解码器开发实战:从硬件设计到协议逆向解析
  • 差分串行通讯端接原理与实战:从阻抗匹配到信号完整性优化
  • 从逻辑缺失到产品败局:工程师如何用第一性原理思维重塑研发全链条
  • 从鲇鱼到食人鱼:小米模式对硬件创新的启示与反思
  • 5分钟掌握百度网盘秒传链接:永久分享文件的终极完整指南
  • 2026年国内二烯烃深冷橡塑板主流厂家TOP3综合评测 - 廊坊广华节能科技
  • Seedance 2.0 API 开放申请后,企业接入注意事项与最佳实践:从申请到上线的完整 Checklist
  • 零基础PHP程序员如何原子化恶补网络基础知识的庖丁解牛
  • MASA模组汉化包:打破语言壁垒,解锁Minecraft顶级工具完整中文体验
  • 技术人财富路径解析:从贸易红利到产品创新的商业思维
  • 2026年400号码企业认证服务商:代办来去电显示公司名业务 - 企业服务推荐
  • 联发科芯片战略失误复盘:从MT6516到MT6268的硬件产品管理教训
  • 设计师的智能助手:LayerDivider让图像分层变得简单高效
  • 绝了!原来论文还能这样拿高分?2026降AI率网站推荐合集
  • 终极Realtek rtw89无线驱动深度解析:从WiFi 6到WiFi 7的完整调优指南
  • 用代码逻辑拆解《二十年后》:如何设计一个‘二十年之约’的可靠系统?
  • 如何快速实现弹幕格式转换:跨平台兼容的完整指南
  • KLOGG日志分析实战指南:告别卡顿,秒级定位海量日志关键信息
  • AZMusicDownloader:高效音乐下载工具的专业解决方案
  • HTML2Image:Python开发者必备的HTML转图片与网页截图自动化工具
  • SheetJS:企业级数据流转架构的无依赖JavaScript电子表格解决方案
  • ChatGPT 5.5 的真实水平:不是最强,但可能是最全的
  • 告别VMware Workstation!手把手教你用ESXi 8.0在旧电脑上搭建家庭服务器
  • EBGaramond12:让文艺复兴字体在现代数字世界重获新生
  • OpenRGB终极指南:三步搞定多品牌RGB设备统一控制,告别繁琐软件!
  • PLL与DLL锁相环技术深度解析:原理、对比与工程实践指南
  • UvSquares终极指南:5步掌握Blender UV网格重塑神器
  • ChatGPT 5.5 提示词技巧:这 6 种写法让输出质量提升一个档次