解开gRPC神秘面纱(一)

      gRPC是什么?

      gRPC是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计,是由谷歌发布的首款基于Protocol Buffers的RPC框架。 gRPC基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩、单TCP连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电且节省空间占用。 gRPC 1.0版本是2015年面世以后的第一次版本发布,开发者可以把该版本用于生产。API现在也是很稳定的。


      关于gRPC的资料介绍

      跨语言特性:

      目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。


      服务定义:

      正如其他 RPC 系统,gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  required string greeting = 1;
}

message HelloResponse {
  required string reply = 1;
}

    

       gRPC 允许你定义四类服务:

      单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。
      服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
      客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
       双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。


      同步 vs 异步

      同步 RPC 调用一直会阻塞直到从服务端获得一个应答,这与 RPC 希望的抽象最为接近。另一方面网络内部是异步的,并且在许多场景下能够在不阻塞当前线程的情况下启动 RPC 是非常有用的。在多数语言里,gRPC 编程接口同时支持同步和异步的特点。

       gRPC的初步认识暂时这么多,先知道它是什么,然后才是怎么使用它,后续更精彩……
要实现 grpc Java 的一元异步调用,可以按照以下步骤进行: 1. 定义 proto 文件,并使用 protobuf 编译器生成 Java 类。 2. 在服务端实现 proto 文件中定义的服务接口,并启动服务。 3. 在客户端创建一个 Channel 和 Stub 对象,用于连接服务端并调用服务。 4. 使用 Stub 对象创建一个异步调用请求,并设置回调函数处理服务端返回的响应结果。 下面是一个简单的示例代码: ```java // 引入 grpc 相关库 import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.stub.StreamObserver; // 创建 Channel ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080).usePlaintext().build(); // 创建 Stub MyServiceGrpc.MyServiceStub stub = MyServiceGrpc.newStub(channel); // 创建请求消息 MyRequest request = MyRequest.newBuilder().setParam("param").build(); // 发送异步请求 stub.myMethod(request, new StreamObserver<MyResponse>() { @Override public void onNext(MyResponse response) { // 处理服务端返回结果 } @Override public void onError(Throwable t) { // 处理请求出错 } @Override public void onCompleted() { // 请求完成 } }); ``` 在上面的代码中,我们首先创建了一个 Channel 对象,用于连接服务端。然后创建了一个 Stub 对象,用于调用服务端的 `myMethod` 方法。接着创建了一个请求消息对象,并调用 Stub 的 `myMethod` 方法发送异步请求。最后,我们设置了一个回调函数,用于处理服务端返回的响应结果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值