gRPC协议详解
gRPC介绍
gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google发起并开发,于2015年对外发布。它基于HTTP/2协议和Protocol Buffers设计,支持多种编程语言(如C++、Java、Python、Go、Ruby、C#、Node.js等)。
gRPC的核心思想是基于接口定义语言(IDL)来定义服务,在编译期间自动生成具体的服务端和客户端代码。这种设计使得服务端和客户端可以完全专注于业务,而无需关心通信协议的细节。
gRPC提供了四种不同类型的服务:Unary RPC、Server Streaming RPC、Client Streaming RPC和Bidirectional Streaming RPC。其中,Unary RPC是最常用的一种,它是一种普通的RPC调用,即客户端向服务器发送一个请求,服务器返回一个响应。而Streaming RPC则是一种支持流式数据传输的RPC调用方式,它可以实现更加复杂的通信模式,如实时聊天、视频流传输等。
gRPC还支持多种认证和授权机制,如基于TLS的认证、OAuth2授权等。同时,它还提供了一系列的性能优化机制,如连接复用、流控制、压缩等,可以大大提升RPC调用的效率和性能。
gRPC被广泛应用于微服务架构中,是一种高效、直观且方便进行数据传输和处理的远程过程调用协议。
gRPC协议特点
- 支持多种语言 :gRPC支持多种编程语言,如C++、Java、Python、Go、Ruby、C#、Node.js等,使得在不同语言环境下进行RPC调用变得更加容易。
- 通信协议基于HTTP/2设计 :gRPC使用HTTP/2作为通信协议,具有连接复用、双向流、消息头压缩、单TCP的多路复用等特点,可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。
- 序列化支持PB(Protocol Buffer)和JSON :gRPC支持PB和JSON两种序列化协议。PB是一种语言无关的高性能序列化框架,基于HTTP/2 + PB,保障了RPC调用的高性能。同时,gRPC也支持JSON序列化,使得数据传输更加方便。
- 基于IDL文件定义服务 :gRPC使用IDL(Interface Definition Language)文件定义服务,通过proto3工具生成指定语言的数据结构、服务端接口以及客户端Stub。这种设计使得服务端和客户端可以完全专注于业务,而无需关心通信协议的细节。
- 支持流式调用 :gRPC支持四种不同类型的服务,包括Unary RPC、Server Streaming RPC、Client Streaming RPC和Bidirectional Streaming RPC。其中,Streaming RPC支持流式数据传输,可以实现更加复杂的通信模式,如实时聊天、视频流传输等。
- 安全性 :gRPC支持多种认证和授权机制,如基于TLS的认证、OAuth2授权等,提高了通信的安全性。
- 高效 :gRPC具有高效的性能优化机制,如连接复用、流控制、压缩等,可以大大提升RPC调用的效率和性能。
gRPC应用场景
gRPC被广泛应用于微服务架构中,是一种高效、直观且方便进行数据传输和处理的远程过程调用协议。它非常适合用于服务之间的通信,提供高性能、类型安全和易于维护的通信机制。此外,gRPC还支持多种编程语言,因此可以轻松地在不同的技术栈中进行通信,对于跨团队协作、不同技术栈的应用程序集成以及构建多语言系统非常有用。
gRPC的应用场景包括:
微服务架构 :gRPC非常适合用于微服务架构中,可以用于服务之间的通信,提供高性能、类型安全和易于维护的通信机制。
跨语言通信 :gRPC支持多种编程语言,因此可以轻松地在不同的技术栈中进行通信。这对于跨团队协作、不同技术栈的应用程序集成以及构建多语言系统非常有用。
移动应用通信 :gRPC的轻量级性能使其成为移动应用与后端服务器之间进行高效通信的理想选择。它可以用于移动应用与云服务或后端API之间的通信,以获取数据或执行操作。
设计语言独立、高效、精确的新协议 :gRPC基于HTTP/2设计,具有连接复用、双向流、消息头压缩、单TCP的多路复用等特点,可以节省带宽、降低TCP链接次数、节省CPU。
便于各方面扩展的分层设计 :gRPC支持多种认证和授权机制,如基于TLS的认证、OAuth2授权等,提高了通信的安全性。此外,它还提供了一系列的性能优化机制,如连接复用、流控制、压缩等,可以大大提升RPC调用的效率和性能。
Java实现gRPC案例
- 首先,定义一个gRPC的服务接口,这里我们定义一个简单的HelloService,只有一个sayHello的方法,返回一个HelloReply类型的对象:
public interface HelloService extends Service<HelloRequest, HelloReply> {@OverrideHelloReply sayHello(HelloRequest request);
}
- 实现这个服务接口。在实现类中,我们需要实现sayHello方法:
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase implements HelloService {@Overridepublic HelloReply sayHello(HelloRequest request) {return HelloReply.newBuilder().setMessage("Hello " + request.getName()).build();}
}
- 在服务器端,我们需要注册并启动这个服务:
public class Server {public static void main(String[] args) throws IOException, InterruptedException {Server server = ServerBuilder.forPort(50051).addService(new HelloServiceImpl()).build();server.start();server.awaitTermination();}
}
- 在客户端,我们可以调用这个服务:
public class Client {public static void main(String[] args) throws IOException, InterruptedException {ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();try (HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel)) {HelloReply reply = stub.sayHello(HelloRequest.newBuilder().setName("World").build());System.out.println(reply.getMessage());} finally {channel.shutdown();}}
}
Protocol Buffers的特点
- 跨平台、跨语言:Protobuf支持跨平台和跨语言的特性,可以在不同的平台和编程语言中使用。生成的代码体积小,传输速度快,适用于各种不同类型的应用场景。
- 二进制序列化:Protobuf使用二进制格式进行序列化,相较于文本格式,具有更小的存储空间和更快的解析速度。这种格式也使得Protobuf在数据传输时更加紧凑和高效。
- 丰富的数据类型:Protobuf支持多种数据类型,包括整数、浮点数、布尔值、字符串、字节流等,可以满足不同类型的数据需求。
- 自定义消息结构:使用Protobuf时,首先需要定义好需要传输的数据的格式,即Proto文件。使用Proto文件定义数据格式后,就可以使用提供的代码生成工具生成对应语言的数据访问类,在应用中便可以使用这些类进行数据编解码。这种灵活的消息结构可以方便地添加新的字段或修改字段,而不会影响旧版本的代码。
- 高效的序列化:Protobuf使用二进制编码,相比于XML、JSON等文本标记语言,具有更小的存储空间和更快的序列化和反序列化速度。
- 安全性:由于Protobuf的二进制格式和严格的格式规范,解析速度非常高效。同时,其消息结构可以进行版本控制和演化,通过向已定义的消息中添加新的字段或修改字段,旧版本的代码仍然可以与新版本的消息进行兼容。
总的来说,Protocol Buffers是一种非常高效的数据交换格式,适用于数据传输量较大、网络带宽较小或数据响应速度要求较高的领域。
使用Protocol Buffers的Java案例
假设我们有一个Proto文件,名为person.proto
,定义了一个Person消息类型,包含姓名和年龄两个字段:
syntax = "proto3";message Person {string name = 1;int32 age = 2;
}
首先,我们需要使用Protocol Buffers的编译器生成Java代码。假设我们已经安装了Protocol Buffers编译器,可以在命令行中输入以下命令生成Java代码:
protoc --java_out=./ ./person.proto
这将生成一个名为Person.java
的文件,其中包含Person消息类型的Java类定义。
接下来,我们可以使用生成的Java类来序列化和反序列化Person消息。以下是一个简单的Java程序,演示了如何使用Protocol Buffers进行序列化和反序列化:
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;
import java.util.logging.Logger;public class PersonExample {private static final Logger logger = Logger.getLogger(PersonExample.class.getName());public static void main(String[] args) throws IOException {// 创建一个Person对象Person person = Person.newBuilder().setName("Alice").setAge(25).build();// 将Person对象序列化为二进制格式byte[] bytes = person.toByteArray();logger.info("Serialized person to " + bytes.length + " bytes");// 将二进制格式反序列化为Person对象Person deserializedPerson = Person.parseFrom(bytes);logger.info("Deserialized person: " + deserializedPerson);}
}
在上面的示例中,我们首先创建了一个Person对象,并设置了姓名和年龄字段。然后,我们使用toByteArray()
方法将Person对象序列化为二进制格式。最后,我们使用parseFrom()
方法将二进制格式反序列化为Person对象。
相关文章:

gRPC协议详解
gRPC介绍 gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google发起并开发,于2015年对外发布。它基于HTTP/2协议和Protocol Buffers设计,支持多种编程语言(如C、Java、Python、Go、Ruby、C#、No…...

虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案
来源:雅名特自动驾驶 虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案能够研究和验证高历程实验和恶劣驾…...

demo(二)eurekaribbon----服务注册、提供与消费
前一篇实现了服务注册中心的搭建,并提供服务注册到注册中心上。在之前的基础上,实现服务消费。 一、相关介绍 1、RestTemplate工具 2、LoadBalanced注解 二、ribbon示例: 先启动eureka-service注册中心,再将eureka-client修改…...

2023年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 阅读以下代码,程序输出结果正确的选项是?( ) def process_keywords(keywords_list):unique_keywords = list(set(keywords_list))...

python3.8 安装 ssl 模块 和 _ctypes 模块
这文章目录 前情提要安装 openssl-1.1.1重新编译安装 python3.8-rpath 编译选项介绍python3.8 跟 python3.10 的区别那要怎么解决这个问题呢,我想到有四种解决方案: 前情提要 我在之前给 python3.10 安装 ssl 模块后以为该步骤 “对于 python3.6、pytho…...

阿里云99元ECS云服务器老用户也能买,续费同价!
阿里云近日宣布了2023年的服务器优惠活动,令用户们振奋不已。最引人瞩目的消息是,阿里云放开了老用户的购买资格,99元服务器也可以供老用户购买,并且享受续费的99元优惠。此外,阿里云还推出了ECS经济型e实例࿰…...

如何使用内网穿透实现远程公网访问windows node.js的服务端
使用Nodejs搭建简单的web网页并实现公网访问 前言 Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架。 Node.js自带运行时环境可在Javascript脚本的基础上可以解释和执行(这类似于JVM的Java字节码)。这个运行时允许在浏览器以外的任何机器上执行JavaScri…...

WordPress 媒体库文件夹管理插件 FileBird v5.5.4和谐版下载
FileBird是一款WordPress 按照文件夹管理方式的插件。 拖放界面 拖放功能现已成为现代软件和网站的标配。本机拖动事件(包括仅在刀片中将文件移动到文件夹以及将文件夹移动到文件夹)极大地减少了完成任务所需的点击次数。 一流设计的文件夹树展示 我们…...

websocket学习笔记【springboot+websocket聊天室demo】
文章目录 WebSocket是什么?为什么需要WebSocket?WebSocket和Http连接的区别WebSocket的工作原理基本交互过程: Java中的WebSocket支持WebSocket的优势springboot websocket themlef 一个聊天室demopom.xmlWebSocketConfigChatControllerWebController…...

echarts:graph图表拖拽节点
需求:实现一个可视化编辑器,用户可以添加节点,并对节点进行拖拽编辑,线条要用折线而不是用自带的直线 实现期间碰到很多问题,特意记录下来,留待将来碰到这些问题的同学,省去些解决问题的时间 问…...

Unity地面交互效果目录
大家好,我是阿赵。 之前写了几篇关于地形交互、地面轨迹、脚印效果实现的博文。虽然写的篇数不多,但里面也包含了不少基础知识,比如局部UV采样、法线动态混合、曲面细分等知识,这些都是可以和别的效果组合在一起,做…...
tcp的1对多模型C++处理逻辑
连接多个设备进行TCP连接,可以采取以下策略: 创建一个设备连接管理器:使用一个类或结构体来管理每个设备的连接。这个管理器应该包含设备的IP地址和端口号,以及一个连接到该设备的TCP连接。使用并发连接:使用并发的方式同时连接到所有设备。可以使用多线程或异步编程技术来…...
【Python】基础(学习笔记)
一、Python介绍 1、Python优点 学习成本低 开源 适应⼈群⼴泛 应⽤领域⼴泛 2、Python解释器 Python解释器作用:运行Python文件 Python解释器分类 CPython:C语⾔开发的解释器[官⽅],应⽤⼴泛的解释器。 IPython:基于CPyth…...
目标检测YOLO实战应用案例100讲-基于改进YOLO v5的排水管网缺陷智能识别(续)
目录 3.3构建方法 3.3.1样本库框架 3.3.2总体流程 3.3.3图像获取 3.3.4质量控制 3.3.5数据扩增...

《AI超级个体:ChatGPT与AIGC实战指南 》书籍分享
前言 ChatGPT是一款通用人工智能(AI)工具,使用过它的人都能感受到它的魅力。AI并不是一个新事物,它在全世界都发展很多年了,但在ChatGPT诞生之前,我们的AI只能算垂直AI,比如AlphaGo,…...

C# 使用Microsoft.Office.Interop.Excel库操作Excel
1.在NuGet管理包中搜索:Microsoft.Office.Interop.Excel,如下图红色标记处所示,进行安装 2. 安装完成后,在程序中引入命名空间如下所示: using Microsoft.Office.Interop.Excel; //第一步 添加excel第三方库 usi…...
110.42.7.1ping IP延迟代表什么意思,自己延迟高会表示其他人也高延迟吗?
我们在使用服务器前,经常会有习惯性的Ping 服务器IP看下延迟。那这个延迟是什么意思呢? ping IP延迟一般是指在网络上发送一次数据包到目标IP地址并返回的时间,通常以毫秒计算。较小的延迟表示网络连接速度较快,较大的延迟则表示…...
【kafka】springboot工程能发消息,不能收消息
初学,起了一个springboot项目,写了一个生产者和一个消费者,能给集群kafka发消息,但是收不到,排查了种种!问题,结果时因为,springboot没能扫到我注册的component,我真服了…...

一文解码语言模型:语言模型的原理、实战与评估
在本文中,我们深入探讨了语言模型的内部工作机制,从基础模型到大规模的变种,并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究,提供了一份全面而深入的视角,旨在帮助读者更准确地理解和评估语言模…...
【C++11】shared_ptr智能指针使用详解
系列文章目录 【C11】智能指针与动态内存 文章目录 系列文章目录简介一、头文件二、初始化1. make_shared2. 拷贝和赋值 三、实例 简介 shared_ptr 是一个类的模板,它使用引用计数的方式来管理一个动态分配的内存资源。shared_ptr 需要一个动态分配的对象时&#…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...