gRPC 快速入门 — SpringBoot 实现(1)

news2025/1/16 4:50:55

目录

一、什么是 RPC 框架 ?

二、什么是 gRPC 框架 ?

三、传统 RPC 与 gRPC 对比

四、gRPC 的优势和适用场景

五、gRPC 在分布式系统中应用场景

六、什么是 Protocol Buffers(ProtoBuf)?

特点

使用场景

简单的使用模拟

七、写一个gRPC 服务的基本流程

①、定义服务和消息

②、生成代码

③、实现服务接口

④、创建 gRPC 服务器

⑤、创建 gRPC 客户端


一、什么是 RPC 框架 ?

  RPC(Remote Procedure Call)描绘了ClientServer之间点对点调用流程,包括stub、通信、RPC消息解析等部分,实际应用中,还需要考虑服务的高可用、负载均衡等问题,所以产品级的RPC框架除了点对点的RPC协议具体实现外,还包括服务的发现与注销、提供服务多台Server的负载均衡、服务的高可用等更多功能。

目前RPC框架大致有两种不同的侧重方向,一种偏重于服务治理,另一种偏重于跨语言调用。

服务治理型RPC框架有:DubboDubboXMotan等,这类RPC框架的特点是功能丰富,提供高性能的远程调用以及服务发现及治理功能,适用于大型服务的微服务化拆分以及管理,对于特定语言(如Java)的项目可以十分友好的透明化接入。但缺点是语言耦合度较高,跨语言支持难度较大。

跨语言调用型RPC框架有:ThriftgRPCHessianHprose等,这一类RPC框架重点关注于服务跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合于为不同语言提供通用远程服务的场景。但这类框架没有服务发现相关机制,实际使用时一般需要代理层进行请求转发和负载均衡策略控制。

二、什么是 gRPC 框架 ?

        gRPC 是一种高性能、开源的远程过程调用(RPC)框架。它允许分布在不同计算机上的应用程序能够像调用本地方法一样进行通信,从而实现了在分布式系统中进行高效的通信。

三、传统 RPC 与 gRPC 对比

        传统的 RPC 模型使用各种协议和编码方式进行通信,这可能导致跨语言通信困难、性能不佳等问题。与此不同,gRPC 使用 Google 开发的 Protocol Buffers(ProtoBuf)进行数据序列化,同时基于 HTTP/2 协议进行通信,从而提供了更高效的通信方式。

四、gRPC 的优势和适用场景

  • 高性能: gRPC 使用二进制的 ProtoBuf 编码和 HTTP/2 多路复用等技术,从而实现低延迟和高吞吐量的通信。

  • 多语言支持: gRPC 支持多种编程语言,包括 Java、Python、Go 等,使得不同团队可以选择自己擅长的语言进行开发。

  • 强类型: 使用 ProtoBuf 定义消息和接口,消除了手动解析数据的麻烦。

  • 双向流式通信: gRPC 支持双向流式数据传输,适用于实时性要求高的场景。

  • 自动代码生成: 根据定义的服务接口和消息,gRPC 可以自动生成客户端和服务端代码,简化开发流程。

五、gRPC 在分布式系统中应用场景

  • 微服务通信: gRPC 适用于微服务架构中各个服务之间的通信,能够有效减少通信开销。

  • 跨数据中心通信: gRPC 的性能优势使其适用于跨多个数据中心进行通信,提供更好的用户体验。

  • 实时通信: 借助双向流式通信,gRPC 适合实时通信场景,如聊天应用和实时数据推送。

  • 通过了解 gRPC 的基本概念、与传统 RPC 的不同之处以及它在分布式系统中的优势,你将能够更好地理解为什么 gRPC 是一个值得学习和应用的强大工具。

六、什么是 Protocol Buffers(ProtoBuf)?

        Protocol Buffers(简称Protobuf)是由Google开发的一种用于数据序列化技术。与传统的XMLJSON相比,Protobuf具有更高的性能和更小的消息体积,特别适用于需要高效数据交换的场景。

        初由 Google 开发,用于解决跨平台、跨语言通信以及数据持久化的问题。ProtoBuf 使用简单的接口描述语言来定义数据结构和服务接口,并生成相应代码用于数据的序列化和反序列化。在 gRPC 中,使用 Protocol Buffers(ProtoBuf)进行数据传输非常简单,因为 gRPC 针对 ProtoBuf 提供了内置支持。

