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

Go中如何跨语言实现传输? - GRPC

Go中如何跨语言实现传输? - GRPC

gRPC 是 Google 开源的高性能 RPC 框架,基于 HTTP/2 协议和 Protocol Buffers(Protobuf)序列化,支持多语言、流式传输和企业级特性。与 RESTful API 相比,它性能更高、接口定义更规范,特别适合微服务架构和跨语言服务调用。

概念作用说明
Protocol Buffers(Protobuf)接口定义语言(IDL)用于定义服务接口和消息结构,跨语言、跨平台,序列化性能极高
Service(服务)定义 RPC 方法.proto文件中定义,包含方法名、请求消息、响应消息
Message(消息)定义数据结构类似于 Go 的结构体,用于定义请求和响应的数据格式
Unary RPC(一元 RPC)最简单的 RPC 模式客户端发送一个请求,服务端返回一个响应,类似传统的 HTTP 请求
Server Streaming RPC(服务端流式)服务端流式返回客户端发送一个请求,服务端返回多个响应
Client Streaming RPC(客户端流式)客户端流式发送客户端发送多个请求,服务端返回一个响应
Bidirectional Streaming RPC(双向流式)双向流式传输客户端和服务端可以同时发送和接收多个消息
# 1. 安装 protoc 编译器# Macbrewinstallprotobuf# Linuxaptinstall-yprotobuf-compiler# 2. 安装 Go 插件goinstallgoogle.golang.org/protobuf/cmd/protoc-gen-go@latest goinstallgoogle.golang.org/grpc/cmd/protoc-gen-go-grpc@latest# 3. 安装 gRPC 核心库go get google.golang.org/grpc

Unary RPC (一元 RPC)

grpc-demo/ ├── proto/ │ └── user.proto # Protobuf 定义文件 ├── server/ │ └── main.go # gRPC 服务端 ├── client/ │ └── main.go # gRPC 客户端 └── go.mod

