转载请注明出处:

  在 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) {}
}

proto中service 作用的理解的更多相关文章

  1. spring中scope(作用越)理解

    今天总结了一下spring中作用域scope的用法.在spring中作用域通过配置文件形式的用法如下. <bean id="role" class="spring. ...

  2. SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  3. 18 Customers' Role in Good Customer Service 客户在高质量客服中的作用

    Customers' Role in Good Customer Service 客户在高质量客服中的作用 ⑴High-quality customer service is preached by ...

  4. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  5. 什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么

    什么是Zookeeper,Zookeeper的作用是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问.这里给大家总结一下. 一.什么是Zooke ...

  6. Zookeeper的作用,在Hadoop及hbase中具体作用

    什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么 一.什么是Zookeeper ZooKeeper 顾名思义 动物园管理员,他是拿来管大象(Hado ...

  7. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  8. 对Object类中方法的深入理解

    看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...

  9. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  10. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

随机推荐

  1. mybatis-plus update的三种方式

    参考博客:https://blog.csdn.net/weixin_44162337/article/details/107828366 1.最常见:根据id更新,xxxService.updateB ...

  2. 震惊,一行MD5居然让小伙伴都回不了家!!!

    作者:京东零售 付伟 1. 前言 大家好,当你点开这篇文章的时候也许心想是哪个 XX 小编混到这里,先不要着急扔臭鸡蛋,本文是一篇标准(正经)的问题复盘文章.好了,一行MD5居然让小伙伴下不了班,到底 ...

  3. Resistance distance 图上2个节点的等效电阻求解算法

    目录 如何计算正方体网络中(乃至更一般的图)2个节点间的等效电阻? 公式的正确性很容易得到验证 如何计算Weighted matrix的Resistance matrix 我验证了特例,是对的,但是对 ...

  4. 实现一个CRDT工具库——ORSet

    ORSet 这段代码实现了OR-Set,是一种基于版本向量的CRDT,用于实现集合的合并.OR-Set由两个集合add和remove组成,add集合存储添加的元素,remove集合存储删除的元素.每个 ...

  5. 可视化—AntV G6 紧凑树实现节点与边动态样式、超过X条展示更多等实用小功能

    通过一段时间的使用和学习,对G6有了更一步的经验,这篇博文主要从以下几个小功能着手介绍,文章最后会给出完整的demo代码. 目录 1. 树图的基本布局和使用 2. 根据返回数据的属性不同,定制不一样的 ...

  6. Java19新特性

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  7. python入门教程之一 什么是python

    python简介 1 什么是python Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页 ...

  8. [Git]Git统计代码行数

    1 前言 今天,有这么一个需求:小组老大要求咱们[每个人]把[上个月]的[代码行数]统计一下并上报. 成,统计就统计,但那么多项目,总不能让我用手去数吧?何况,时间久了,自己也不清楚自己改了哪些地方了 ...

  9. 补五月三号java基础知识

    1.泛型技术可以通过一种类型或方法操纵各种不同类型的对象,同时又提供了编译时的类型安全保证.2.容器(即集合)是以类库形式 提供的多种数据结构,用户在编程时可直接使用3.泛型其实质就是将数据的类型参数 ...

  10. 如何在微信小程序中实现音视频通话

    微信小程序的音视频通话可以通过微信提供的实时音视频能力实现.这个能力包括了音视频采集.编码.传输和解码等多个环节,开发者只需要使用微信提供的 API 接口就可以轻松地实现音视频通话功能. 在具体实现上 ...