protoc 是 protobuf 定义数据结构的一种格式,用.proto后缀的文件保存,使用proto编译器可以把对应的proto结构编译为各目标语言的序列化与反序列化代码库

特点

  1. 速度快Protobuf在序列化与反序列化数据时速度极快
  2. 占空间小Protobuf序列化后的二进制数据非常小,可节省大量的存储和带宽
  3. 跨平台Protobuf支持多种编程语言(常见的几乎都支持),兼容性好
  4. 易扩展:使用.proto文件定义数据结构(包括字段类型、默认值和验证规则等),添加新内容时,也可以轻松做到,不会破坏现有系统
  5. 简单易用:只需专注.proto数据结构文件的编写,对应的序列化与反序列化代码可自动生成

使用场景

  • 分布式系统:各服务之间需要频繁地进行数据交换,Protobuf可以显著提高通信效率
  • 存储和持久化Protobuf能节省很多存储空间,常用于日志记录、配置文件和数据持久化
  • 移动应用:在网络带宽和存储空间有限的情况下,Protobuf能更好地提高性能

protobuf使用非常广泛,如很多平台的视频、直播间弹幕流即是使用这种技术传输,如有需要,还可对序列化消息进行gzip压缩,进一步减少消息体积,节省带宽,提高传输速度 。

Protocol Buffers 编译器 (protoc)在 Windows 中怎么安装

protoc下载地址:https://github.com/protocolbuffers/protobuf/releases

protoc编译js文档:JavaScript Generated Code | protobuf-javascript

protoc编译js插件下载地址:https://github.com/protocolbuffers/protobuf-javascript/releases

简单的使用模拟

  • 使用proto语法(规则)定义我们的数据结构,保存在.proto后缀的文件内

  • 使用proto编译器编译.proto文件,指定要编译成目标语言环境(JavaPython等)

    结果将会生成对应语言的一个代码文件(内包含对应数据序列化与反序列化相关操作的类或函数)
  • 接着使用生成的代码文件即可。

七、写一个gRPC 服务的基本流程

①、定义服务和消息

首先,你需要创建一个 .proto 文件来定义服务接口和消息类型。在这个文件中,你可以定义服务方法、请求消息和响应消息。这些定义将用于生成服务端和客户端的代码。

②、生成代码

使用 Protocol Buffers 编译器(protoc)来生成对应编程语言的代码

③、实现服务接口

在服务端,你需要创建一个类来实现定义的服务接口。这个类应该继承自生成的服务接口,并实现相应的方法。

④、创建 gRPC 服务器

在服务端代码中,你需要创建一个 gRPC 服务器,将服务实现类注册到服务器中。

⑤、创建 gRPC 客户端

在客户端,你可以使用生成的客户端代码来调用 gRPC 服务方法

至此,理论部分介绍完毕,后续将使用SpringBoot具体代码实现gRPC四种通信模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出:SOME/IP-SD的工作原理与应用

目录 往期推荐 相关缩略语 SOME/IP 协议概述 协议介绍 SOME/IP TP 模块概述和 BSW 模块依赖性 原始 SOME/IP 消息的Header格式 SOME/IP-SD 模块概述 模块介绍 BSW modules依赖 客户端-服务器通信示例 Message 结构 用于SD服务的BSWM状态处理 往期推荐 ETAS工具…

字节高频算法面试题:小于 n 的最大数

问题描述(感觉n的位数需要大于等于2,因为n的位数1的话会有点问题,“且无重复”是指nums中存在重复,但是最后返回的小于n最大数是可以重复使用nums中的元素的): 思路: 先对nums倒序排序 暴力回…

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

在 Windows 11 WSL (Ubuntu 24.04.1 LTS) | Python 3.12.x 下部署密码学库 charm

1. 在 Windows 11 上部署 Ubuntu (WSL) 由于作者没有高性能的 Ubuntu 服务器或个人电脑,且公司或学校提供的 Ubuntu 服务器虽然提供高性能 GPU 等硬件配置但通常不会提供 root 权限,因而作者通过在搭载了 Windows 11 的个人电脑上启动 Ubuntu (WSL) 来进…

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

