GRPC的学习(高性能远程过程调用框架)

这篇具有很好参考价值的文章主要介绍了GRPC的学习(高性能远程过程调用框架)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

技术主题

在一次和公司的人工智能部门的对接中,涉及到了grpc接口,实现的是实时语音流转文字。把自己对grpc的理解归纳出博客,并且分享出来。我会围绕几个点进行展开,gprc和rpc的差别,以及分析下优缺点,最后通过一个实例。

技术一GRPC和RPC的区别

  1. 通信协议:RPC使用的通信协议多数是基于文本的协议,如XML-RPC、JSON-RPC,或者是基于二进制的协议,如Apache Thrift。而GRPC使用HTTP/2协议作为底层的传输协议,它是一种二进制协议,比起基于文本的协议,具有更高的性能和效率。
  2. 序列化协议:RPC的序列化协议可以根据需求而灵活选择,常见的有JSON、XML、二进制等。而GRPC默认使用Google开发的Protocol Buffers(ProtoBuf)作为序列化和反序列化的标准,ProtoBuf使用二进制编码,具有高效的序列化和更小的消息体积。
  3. 支持的语言:RPC比较灵活,可以支持多种编程语言。常见的RPC框架如Apache Thrift、Apache Axis等支持多种语言,如Java、C++、Python等。而GRPC也支持多种语言,如C++, Java, Python, Go, Ruby, C#, Node.js等。
  4. 技术生态:RPC的技术生态相对成熟,具有较多的开发者社区和工具支持。而GRPC是相对较新的技术,虽然也有一定的社区生态,但相对来说还比较年轻。
  5. 可扩展性和高级特性:GRPC内置了很多高级特性,如流式处理、双向流等,支持更灵活和高效的通信方式。RPC也可以实现这些功能,但需要自己去构建和实现。GRPC支持双向流和流式处理,使得客户端和服务器之间可以同时发送和接收多个消息,从而实现更灵活和高效的通信方式

技术二GRPC的缺点

  1. 学习曲线较陡峭:GRPC使用了IDL来定义服务接口,并且涉及到多种技术和概念(如Protocol Buffers、HTTP/2等),对于初学者来说需要一定的学习和理解成本。
  2. 不适合传输大文件:由于GRPC的设计目标是高性能,而HTTP/2协议并不适合传输大文件,因此对于需要传输大文件的场景不太友好。
  3. 难以调试:由于GRPC使用了二进制的数据序列化方式,难以直接查看和调试传输的数据,对于调试和问题排查可能不太方便。
  4. 不适合低带宽环境:虽然GRPC可以通过配置和优化来减小传输的数据量,但对于低带宽环境来说,GRPC仍然需要较高的带宽才能提供良好的性能。

技术三使用GRPC的步骤

  1. 定义服务接口:使用Protocol Buffers语言编写文件来定义您的服务接口和消息格式。这些文件包括.proto扩展名,其中包含了消息的字段和RPC方法的定义。
  2. 生成代码:使用gRPC提供的代码生成工具将.proto文件编译为所需的编程语言的代码。这将根据您的选择生成客户端和服务器代码,以便您可以轻松地在应用程序中使用。
  3. 实现服务:使用生成的代码,实现服务器端的逻辑以处理客户端发送的请求。这包括将服务器端函数与所定义的RPC方法进行绑定。
  4. 启动服务器:将服务器应用程序部署到适当的环境中并启动它。服务器将侦听来自客户端的请求,并根据接收到的RPC方法调用来执行相应的功能。
  5. 创建客户端:使用生成的客户端代码在客户端应用程序中创建一个gRPC客户端实例。这将允许您通过调用相应的RPC方法向服务器发送请求。
  6. 进行通信:使用生成的客户端代码,调用合适的RPC方法并发送请求到服务器。服务器将处理请求,并返回适当的响应给客户端。

技术四使用GRPC的例子

以下是一个使用Java编写的简单gRPC示例:

  1. 定义服务接口
syntax = "proto3";
package helloworld;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
  1. 生成代码

使用gRPC提供的代码生成工具,将.proto文件编译为Java的代码。例如,可以使用以下命令生成Java代码:

protoc -I=./ --java_out=./ greeter.proto
  1. 实现服务

在Java中实现服务,例如:

import io.grpc.stub.StreamObserver;
import helloworld.GreeterGrpc;
import helloworld.HelloRequest;
import helloworld.HelloReply;

public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
        String message = "Hello, " + request.getName() + "!";
        HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}
  1. 启动服务器

