gRPC 中 Client 与 Server 数据交互的 4 种模式

news/2025/2/12 17:56:18

项目地址:grpc-modes

最近使用 gRPC 入门微服务开发,特此总结了 gRPC 中 4 种运行模式

目录结构

$GOPATH
└── grpc├── simple                  // 简单模式 RPC│   ├── client    │   │   └── client.go        # 客户端代码│   ├── proto            │   │   ├── user.pb.go    │   │   └── user.proto       # 通信的 protobuf 协议│   └── server│       └── server.go        # 服务端代码├── server-side-streaming    // 服务端流式 RPC ├── client-side-streaming    // 客户端流式 RPC └── bidirectional-streaming  // 客户端与服务端双向流式 RPC

UserService 微服务

本项目中定义了一个微服务:UserService,它只有一个 RPC:GetUserInfo()

syntax = "proto3";
package grpc.simple;// 定义 UserService 微服务
service UserService {// 微服务中获取用户信息的 RPC 函数rpc GetUserInfo (UserRequest) returns (UserResponse);
}// 客户端请求的格式
message UserRequest {int32 ID = 1;
}// 服务端响应的格式
message UserResponse {string name = 1;int32 age = 2;
}

GetUserInfo() 函数中模拟了一个数据库,存储用户的姓名和年龄:

// ID 为 key,用户信息为 value 模拟数据库查询结果
var users = map[int32]pb.UserResponse{1: {Name: "Dennis MacAlistair Ritchie", Age: 70},2: {Name: "Ken Thompson", Age: 75},3: {Name: "Rob Pike", Age: 62},
}

客户端请求带上 ID,查询后将用户信息作为响应返回。

客户端与服务端进行数据交互的四种模式

simpe 简单模式 RPC

客户端发起一个请求到服务端,服务端返回一个响应。

client 请求 ID 为 2 的用户数据,server 返回 ID 为 2 的用户数据:

simple

server-side streaming 服务端流式 RPC

客户端发起一个请求到服务端,服务端返回一段连续的数据流响应。

client 请求 1 的用户数据,server 返回 1、2、3 的用户数据流:

server-side-streaming

client-side streaming 客户端流式 RPC

客户端将一段连续的数据流发送到服务端,服务端返回一个响应。

client 请求 1、2、3 的用户数据流,server 返回 3 的用户数据:

client-side-streaming

Bidirectional streaming 双向数据流模式的 gRPC

客户端将连续的数据流发送到服务端,服务端返回交互的数据流。

client 依次请求 1、2、3 的用户数据流,服务端依次返回 1、2、3 的用户数据流:

bidirectional-streaming

最后

最近在系统的学习 Golang 的微服务,从 gRPC 开始,到 go-micro、Docker 化微服务等,每周更新。欢迎关注我的博客 wuYinBlog

希望本项目对你有所帮助 ☺️


https://dhexx.cn/news/show-898820.html

相关文章

Hive安装教程

目录1.环境准备2.解压安装3.配置环境变量4.配置文件配置hive-env.sh配置hive-site.xml5.上传配置jar6.启动1.环境准备 安装hadoop 以及 zookeeper、mysql 《适合小白的配置hadoop环境教程》 《zookeeper的安装与配置》 《Linux环境配置MySQL(附文件)…

外观模式(十二)

外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的…

MapReduce入门

文章目录1.MapReduce定义2.MapReduce优缺点2.1优点2.2缺点3.MapReduce核心思想4.MapReduce进程5.MapReduce编程规范5.1.Mapper阶段5.2.Reducer阶段5.3.Driver阶段6.WordCount案例实操6.1需求6.2需求分析6.3环境准备6.4编写程序1.MapReduce定义 MapReduce是一个分布式运算程序的…

iOS提供指定构造器

提供指定构造器(Designated initializer) 如果自己编写框架或者查看开源框架的一些初始化接口,或多或少都会发现,一般框架都会提供非常丰富便利的初始化接口,这些初始化接口的背后都会集中调用某个核心的初始化方法。 iOS的UIKit中的类&#…

分布式资源调度框架YARN

文章目录1.YARN的前世今生2.YARN概述3.YARN的基本架构核心组件3.1ResouceManager3.2NodeManager3.3ApplicationMaster3.4Container4. YARN的工作机制5.启动JobHistoryServer6.YARN的资源调度器7.YARN常用命令1.YARN的前世今生 Hadoop1.x版本中最大的问题是资源问题 对数据的处…

再探Circuit Breaker之使用Polly

前言 上一篇介绍了使用Steeltoe来处理服务熔断,这篇我们将用Polly来处理服务熔断。 不废话了,直接进正题。 简单的例子 同样先定义一个简单的服务。 [Route("api/[controller]")] public class ValuesController : Controller {// GET api/val…

分布式应用协调服务ZooKeeper

1.ZooKeeper简介 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目Zookeeper文件系统通知机制 Zookeeper从设计模式上来看是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察…

Hadoop序列化

文章目录1.序列化概述1.1什么是序列化1.2为什么要序列化1.3为什么不用java的序列化2.常用数据序列化类型3.自定义bean对象实现序列化接口(Writable)4.序列化案例实操4.1需求4.2需求分析4.3编写MapReduce程序1.序列化概述 1.1什么是序列化 序列化就是把…

iOS 多线程详解

iOS 多线程详解 Slogan : 可能是最通俗易懂的 iOS多线程 详细解析文章 1. 基础概念 1.1 进程 进程是计算机中已运行程序的实体,是线程的容器维基百科-进程。每个进程之间是相互独立的,每个进程均运行在器专用且收保护的内存空间内。 把工厂作为一个系统&…

Yarn资源调度器

文章目录1.Yarn基本架构2.Yarn工作机制3.作业提交全过程4.资源调度器4.1先进先出调度器(FIFO)4.2容量调度器(Capacity Scheduler)4.3公平调度器(Fair Scheduler)5.任务的推测执行Yarn是一个资源调度平台&am…