GRPC
gRPC(gRPC Remote Procedure Call)是由Google开发的高性能、跨语言的远程过程调用框架。它基于HTTP/2协议进行通信,支持多种编程语言,包括C++, C#, Java, Python等,使不同语言的应用程序可以通过远程调用相互通信。
1.关键特点和用途:
- 高性能:gRPC采用了HTTP/2协议,具有低延迟、高吞吐量和复用连接的特点。这使得它非常适合于需要高性能通信的应用程序。
- 跨语言支持:gRPC支持多种编程语言,允许不同语言的应用程序之间进行跨语言通信。这使得它在微服务架构中非常有用,因为不同的服务可以使用不同的编程语言实现。
- IDL(Interface Definition Language):gRPC使用ProtoBuf(Protocol Buffers)作为IDL,允许您定义服务接口和消息类型。这提供了强类型的通信,使得通信更加清晰和高效。
- 多种通信类型:gRPC支持不同类型的通信,包括请求-响应、服务器流、客户端流和双向流。这允许您选择最适合您应用程序需求的通信方式。
- 自动化代码生成:通过ProtoBuf定义服务接口和消息类型,gRPC工具会自动生成客户端和服务器端的代码,这样可以大大减少开发工作量。
- 认证和安全:gRPC支持各种认证和安全机制,包括SSL/TLS,OAuth等,以确保通信的安全性。
- 服务发现:gRPC可以与服务发现工具(如Consul、etcd)集成,从而实现动态服务发现和负载均衡。
- 可扩展性:gRPC是一个可扩展的框架,支持各种自定义扩展和中间件。
2.GRPC思路
Grpc类似于一种协议,遵循网络通讯,以.proto文件为协议模板进行客户端与服务端的交互开发,不限制客户端和服务端的代码语言风格.也可以在服务端与客户端使用不同的语言开发
3.编写.proto文件
// Protocol Buffers 语法版本 proto3 版本
syntax = "proto3";
// 定义了消息类型和服务的包名,类似于命名空间,用于避免命名冲突。
package Calculator;
// 定义了一个 gRPC 服务。在大括号中,您可以列出服务方法的定义。
service CalculatorService
{
// 定义了一个服务方法。rpc 表示定义一个远程过程调用(RPC)方法。MyMethod 是方法的名称,MyRequest 是输入参数类型,MyResponse 是输出参数类型。
rpc MyMethod (MyRequest) returns (MyResponse);
// 服务器流式方法
rpc ServerStreamingMethod(Request1) returns (stream Response1);
// 客户端流式方法
rpc ClientStreamingMethod(stream Request2) returns (Response2);
// 双向流式方法
rpc BidirectionalStreamingMethod(stream Request3) returns (stream Response3);
}
message MyRequest
{
repeated int32 num = 10;
}
message MyResponse
{
repeated string strs = 10;
}
message Request1
{
string Message = 1;
}
message Response1
{
string Message = 1;
}
message Request2
{
string Message = 1;
}
message Response2
{
string Message = 1;
}
message Request3
{
string Message = 1;
}
message Response3
{
string Message = 1;
}
syntax = "proto3";
package Calculator;
import "Protos/Calculator.proto";
service FirstService {
rpc MyMethod (MyRequest1) returns (MyResponse);
}
message MyRequest1
{
repeated int32 num = 10;
}
多个.proto文件间是可以调用的
4.添加.proto文件生成的文件编写服务端和客户端代码
.proto文件生成的文件位置 添加到客户端和服务端
5.服务端代码
using Calculator;
using Grpc.Core;
class CalculatorServiceImpl : CalculatorService.CalculatorServiceBase
{
/// <summary>
/// 发布响应
/// </summary>
/// <param name