编写 Protobuf 定义(proto/user.proto

这是 gRPC 开发的核心,定义接口契约。

// 指定 Protobuf 版本 syntax = "proto3"; // 指定生成的 Go 代码的包路径 option go_package = "./proto"; // 定义包名 package user; // 定义消息(数据结构) message User { uint32 id = 1; // 字段编号:1-15 占 1 字节,常用字段优先 string username = 2; string email = 3; } message GetUserRequest { uint32 user_id = 1; } message GetUserResponse { User user = 1; } // 定义服务 service UserService { // 一元 RPC 方法 rpc GetUser(GetUserRequest) returns (GetUserResponse); }
  • syntax = "proto3";:指定使用 Protobuf v3 版本(推荐,比 v2 更简洁)。

  • option go_package = "./proto";:指定生成的 Go 代码的包路径。

  • 消息字段编号:每个字段必须有唯一的编号,1-15 占 1 字节,16-2047 占 2 字节,常用字段建议用 1-15。

  • service Xxx { rpc Yyy(Req) returns (Resp) }:定义服务,包含多个 RPC 方法。

  • rpc 方法名(请求) returns (响应):定义 RPC 方法。

  • message Xxx { type field = tag; }:定义消息结构,tag 必须唯一

protoc--go_out=. --go-grpc_out=. proto/user.proto

执行成功后,会在proto/目录下生成两个文件:

  • user.pb.go:消息结构的 Go 代码
  • user_grpc.pb.go:服务接口的 Go 代码

服务端实现

import(pb"grpc-demo/proto")// 定义服务结构体,必须嵌入 Unimplemented*ServertypeUserServerstruct{pb.UnimplementedUserServiceServer// 必须嵌入,保证向前兼容}// 实现 Protobuf 中定义的 RPC 方法func(s*UserServer)GetUser(ctx context.Context,req*pb.GetUserRequest)(*pb.GetUserResponse,error){// 核心业务逻辑:查询数据库等user:=&pb.User{Id:req.UserId,Username:"zhangsan",Email:"zhangsan@example.com",}return&pb.GetUserResponse{User:user},nil}funcmain(){// 监听端口lis,_:=net.Listen("tcp",":50051")// 创建 gRPC 服务器s:=grpc.NewServer()// 将服务实现注册到 gRPC 服务器pb.RegisterUserServiceServer(s,&UserServer{})// 启动服务,监听 TCP 连接s.Serve(lis)}
  • type XxxServer struct { pb.UnimplementedXxxServer }:定义服务结构体,必须嵌入 Unimplemented

  • pb.UnimplementedUserServiceServer:必须嵌入这个结构体,确保向前兼容,即使后续服务添加了新方法,旧的服务端代码也不会报错。

  • 实现服务接口:必须实现.proto文件中定义的所有 RPC 方法。

客户端实现

import(pb"grpc-demo/proto")funcmain(){// 连接服务端conn,_:=grpc.Dial("localhost:50051",grpc.WithTransportCredentials(insecure.NewCredentials()),)deferconn.Close()// 创建客户端client:=pb.NewUserServiceClient(conn)// 调用 RPC 方法ctx:=context.Background()// 空根上下文resp,_:=client.GetUser(ctx,&pb.GetUserRequest{UserId:1})fmt.Printf("获取用户:%+v\n",resp.User)}
  • client.Yyy(ctx, &Req{}):调用 RPC 方法

拦截器

拦截器类似 Gin 中间件,用于处理通用逻辑(日志、认证、限流)。

// 日志拦截器funcLogInterceptor(ctx context.Context,req any,info*grpc.UnaryServerInfo,handler grpc.UnaryHandler)(any,error){// 请求前逻辑fmt.Printf("收到请求:%s\n",info.FullMethod)// 调用实际 RPC 方法resp,err:=handler(ctx,req)// 请求后逻辑returnresp,err}// 注册拦截器funcmain(){lis,_:=net.Listen("tcp",":50051")// 创建服务器时注册拦截器s:=grpc.NewServer(grpc.UnaryInterceptor(LogInterceptor))pb.RegisterUserServiceServer(s,&UserServer{})s.Serve(lis)}
  • grpc.NewServer(grpc.UnaryInterceptor(...)):创建 gRPC 服务器并注册拦截器
http://www.cnnetsun.cn/news/1714844.html

相关文章:

  • 网站关键词优化与SEO分析报告有什么联系
  • 实测Z-Image-Turbo:4步极速显影,生成速度比传统工具快10倍
  • 从C源码到IDA反编译:我是如何用‘正向编译-逆向对照’法彻底搞懂交叉引用的
  • PowerPC P2040启动流程详解:从NOR Flash到U-Boot的完整引导过程
  • ABAQUS脚本运行总是出错
  • OpenClaw技能开发入门:为百川2-13B-4bits模型创建简单自动化模块
  • LoRA训练助手企业应用指南:多用户并发使用与资源隔离配置
  • OpenClaw移动办公:Qwen3-4B模型通过钉钉审批报销单
  • OpenClaw故障模拟测试:Phi-3-mini-128k-instruct异常处理能力验证
  • OpenClaw排错大全:千问3.5-9B对接常见问题与解决方案
  • SystemVerilog约束(constraint)里的“坑”与“宝”:从dist权重到solve...before的实战避坑指南
  • 【Qt实战】QFrame控件高级应用与动态效果实现
  • 3步完成OpenClaw初始化:Phi-3-vision-128k-instruct快速体验指南
  • 【MATLAB源码-第409期】基于matlab的可重构智能表面RIS辅助无线通信系统联合波束成形与相移控制系统仿真。
  • OpenClaw+gemma-3-12b-it:24小时监控网站更新并自动通知
  • **Zephyr实战指南:基于RTOS的嵌入式低功耗开发新范式**
  • 零代码自动化:OpenClaw+百川2-13B-4bits模型图形化配置指南
  • 中科蓝讯蓝牙:从ram.ld到map.txt,RAM复用与空间优化的实战解析
  • 8舵机蜘蛛机器人嵌入式运动控制库设计
  • Windows下OpenClaw安装指南:一键对接Phi-3-mini-128k-instruct模型
  • OpenClaw对接Qwen2.5-VL-7B图文模型:多模态自动化任务实战
  • 从PPM-100到RealWorldPortrait:手把手教你用不同人像Matting数据集训练你的第一个模型
  • 双平台OpenClaw安装对比:Mac/Win下Phi-3-vision-128k-instruct接入实践
  • Gradle打包实战:如何优雅处理第三方依赖(含两种方案对比)
  • Pop 核心架构解析:深入理解 Bubble Tea 框架与邮件发送原理
  • 极简自动化:OpenClaw+Qwen3-32B处理微信聊天文件归档
  • IDMPhotoBrowser完整使用指南:从基础到高级的10个技巧
  • LeRobot SO-ARM100机械臂实战:从ACT模块拆解到避坑调参全记录
  • 按文分图工具(按文字自动分图、图片按文字分类、OCR 图片分拣器、批量图片文字识别分类、水印相机照片自动整理、图片内容关键字归类、图片批量打标签、图片文字筛选器、图片智能分拣、图片 OCR 批量归类)
  • 别再手动整理资料了!用Get笔记和腾讯iMa打造你的免费AI知识管家(附完整配置流程)