proto中service 作用的理解

这篇具有很好参考价值的文章主要介绍了proto中service 作用的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

转载请注明出处:

  在 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 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;
}

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

 文章来源地址https://www.toymoban.com/news/detail-452051.html

到了这里,关于proto中service 作用的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 对卡尔曼滤波的理解:平滑插值、滤波和预测!想用的来看啦!

    前几天偶然看到一个叫卡尔曼滤波的家伙,闲来无事搜来看看,看的是迷迷糊糊,一会儿这里说是做时间序列平滑的,一会儿这里是说滤波的,一会儿说可以预测未来值,但预测不又需要当前的观测值么,那能不能进行多步预测呢,反正搞得是迷迷糊糊。直到我在百度百科上

    2024年02月13日
    浏览(29)
  • 快速掌握SpringBoot项目中的domain、mapper、service、controller层作用与书写格式

    承接上篇文章:http://t.csdn.cn/49QHB ①四个层负责的功能与作用: 1. Domain:包含业务实体,用于传输和封装数据。作用:作为数据载体,用于在各个模块之间传递业务数据。 2. Mapper:实现Domain与数据库表的映射及数据访问逻辑。作用:负责数据访问,将业务实体与数据库表进行映射,实现

    2024年02月03日
    浏览(34)
  • 【云原生】kubernetes深入理解之Service

    版权声明:本文为CSDN博主「开着拖拉机回家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 主页地址:开着拖拉机回家的博客_CSDN博客-Linux,Java基础学习,MySql数据库领域博主 目录 一、概述 1.1 Service 1.2 kube-proxy与Service 1.3VIP和Service代理 二、Pod与

    2024年02月08日
    浏览(39)
  • Spring Boot项目中的Controller、Service、Mapper和Entity层的作用与联系

    在Spring Boot项目中,常见的四个层次是Controller层、Service层、Mapper层和Entity层。它们各自承担着不同的职责,但彼此之间存在着紧密的联系。本文将详细介绍这四个层次的作用与联系,并提供相关实例来说明它们之间的关系。 Controller层是Spring Boot应用程序的入口点,用于处理

    2024年02月10日
    浏览(34)
  • web中为什么要引入service层以及前端控制器DispatchServlet的作用以及原理剖析

    review: 最初的做法是: 一个请求对应一个Servlet,这样存在的问题是servlet太多了 把一些列的请求都对应一个Servlet, IndexServlet/AddServlet/EditServlet/DelServlet/UpdateServlet - 合并成FruitServlet 通过一个operate的值来决定调用FruitServlet中的哪一个方法 使用的是switch-case 在上一个版本中,Ser

    2024年02月04日
    浏览(29)
  • 【CicadaPlayer】demuxer_service的简单理解

    G:CDNall_playersCicadaPlayer-github-0.44mediaPlayerSMPMessageControllerListener.cpp 根据option (Cicada::options),可以决定音视频的不同操作,通过 hander可以获得具体使用的demxuer实例, 通过uri 创建demuxer 实例

    2024年04月12日
    浏览(21)
  • 深入理解作用域、作用域链和闭包

     ​ 🎬 岸边的 风 :个人主页  🔥  个人专栏  :《 VUE 》 《 javaScript 》 ⛺️  生活的理想,就是为了理想的生活 ! ​ 目录  📚 前言  📘 1. 词法作用域 📖 1.2 示例 📖 1.3 词法作用域的应用场景  📘 2. 作用域链 📖 2.1 概念 📖 2.2 示例 📖 2.3 作用域链的应用场景  📘

    2024年02月10日
    浏览(30)
  • springboot中entity层,Dao层,mapper层,service层和controller层的关系和作用(通俗易懂版)

    entity(pojo,model)层 entity是存放实体的类,类中定义了多个类属性,并与数据库表的字段保持一致(通过配置文件可使得类中的驼峰命名和数据库表的下划线所对应)。 mapper(Dao)层 mapper层为数据持久层,mapper层的作用为访问数据库,向数据库发送sql语句,完成数据的增删

    2024年02月06日
    浏览(29)
  • Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析

    @[TOC]Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析 前言 做开发项目时,总会遇到这些包,理清他们的层次,非常有助于我们对于项目的理解和建立。 现阶段CSDN上貌似没有很系统,很详细的关于层级类的解释。因此总结了一下自己的经

    2024年02月07日
    浏览(29)
  • 作用域链的理解

    🍿🍿🍿作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 作用域决定了代码块中变量和其他资源的可见性 我们一般将作用域分成: 我们一般将作用域分成: 全局作用域 函数作用域 块级作用域 🧂🧂🧂任何不在函数中或是大括号中声明的变

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包