proto中service 作用的理解
2023-05-21 06:26:38 博客园

转载请注明出处:


(资料图片)

在 proto 文件中,service 用于定义一组 RPC 方法,在服务端实现这些方法,并在客户端调用这些方法进行远程过程调用。

service 的定义方式如下:

service MyService {  rpc MyMethod(MyRequest) returns (MyResponse);}

其中,MyService 是服务的名称,MyMethod 是方法的名称,MyRequest 和 MyResponse 分别是输入和输出消息的类型。

在 Java 中,使用 protoc 工具生成代码后,可以通过继承自动生成的 MyServiceGrpc 类来实现服务端和客户端。

例如,服务端可以创建一个继承自 MyServiceGrpc.MyServiceImplBase 的类,实现 MyMethod 方法,处理客户端发送过来的 MyRequest 消息,并返回 MyResponse 响应消息。示例代码如下:

class MyServerImpl extends MyServiceGrpc.MyServiceImplBase {  @Override  public void myMethod(MyRequest request, StreamObserver responseObserver) {    // 处理请求消息    ...    // 发送响应消息    MyResponse response = MyResponse.newBuilder().build();    responseObserver.onNext(response);    responseObserver.onCompleted();  }}

然后在启动服务器时将该服务添加到 ServerBuilder 中即可,示例代码如下:

Server server = ServerBuilder.forPort(PORT)        .addService(new MyServerImpl())        .build();server.start();

在客户端中,通过创建一个 MyServiceGrpc.MyBlockingStub 或 MyServiceGrpc.MyStub 对象来调用 MyMethod 方法。MyBlockingStub 提供了同步的阻塞式调用方式,而 MyStub 提供了异步的非阻塞式调用方式。示例代码如下:

ManagedChannel channel = ManagedChannelBuilder.forAddress(address, port).usePlaintext().build();MyServiceGrpc.MyBlockingStub blockingStub = MyServiceGrpc.newBlockingStub(channel);MyServiceGrpc.MyStub asyncStub = MyServiceGrpc.newStub(channel);MyRequest request = MyRequest.newBuilder().build();MyResponse response = blockingStub.myMethod(request);asyncStub.myMethod(request, new StreamObserver() {  @Override  public void onNext(MyResponse response) {    // 处理响应消息  }  @Override  public void onError(Throwable t) {    // 处理异常  }  @Override  public void onCompleted() {    // 完成回调  }});

客户端发送请求时,首先创建一个 MyRequest 消息对象,并将其传递给对应的 BlockingStub 或 Stub 调用方法(例如 myMethod 方法)。BlockingStub 方法会直接返回响应消息,而 Stub 方法会使用 StreamObserver 来接收异步的响应消息或错误。

在服务端接收到请求时,会根据请求消息里的方法名称调用相应的处理方法,并将请求消息作为参数传递给该方法提取所需信息并进行处理,然后返回所需的响应消息。整个过程中,双方都需要遵守相应的协议和格式规范。

如果 proto 文件中没有定义 service,则使用 protoc 直接生成 Java 文件时并不会生成 gRPC 相关的类和方法。

gRPC 的实现是基于 proto 文件中所定义的 Service,因此必须在 proto 文件中定义 Service 才能生成 gRPC 相关的类。

proto 文件中service的示例:

syntax = "proto3";package example;message Greeting {  string name = 1;}// 添加新的服务 Greeterservice Greeter {  rpc SayHello(Greeting) returns (Greeting) {}}

热门推荐

文章排行

  1. 2023-05-21proto中service 作用的理解
  2. 2023-05-21【播资讯】九阴真经徐家庄入门任务丫鬟的刺绣_九阴真经徐家庄入门任务
  3. 2023-05-21爱心回形针做法_爱心回形针怎么弄
  4. 2023-05-20天天通讯!今日vivoy85处理器相当于骁龙多少_y85处理器
  5. 2023-05-20香港九龙城电影拍摄现场升降台倒塌 8人受伤|微动态
  6. 2023-05-20北京举办“世界计量日”系列活动 围绕民生关切开展计量监督检查
  7. 2023-05-20520|为爱告白
  8. 2023-05-20每日热议!绿军0-2让湖人成最大输家!黄绿大战无望,萧华不会再保送詹姆斯
  9. 2023-05-20"医学生喷《后浪》剧情"登热搜!豆瓣平台大量差评!
  10. 2023-05-20【世界聚看点】“妈妈我还没上车呢”,妈妈送娃快到学校发现娃落家里了
  11. 2023-05-20麟游县气象台发布冰雹橙色预警【Ⅱ级/严重】【2023-05-20】_速递
  12. 2023-05-2071支球队晋级中青赛男子高中年龄段U17组全国总决赛 当前动态
  13. 2023-05-20新建区气象台发布雷电黄色预警信号【III级/较重】【2023-05-20】
  14. 2023-05-20精彩看点:救赎
  15. 2023-05-20快资讯丨北京公布5件典型案例
  16. 2023-05-20所有女人都会说谎 电影_所有女人都会说谎 天天热闻
  17. 2023-05-20人寰天尊(人寰)
  18. 2023-05-20广州:出租屋主不得提高价格标准,6月底前须纠正不规范收费_世界热头条
  19. 2023-05-20天天通讯!丢掉高跟鞋,这4双“战靴”才是开春时髦必备,搭连衣裙太美了!
  20. 2023-05-20捷度五金门窗配件怎么样(捷度记录仪官方网站)