设计模式的艺术读书笔记

设计模式的艺术 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建的艺术创建型模式单例模式饿汉式单例与懒汉式单例的讨论通过静态内部类实现的更好办法 简单工厂模式工厂方法模式重载的工厂方法工厂方法的隐藏工厂方…

计算机毕设-基于springboot的甜品店管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Mac 录制电脑系统内的声音的具体方法?

1.第一步:下载BlackHole 软件 方式1:BlackHole官方下载地址 方式2: 百度云下载 提取码: n5dp 2.第二步:安装BlackHole 双击下载好的BlackHole安装包,安装默认提示安装。 3.第三步:在应用程序中找到音频…

【开源免费】基于Vue和SpringBoot的课程答疑系统(附论文)

博主说明:本文项目编号 T 070 ,文末自助获取源码 \color{red}{T070,文末自助获取源码} T070,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

ACM latex模板中的CCSXML (即:CCS Concept)怎么填?

CCS Concept 感谢CCS Concept 怎么填 的珠玉在前. 问题描述 如下,ACM模板(比如ACM computing surveys)有一段是需要填写 ccsxml: %% %% The code below is generated by the tool at [http://dl.acm.org/ccs.cfm.](http://dl.…

【Transformer序列预测】Pytorch中构建Transformer对序列进行预测源代码

Python,Pytorch中构建Transformer进行序列预测源程序。包含所有的源代码和数据,程序能够一键运行。此程序是完整的Transformer,即使用了Encoder、Decoder和Embedding所有模块。源程序是用jupyterLab所写,建议分块运行。也整理了.p…

Mybatis-plus 简单使用,mybatis-plus 分页模糊查询报500 的错

一、mybtis-plus配置下载 MyBatis-Plus 是一个 Mybatis 增强版工具&#xff0c;在 MyBatis 上扩充了其他功能没有改变其基本功能&#xff0c;为了简化开发提交效率而存在。 具体的介绍请参见官方文档。 官网文档地址&#xff1a;mybatis-plus 添加mybatis-plus依赖 <depe…

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…

设计模式:20、状态模式(状态对象)

目录 0、定义 1、状态模式的三种角色 2、状态模式的UML类图 3、示例代码 0、定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 1、状态模式的三种角色 环境&#xff08;Context&#xff09;&#xff1a;环境是一个类&#xff0…

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并

本文涵盖的内容仅供个人学习使用&#xff0c;如果侵犯学校权利&#xff0c;麻烦联系我删除。 初衷 研究生必修选逃&#xff0c; 期末复习怕漏过重点题目&#xff0c;但是看学在西电的录播回放课一卡一卡的&#xff0c;于是想在空余时间一个个下载下来&#xff0c;然后到时候就…

基于php+mysql的旅游网站——记忆旅行 旅游分享 攻略分享 设计与实现 源码 配置 文档

旅游网站 1.项目描述2. 概述3.项目功能4.界面展示5.源码获取 1.项目描述 摘 要 随着互联网的不断发展&#xff0c;计算机网络逐渐普及到人们的生活&#xff0c;为人们带来了便捷。互联网的趋势扩大&#xff0c;运用到家家户户中。各行各业都在考虑利用互联网将自己的信息推广…

2024.12.6——攻防世界php_rce

知识点&#xff1a;PHP框架 RCE远程命令执行 PHP常用框架&#xff1a;php常用的7大框架_php框架-CSDN博客 1.小型项目&#xff1a;CodeIngiter 2.中型项目&#xff1a;CakePHP、Zend Framework、Laravel、Thinkphp 3.大型重量级项目&#xff1a;Yii、Symfony、Laravel 使用…

autogen 人工输入模式

一、Allowing Human Feedback in Agents 允许代理中的人类反馈 发起聊天 (initiate_chat) 功能&#xff1a;用于启动对话过程。 参数&#xff1a;max_turns&#xff1a;限制对话的最大回合数。如果设置为3&#xff0c;意味着对话将在第三个回合后自动终止&#xff0c;除非提前…