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) {}
}
proto中service 作用的理解的更多相关文章
- spring中scope(作用越)理解
今天总结了一下spring中作用域scope的用法.在spring中作用域通过配置文件形式的用法如下. <bean id="role" class="spring. ...
- SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- 18 Customers' Role in Good Customer Service 客户在高质量客服中的作用
Customers' Role in Good Customer Service 客户在高质量客服中的作用 ⑴High-quality customer service is preached by ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- 什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么
什么是Zookeeper,Zookeeper的作用是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问.这里给大家总结一下. 一.什么是Zooke ...
- Zookeeper的作用,在Hadoop及hbase中具体作用
什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么 一.什么是Zookeeper ZooKeeper 顾名思义 动物园管理员,他是拿来管大象(Hado ...
- SQL SERVER 2005/2008 中关于架构的理解(二)
本文上接SQL SERVER 2005/2008 中关于架构的理解(一) 架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...
- 对Object类中方法的深入理解
看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...
- Android中Service的使用详解和注意点(LocalService)
Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...
- C++中 类的构造函数理解(一)
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...
随机推荐
- Spring--AOP简介+入门案例
AOP简介 面向切面编程:在不惊动原始设计的基础上,进行功能增强 各个要应用该功能的对象叫做连接点,那个功能叫做通知,表面上的代码没有发生变化,私下里发生变化的连接点,会出现切入点,切入点与通知通过切 ...
- 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
MyBatis的模糊查询sql语句与之前使用的不太一样 主要是利用下面这种语句实现的(查了好久的,认真记一下吧!) select * from huodong where theme like con ...
- 详解ResNet 网络,如何让网络变得更“深”了
摘要:残差网络(ResNet)的提出是为了解决深度神经网络的"退化"(优化)问题.ResNet 通过设计残差块结构,调整模型结构,让更深的模型能够有效训练更训练. 本文分享自华为云 ...
- 马志强:语音识别技术研究进展和应用落地分享丨RTC Dev Meetup
本文内容源自「RTC Dev Meetup 丨语音处理在实时互动领域的技术实践和应用]的演讲分享,分享讲师为寰语科技语音识别研究主管马志强. 01 语音识别技术现状 1.语音成为万物互联时代人机交互关 ...
- 【读书笔记】Nice Families Of GF
目录 Nice Families Of GF rational rational algebraic D-finite总览 下定义 逻辑关系 例子 更多的例子和判别法 运算是否有性质? 运算是否有性质 ...
- 主板芯片组驱动和Win系统版本互相关联
主板芯片组驱动和Win系统版本互相关联,过早的系统安装较新版的芯片组驱动,或者较新版本的操作系统安装旧版的芯片组驱动,都可能导致系统不稳定蓝屏.解决方案就是安装最新的芯片组驱动和最新版的操作系统.
- 【超详细】Ubuntu 20.04 安装 Apache+PHP网页环境 图文教程,常见问题和解决方案
本文将介绍在Ubuntu20.04 LTS环境下安装Apache的全过程,针对其中可能出现的一些坑也会提供解决方案. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗 ...
- noopener, noreferrer 及 nofollow 的用法
<a> 标签通常会配合着使用 noopener, noreferrer 及 nofollow 这些属性, 它们的作用及用法如下. noopener 当给链接加上 target=" ...
- 新旧版本功能对比 | v1.5.0 全新升级
Hi~社区的小伙伴们大家好呀! CloudQuery 最新 1.5.0 社区版本即将于 4月14日 发布,正式上线前,我们迫不及待与大家分享与 v1.4 相比,v1.5.0 在性能和功能上有哪些更新和 ...
- Disruptor-简单使用
前言 Disruptor是一个高性能的无锁并发框架,其主要应用场景是在高并发.低延迟的系统中,如金融领域的交易系统,游戏服务器等.其优点就是非常快,号称能支撑每秒600万订单.需要注意的是,Disru ...