首页 > 其他分享 >proto中service 作用的理解

proto中service 作用的理解

时间:2023-05-20 23:55:23浏览次数:37  
标签:MyResponse service proto MyServiceGrpc 理解 MyRequest 方法

转载请注明出处:

  在 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<MyResponse> 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<MyResponse>() {
  @Override
  public void onNext(MyResponse response) {
    // 处理响应消息
  }

  @Override
  public void one rror(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;
}

// 添加新的服务 Greeter
service Greeter {
  rpc SayHello(Greeting) returns (Greeting) {}
}

 

标签:MyResponse,service,proto,MyServiceGrpc,理解,MyRequest,方法
From: https://www.cnblogs.com/zjdxr-up/p/17418058.html

相关文章

  • 配置k8s的一个serviceaccount具有管理员权限并获取他的token
    创建sa账户/授定管理员角色权限cat>sa.yaml<<eofapiVersion:v1kind:ServiceAccountmetadata:name:kubepi-usernamespace:kube-systemeofcat>rolebe.yaml<<eofapiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:na......
  • 深入理解多核处理器的缓存一致性和通信机制
    操作系统级别的上下文切换操作系统级别的上下文切换是指当一个线程在执行过程中发生某种事件(如时间片用完、发生中断等),操作系统需要暂停当前线程的执行,保存其上下文(如寄存器状态、程序计数器、堆栈指针等),并切换到另一个线程继续执行的过程。这种上下文切换是由操作系统内核......
  • 关于RPC和HTTP的理解
    RPC(RemoteProcedureCall,远程过程调用)和HTTP(HypertextTransferProtocol,超文本传输协议)是两种不同的通信协议,用于在计算机网络中实现不同系统之间的通信和数据交换。RPC(远程过程调用):RPC是一种通信机制,允许一个程序调用另一个运行在不同地址空间的程序或服务的方法(即远程过......
  • Field userClient in com.demo.order.service.OrderService required a bean of type'
    在SpringCloud项目中使用Feign进行远程调用遇到的错误。原因是因为UserClient在com.demo.feign.clients包下面,而order-service的@EnableFeignClientd注解却在com.demo.order包下面,这两个不在同一个包下,无法扫描到UserClient。解决方法有两种1.指定Feign应该扫描的包@EnableFeig......
  • 小白如何理解软件自动化接口测试
    随着软件开发行业的不断发展,软件测试接口自动化已经成为了一种趋势。接口自动化可以提高软件测试的效率和准确性,减少人力成本和时间成本,帮助企业更好地实施软件测试接口自动化。1.选择合适的自动化测试工具在进行接口自动化测试之前,需要选择一款适合自己的自动化测试工具。市......
  • 信息熵、交叉熵、KL散度公式的简单理解
    整理:我不爱机器学习1信息量信息量是对信息的度量,就跟时间的度量是秒一样,考虑一个离散的随机变量x的时候,当观察到的这个变量的一个具体值的时候,我们接收到了多少信息呢?例如听到太阳从东方升起,这样信息对于我们来说价值不大,因为这是一个必然事件,所以这个信息传递给我们的信息量为......
  • C#调用WebService方法
    1.已知WebService接口的URL,直接调用在VS中,添加服务引用--高级--添加web引用直接输入webserviceURL然后,直接实例化该命名空间下的类的对象,调用该接口下的各个方法即可。2.动态调用以下为帮助类:usingMicrosoft.CSharp;usingSystem;usingSystem.CodeDom;usingSystem.CodeDom......
  • 对sockpair加fork的理解
    socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组eg.s[2]这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向s[0]中写入,就可以从s[1]中读取(只能从s[1]中读取),也可以在s[1]中写入,然后从s[0]中读......
  • Nacos 核心原理解读+高性能微服务系统实战
    Nacos核心原理解读+高性能微服务系统实战download:3w51xuebccom《模拟人生4》(TheSims4)是一款由Maxis和TheSimsStudio开发,由ElectronicArts发行的模拟人生游戏。它被广泛认为是模拟人生系列中最好玩的一部分。本文将向您介绍TS4的入门知识。TS4的基本概念在TS4中,你可以创建......
  • 深入理解JavaScript的变量作用域
    一篇整理的不错的文章。  深入理解JavaScript的变量作用域1、JavaScript的作用域链2、函数体内部,局部变量的优先级比同名的全局变量高。3、JavaScript没有块级作用域。4、函数中声明的变量在整个函数中都有定义。5、未使用var关键字定义的变量都是全局变量。6、全局变量都是win......