gRPC协议详解

news2024/10/7 16:23:44

在这里插入图片描述

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案例

  1. 首先,定义一个gRPC的服务接口,这里我们定义一个简单的HelloService,只有一个sayHello的方法,返回一个HelloReply类型的对象:
public interface HelloService extends Service<HelloRequest, HelloReply> {
    @Override
    HelloReply sayHello(HelloRequest request);
}
  1. 实现这个服务接口。在实现类中,我们需要实现sayHello方法:
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase implements HelloService {
    @Override
    public HelloReply sayHello(HelloRequest request) {
        return HelloReply.newBuilder()
                .setMessage("Hello " + request.getName())
                .build();
    }
}
  1. 在服务器端,我们需要注册并启动这个服务:
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();
    }
}
  1. 在客户端,我们可以调用这个服务:
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的特点

  1. 跨平台、跨语言:Protobuf支持跨平台和跨语言的特性,可以在不同的平台和编程语言中使用。生成的代码体积小,传输速度快,适用于各种不同类型的应用场景。
  2. 二进制序列化:Protobuf使用二进制格式进行序列化,相较于文本格式,具有更小的存储空间和更快的解析速度。这种格式也使得Protobuf在数据传输时更加紧凑和高效。
  3. 丰富的数据类型:Protobuf支持多种数据类型,包括整数、浮点数、布尔值、字符串、字节流等,可以满足不同类型的数据需求。
  4. 自定义消息结构:使用Protobuf时,首先需要定义好需要传输的数据的格式,即Proto文件。使用Proto文件定义数据格式后,就可以使用提供的代码生成工具生成对应语言的数据访问类,在应用中便可以使用这些类进行数据编解码。这种灵活的消息结构可以方便地添加新的字段或修改字段,而不会影响旧版本的代码。
  5. 高效的序列化:Protobuf使用二进制编码,相比于XML、JSON等文本标记语言,具有更小的存储空间和更快的序列化和反序列化速度。
  6. 安全性:由于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对象。

在这里插入图片描述

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

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

相关文章

【原创】java+swing+mysql个人日记管理系统设计与实现

摘要&#xff1a; 个人日记管理系统是一个可以记录、管理、存储和检索个人日记的应用程序。这个系统允许用户创建和管理多个日记帐户&#xff0c;每个帐户都可以有多个日记条目。用户可以随时添加、编辑或删除日记条目&#xff0c;并可以将这些条目按照主题或其他标准进行分类…

WPF程序给按钮增加不同状态的图片

首先我们在资源里添加几个图片&#xff0c;Up&#xff0c;Over和Down状态。 然后我们创建一个Style。默认我们的背景设置成Up 然后在Triggers里添加代码&#xff0c;当Property&#xff1a;IsMouseOver为True的时候更换成Over&#xff1b;当Property&#xff1a;IsPressed为Tr…

LMI相机配置步骤,使用Gocator2550相机

在此之前可以先浏览我编写的相机SDK通用类和LMISDK&#xff0c;进行配套观看 https://blog.csdn.net/m0_51559565/article/details/134404394 //LMI相机SDK https://blog.csdn.net/m0_51559565/article/details/134403745 //相机通用类1.启动LMI加速器 LMI加速器用于将相机…

11.10~11.15置信区间,均值、方差假设检验,正态,t,卡方,F分布,第一第二类错误

置信度&#xff0c;置信区间 给定一个置信度&#xff0c;就可以算出一个置信区间。 如果给的置信度越大&#xff0c;那么阿尔法就越小 给的置信度越小&#xff0c;那么α就越大&#xff0c;那么 考虑精确性&#xff0c;希望区间长度尽可能小&#xff0c;所以是取正态的中间…

【芯片设计- RTL 数字逻辑设计入门 5 -- 芯片产业 - 常见流程和术语】

文章目录 芯片产业 - 常见流程和术语角色晶圆晶圆等级工艺和阶段流片的过程和成本三大EDA厂商主流IP供应商 IC专业术语盘点&#xff08;A—G&#xff09;Flip-Flop 是什么&#xff1f;Flip-Flop 与 D触发器 芯片产业 - 常见流程和术语 角色 Foundry&#xff1a;在集成电路领域是…

istio安装文档