启动gRPC服务器,例如:

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class GrpcServer {
    public static void main(String[] args) {
        try {
            Server server = ServerBuilder.forPort(50051).addService(new GreeterImpl()).build();
            server.start();
            System.out.println("Server started on port " + server.getPort());
            server.awaitTermination();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 创建客户端

创建一个gRPC客户端,例如:

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import helloworld.GreeterGrpc;
import helloworld.HelloRequest;
import helloworld.HelloReply;

public class GrpcClient {
    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();
        GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);

        HelloRequest request = HelloRequest.newBuilder().setName("World").build();
        HelloReply response = stub.sayHello(request);

        System.out.println(response.getMessage());

        channel.shutdown();
    }
}

这个例子中,客户端向服务器发送一个名为"World"的问候请求,并打印服务器的响应消息。

请注意,您需要确保已经引入正确的gRPC库,以及在服务器和客户端的构建和配置中进行相应的设置。

技术五proto的数据类型

在Proto文件中,有多种数据类型可以用来定义字段的类型。以下是一些常见的数据类型:

  1. 基本数据类型:
  • bool:布尔类型,表示true/false。
  • int32、int64、uint32、uint64:整数类型,分别表示32位有符号整数、64位有符号整数、32位无符号整数、64位无符号整数。
  • float、double:浮点数类型,分别表示单精度浮点数、双精度浮点数。
  • string:字符串类型。
  • bytes:字节数组类型,用于存储任意二进制数据。
  1. 枚举类型:
  • enum:枚举类型,可以用于定义一组有限的取值,每个取值都有一个唯一的名称和对应的值。
  1. 嵌套消息类型:
  • message:消息类型,用来定义一个嵌套的消息类,可以包含自己的字段。
  1. 重复类型:
  • repeated:重复类型,用于定义一个字段可以出现多次,可以是任何其他的数据类型。

在Proto文件中,可以根据实际需求选择合适的数据类型来定义消息类的字段。同时,也可以使用自定义的数据类型来满足特定需求。文章来源地址https://www.toymoban.com/news/detail-543133.html

到了这里,关于GRPC的学习(高性能远程过程调用框架)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++高性能服务器网络框架设计与实现

    这篇文章将从两个方面来介绍,一个是服务器中的基础的网络通信部件;另外一个是,如何利用这些基础通信部件整合成一个完整的高效的服务器框架。注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我们传

    2024年02月04日
    浏览(54)
  • FastAPI 构建 API 高性能的 web 框架(一)

    如果要部署一些大模型一般langchain+fastapi,或者fastchat, 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址: https://fastapi.tiangolo.com/zh/ 来源:大语言模型工程化服务系列之五-------复旦MOSS大模型fastapi接口服务 服务端代码: api启动后,调用代码: 来源: 大语

    2024年02月13日
    浏览(48)
  • FastAPI 构建 API 高性能的 web 框架(二)

    上一篇 FastAPI 构建 API 高性能的 web 框架(一)是把LLM模型使用Fastapi的一些例子,本篇简单来看一下FastAPI的一些细节。 有中文官方文档:fastapi中文文档 假如你想将应用程序部署到生产环境,你可能要执行以下操作: 并且安装uvicorn来作为服务器: 然后对你想使用的每个可选

    2024年02月12日
    浏览(51)
  • C语言网络编程:实现自己的高性能网络框架

    一般生产环境中最耗时的其实是业务逻辑处理。所以,是不是可以将处理业务逻辑的代码给拆出来丢到线程池中去执行。 比如像下面这样: ​我们事先创建好一堆worker线程,主线程accepter拿到一个连接上来的套接字,就从线程池中取出一个线程将这个套接字交给它。这样,我

    2024年02月10日
    浏览(47)
  • 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

    QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化 简介 本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果

    2024年02月14日
    浏览(53)
  • 【中间件-Openjob】高性能任务调度框架Openjob简介及快速搭建

    一款分布式高性能任务调度框架,支持多种定时任务、延时任务、工作流设计、轻量级分布式计算、无限水平扩容,并具有较高的可伸缩性和容错性,以及完善权限管理、强大的告警监控、原生支持多语言。 基础信息 中文官网 :https://openjob.io/zh-Hans/ 开源地址 :https://githu

    2024年02月12日
    浏览(63)
  • 深入浅出OkHttp,【带你手写】构建高效、高性能的网络请求框架

    OKHttp是一个用Java编写的网络框架,可用于 Android,以及一些基于Java的web应用开发中。它使用了HTTP/2标准的支持和连接池技术,可以让应用快速向Web服务器发送网络请求,并得到响应。OKHttp提供了一个简单的API,允许开发者发送同步或异步的HTTP请求,并处理来自Web服务器的响

    2023年04月20日
    浏览(47)
  • 一步步教你安装Webman,轻松搭建高性能的PHP框架

    Webman是一款基于Workerman开发的高性能PHP应用框架,它提供了丰富的功能和灵活的配置选项,适用于构建各种类型的Web应用程序。本文将详细介绍如何在宝塔面板上安装Webman,帮助你快速搭建一个高性能的PHP框架。 步骤1:安装宝塔面板 首先,我们需要在服务器上安装宝塔面板

    2024年03月26日
    浏览(77)
  • 生信工作流框架搭建 | 04-nextflow与Slurm高性能计算

    本篇为biodoge《生信工作流框架搭建》系列笔记的第5篇,该系列将持续更新。 上回生信工作流框架搭建 | 03-nextflow与AWS批量计算为大家提供了nextflow上云的实用教程。虽然AWS批量计算技术含量较大,但毕竟在国内应用场景较少,下面将为大家介绍另一种更为常用的应用:阿里云

    2024年02月15日
    浏览(100)
  • 高性能 RPC 框架 CloudWeGo-Kitex 内外统一的开源实践

    日前,字节跳动技术社区 ByteTech 举办的第七期字节跳动技术沙龙圆满落幕,本期沙龙以《字节高性能开源微服务框架:CloudWeGo》为主题。在沙龙中,字节跳动字节跳动基础架构服务框架资深研发工程师 杨芮 ,跟大家分享了《高性能 RPC 框架 Kitex 内外统一的开源实践》,本文

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包