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

news/2025/2/22 12:19:50/

技术主题

在一次和公司的人工智能部门的对接中,涉及到了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 {@Overridepublic 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文件中,可以根据实际需求选择合适的数据类型来定义消息类的字段。同时,也可以使用自定义的数据类型来满足特定需求。


http://www.ppmy.cn/news/788379.html

相关文章

网站中qq 跳转 和qq群问题

1.qq 跳转连接&#xff1a; http://wpa.qq.com/msgrd?v3&uin827681776&siteqq&menuyes 后来发现在手机端。页面不跳转qq应用&#xff0c;是因为没有开通qq商家这个功能&#xff0c;不能在手机端进行推广&#xff0c;自行百度可以处理 2.qq群 https://jq.qq.co…

QQ群视频出现imsdk登录失败的解决方法

如果出现imsdk登陆失败&#xff0c;关闭QQ重新打开&#xff0c;然后打开群视频&#xff0c;这时自动下载odsdk.json的文件&#xff0c;一定要注意&#xff0c;打开文件位置然后复制移动到&#xff0c;C:\ProgramFiles\Tencent\QQ文件里边就可以&#xff0c;然后重试就可以了。 …

qq机器人账号不能发送群消息,被风控

当我们在群里测试机器人时&#xff0c;发现机器人无回应&#xff0c;在cqhttp端可以看到群消息发送失败&#xff0c;账号可能被风控&#xff0c;如下图所示&#xff1a; 针对这种情况&#xff0c;我们可以在手机端登录该qq账号&#xff0c;在qq群内发送一个消息&#xff0c;就会…

【NovelAI】在QQ群中部署AI画图机器人

目录 一、NovelAI 二、UIautomation和pywin32 三、代码 1、AI画图相关 2、QQ群消息抓取相关 四、代码效果 五、后记 一、NovelAI NovelAI是一个用来画二次元图片的开源算法&#xff0c;部署方式见 b站链接 二、UIautomation和pywin32 UIautomation和pywin32是pytho…

Android 如何在第三方app 调起qq好友和qq群

一、调起qq好友的方法&#xff1a; try {//可以跳转到添加好友&#xff0c;如果qq号是好友了&#xff0c;直接聊天String url "mqqwpa://im/chat?chat_typewpa&uin对方QQ号";//uin是发送过去的qq号码startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(…

微信实现qq群的qq小冰功能

常玩qq的人应该知道qq群里可以引入一个“聊天机器人”qq小冰&#xff0c;而后可以在群里通过qq小冰来达到调戏的目的 然而尿性的腾讯除了qq之外还有微信这样一款聊天的软件 本文目的就是注册一个微信号&#xff08;来作为我们的机器人&#xff09;&#xff0c;将其拉到微信群里…

Android开发之添加QQ群的方法(官方代码)

/**************** * * 发起添加群流程。群号&#xff1a;物美价廉淘宝购(485761716) 的 key 为&#xff1a; uTJdlkbFAd9IdpZKEN6vumHHYqFyuTPt * 调用 joinQQGroup(uTJdlkbFAd9IdpZKEN6vumHHYqFyuTPt) 即可发起手Q客户端申请加群 物美价廉淘宝购(485761716) * * param key 由…

ChatGPT在社交媒体分析中的应用如何?

ChatGPT在社交媒体分析中具有广泛的应用潜力&#xff0c;可以提供有价值的洞察和支持。以下是ChatGPT在社交媒体分析中的一些应用场景&#xff1a; 1. 情感分析和舆情监测&#xff1a;ChatGPT可以分析社交媒体上用户的发帖、评论和回复&#xff0c;进行情感分析和舆情监测。它…