1、重装命令 istioctl manifest generate --set profiledemo | kubectl delete --ignore-not-foundtrue -f - 2、下载 参考&#xff1a;02、istio部署到k8s中 - 简书 (jianshu.com) 参考 Istio / 入门 curl -L https://istio.io/downloadIstio | ISTIO_VERSION1.20.0 TAR…

深度学习LSTM新冠数据预测 计算机竞赛

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项

问题&#xff1a;右键时&#xff0c;没有创建servlet的快捷键&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 1.打开idea&#xff0c;点击File>settings(设置)&#xff0c;进入settings页面&#xff0c;如下 从上图中的Files选项中没看到有servlet选项&#xff0c;…

阿里云腾讯云大比拼!阿里云99,腾讯云88!

首先&#xff0c;我们来看一下阿里云和腾讯云在云服务器价格上的差异。根据官方公布的信息&#xff0c;阿里云在双11大促活动中推出了全年最低价的云服务器&#xff0c;最低价格为87元1年。而腾讯云的云服务器价格稍高&#xff0c;最低为88元1年。虽然价格上的差距很小&#xf…

opencv(1):创建和显示窗口, 读取保存图片

下载源码&#xff0c;方便查看 API 信息。 快速在源码文件夹中搜索相关 api. grep“namedWindow(*-Rn// 限定 .h 文件 grep“namedWindow(*-Rn|grep "\.h" vscode 语法检测有问题 一直有波浪线 打开 vscode, setting 界面&#xff0c;搜索 python 在 setting.json…

系列二、类装载器ClassLoader

一、能干嘛 1.1、方法区 存放类的描述信息的地方。 1.2、JVM中的类装载器 1.3、获取ClassLoader的方式 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 0:08* Description: 获取类的加载器的方式*/ public class ClassLoaderMainApp {public static void main(String[] arg…

LeetCode——OJ题之二叉树【上】

✏️✏️✏️今天给大家分享几道二叉树OJ题&#xff01; &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点关注点点赞&#xff…

string的简单操作

目录 string的接口说明 构造 constructor operator 迭代器操作 begin( )和end( ) rbegin( ) 和 rend( ) 范围for和迭代器的关系 范围for 迭代器 容量 size lengtn max_size resize capacity reserve clear empty string类的元素访问 operator[ ] at fro…

【Shell脚本12】Shell 输入/输出重定向

Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入&#xff0c;默认情况下&#xff0c;这恰好是你的终端。同样&#xff0c;一个命令通常将其输出写入到标准输出&#xff0c;默…

unity3D scrollview嵌套不能滑动的问题及其解决办法

unity3D scrollview嵌套不能滑动的问题 问题来源&#xff1a; 现在有这么一个需求&#xff0c;有一个页面&#xff0c;希望外面是一个水平方向滑动的scrollView A&#xff0c;A的子对象是一种能在垂直方向滑动的scrollview&#xff0c;此时&#xff0c;如果不做特殊处理&#…

MySQL中全文索引和普通索引的区别

MySQL中的全文索引&#xff08;Full-Text Index&#xff09;和普通索引&#xff08;比如B-Tree索引&#xff09;是为了提高查询效率而设计的&#xff0c;但它们适用于不同的场景和查询类型。 普通索引&#xff08;如B-Tree索引&#xff09; 适用场景&#xff1a;普通索引适用于…

cleer的耳机怎么样?南卡和cleer哪个好?两款开放式耳机深度横评对比

随着开放式耳机的发展&#xff0c;成为许多用户的首选。开放式耳机因其更自然的音质表现和佩戴更舒适体验而备受欢迎。然而&#xff0c;市面上开放式耳机品牌和型号繁多&#xff0c;如何选择一款适合自己的耳机成为了许多用户的难题。 本期文章将为大家推荐两款市面上优秀的开…

【6】Spring Boot 3 集成组件:knift4j+springdoc+swagger3

目录 【6】Spring Boot 3 集成组件&#xff1a;knift4jspringdocswagger3OpenApi规范SpringFox Swagger3SpringFox工具&#xff08;不推荐&#xff09; Springdoc&#xff08;推荐&#xff09;从SpringFox迁移引入依赖配置jAVA Config 配置扩展配置&#xff1a;spring securit…

day26_css

今日内容 零、 复习昨日 一、CSS 零、 复习昨日 HTML - 页面基本骨架结构,内容展现 CSS - 美化页面,布局 JS - 动起来 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;…

第十九章总结

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…