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

 

本文转载于网络 如有侵权请联系删除

相关文章

  • IIS10服务器安装SSL证书的图文教程

    本文主要介绍IIS10服务器安装SSL证书的教程。在安装之前,先要申请一张合适的SSL证书,可以在本站申请,都是大品牌,而且证书类型丰富,能满足不同类型网站的需求。申请完成之后,用户将会收到SSL证书相关文件。将cer文件保存在需要安装的服务上。如果与申请证书的服务器不是同一台,证书文件可能无法导入。1)打开IIS(InternetInformationServices)管理器选择需要制作证书的服务器,选择服务器证书选项,进入服务器证书界面点击“完成证书申请…”,完成后续步骤。2)导入cer文件在“完成证书申请”界面,选择cer文件并填写相关信息,点击确定。导入证书前建议将文件名改为你的域名。好记名称用来标识证书,可自行选择标识信息(如:网站名称,到期时间等)。完成后可看到导入后的证书3)绑定证书选择你的服务器-网站-要绑定证书的web网站,点击右边“绑定”进入绑定界面。点击“添加”按钮,进行网站添加绑定。选择类型“https”,选择已添加的SSL证书,点击确定,绑定成功。完成之后重启服务器就可以使用https来访问网站了。原文链接:https://www.mimisucai.com/

  • 检测Tomcat假死时重新启动及邮件通知

    检测逻辑:连续3次访问tomcat提供的接口,若3次响应码都不为200,则自动重启tomcat 脚本内容:#!/bin/bash source/etc/profile IP=10.78.1.183 PORT=8114 TOMCAT_DIR=/soft/tomcat_8114 #定义发送邮件函数 functionsend_mail(){   maillist=(     linuxidc@linuxidc.com   )   DATE=`date+'%F%T'`   SUBJECT="${IP}的${PORT}端口发生故障,已自动重启!"   CONTENT="时间:${DATE}\n主机:${IP}\n事件:${PORT}端口发生重启"     formailin${maillist[*]};do       echo-e"${CONTENT}"|mail-s"${SUBJECT}"$mail     done } #对接口访问3次 declare-iNUM=0 foriin`seq13

  • 牛客网–采药(01背包)

    输入描述: 输入的第一行有两个整数T(1<=T<=1000)和M(1<=M<=100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。 接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采摘某株草药的时间和这株草药的价值。 输出描述: 可能有多组测试数据,对于每组数据, 输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。//01背包 #include<bits/stdc++.h> usingnamespacestd;structhert{ inttime; intvalue; }hert[101];intdp[1001];//T时间所得价值intmax(inti,intj){return(i>j)?i:j;}intmain(){ intm,t; inttime[100]; intprice[100]; while(cin>>t>>m){ for(inti=1;i<=m;i++){ cin>>hert[i].time>&

  • 061. Docker 命令

    1.获取镜像2.运行镜像3.列出镜像4.删除本地镜像5.启动容器1.基于镜像新建一个容器并启动dockerrun复制2.启动已终止的容器dockercontainerstart dockerstart复制6.后台运行7.停止运行的容器8.进入容器9.导出和导入容器导出容器如果要导出本地某个容器,可以使用dockerexport命令dockerexport容器ID>导出文件名.tar复制导入容器10.删除容器删除容器清理所有处于终止状态的容器

  • Linux之ls命令

    ls命令是linux下最常用的命令。ls命令就是list的缩写缺省下ls用来打印出当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。ls 命令在日常的linux操作中用的很多!1.命令格式:ls [选项] [目录名]2.命令功能:列出目标目录中所有的子目录和文件。3.常用参数:WX20210126-000215@2x4.常用范例:例一:列出/home/rumenz文件夹下的所有文件和目录的详细资料命令:ls -l -R /home/rumenz在使用 ls 命令时要注意命令的格式:在命令提示符后,首先是命令的关键字,接下来是命令参数,在命令参数之前要有一短横线“-”,所有的命令参数都有特定的作用,自己可以根据需要选用一个或者多个参数,在命令参数的后面是命令的操作对象。在以上这条命令“ ls -l -R /home/rumenz”中,“ls” 是命令关键字,“-l -R”是参数,“ /home/rumenz”是命令的操作对象。在这条命令

  • Android开发实现布局帧布局霓虹灯效果示例

    本文实例讲述了Android开发实现布局帧布局霓虹灯效果。分享给大家供大家参考,具体如下:效果图:实现方式:FrameLayout中,设置8个TextView,在主函数中,设计颜色数组,通过有序替换他们颜色,实现渐变效果。java代码:MainActivitypublicclassMainActivityextendsAppCompatActivity{ privateintcurrentColor=0; /* 定义颜色数组实现颜色切换类似鱼片切换 */ finalint[]colors=newint[]{ R.color.color1, R.color.color2, R.color.color3, R.color.color4, R.color.color5, R.color.color6, R.color.color7, R.color.color8 }; finalint[]names=newint[]{ R.id.view01, R.id.view02, R.id.view03, R.id.view04, R.id.view05, R.id.view06, R.id.view

  • C++11 lambda表达式小结

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/Enterprise_/article/details/102770174文章目录简介结构returntypeparameterlistcapturelist值捕获和引用捕获变量修改隐式和显式捕获捕获列表小结:examplesproblems1.为什么需要使用mutable才能进行修改?简介lambda表达式是一个匿名内联函数,可以定义别的函数体中,其形式如下:[capturelist](parameterlist)->returntype{funtionbody}复制从中可以看到,lambda只能使用尾置返回类型; 尾置返回类型放在参数列表后边以->开头,然后再原来放返回类型的地方放一个auto。结构lambda不可缺少的部分是捕获列表capturelist和函数体funtionbody,其他都可以忽略不写。returntypereturntype会根据funtionbody中的内容来推断,如果只含有一个return语句,类

  • (七)c#Winform自定义控件-进度条

    前提入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。GitHub:https://github.com/kwwwvagaa/NetWinformControl码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git如果觉得写的还行,请点个star支持一下吧目录https://www.cnblogs.com/bfyx/p/11364884.html准备工作该控件将继承基类控件UCControlBase,如果你还对UCControlBase不了解,请移步(一)c#Winform自定义控件-基类控件查看开始这个控件比较简单,没有多少东西,看下关键代码吧1privateint_value=0; 2 3publicintValue 4{ 5get{returnthis._value;} 6set 7{ 8if(value<0) 9return; 10this._value=value; 11SetValue(); 12} 13} 14 15privateintmaxValue=100; 16 17p

  • 程序员拒绝单曲循环:曲子只有5分钟,也得不重样播放450多天

    乾明发自凹非寺 量子位报道|公众号QbitAI程序员要是喜欢上一个东西,指不定会搞出什么“疯狂”事情来。今天要说的,是特别喜欢一首曲子的程序员贝特(AlexBainter)。这首曲子,名为aisatsana,来自电子乐大师AphexTwin,只有5分多钟。让他很苦恼的是,单曲循环听着容易腻歪,他想让这个曲子能一直不重样地播放下去。然后,他选择了马尔可夫链……现在这首曲子已经能够不间断播放451天不重样……(听歌地址在文末)贝特把完成这一“壮举”的过程写成了文章,分享了出来,而且,代码已经开源。在HackerNews很快就获得了400多热度,200多条评论。不少人评论称,这样听歌真的很爽,实现起来很简单,但效果很好!它到底是怎么做的呢?我们一起来看看。从算法的角度理解一首曲子想要曲子不重样地播放下去,首要的任务就是要理解曲子的结构。一般情况下,播放曲子的速度可以BPM(beatsperminute)来衡量。aisatsana这首曲子很简单,共有102BPM。如果从第一个音符开始计数的,每16个节拍包含一系列音符,他称之为乐句(phrase),整首曲子中,一共有32个乐句。想要创建一个能够

  • 数据猿专访丨地平线机器人创始人兼CEO余凯:大数据决定了人工智能的未来

    <数据猿导读>地平线机器人创始人兼CEO余凯接受数据猿专访是表示,现在智能来源就是来源于数据,这样的智能系统不光是来源于静态数据,而且还来源于智能硬件在被用户使用、交互的动态过程中,所以它其实是一个动态、连续学习的过程以及产生的动态数据 来源:数据猿记者:张艳飞2016年1月20日,数据猿作为独家全程直播与专访媒体,受邀参加“全球大数据峰会GlobalBigDataConference简称为GBDC”本届大会由世界O2O组织、全球大数据联盟GBDC、全球移动游戏联盟GMGC、光合资本主办,中国互联网协会O2O工作组、中国汽车流通协会支持。 GBDC全球大数据峰会在北京国家会议中心举办,本届大会规模逾3000人。大会从大数据改变政务管理方式、引领全球企业营销、智能交通综合服务、互联网整合营销运营、前沿科技等方面同现场嘉宾进行深入交流。通过行业大数据白皮书的分享和精彩的案例剖析,指导广大企业借助大数据发现广泛商业价值,切实有效地运用大数据的力量,帮助各行各业升级转型。大会涉及大数据与智能政务、汽车产业、金融产业、零售产业和房产行业等领域。GBDC全球大数据峰会是迄今为止亚太地区

  • [swustoj 1023] Escape

    Escape     Description BHisinamaze,themazeisamatrix,hewantstoescape! Input Theinputconsistsofmultipletestcases. Foreachcase,thefirstlinecontains2integersN,M(1<=N,M<=100). EachofthefollowingNlinescontainMcharacters.Eachcharactermeansacellofthemap. Hereisthedefinitionforchracter. Foracharacterinthemap:  'S':BH'sstartplace,onlyoneinthemap. 'E':thegoalcell,onlyoneinthemap. '.':emptycell. '#':obstaclecell. 'A':acceleratedrune. BHcanmoveto4directions(up,down,left,right)ineac

  • 主语

    主语 主语是一个句子的叙述的主体。一句话主要叙述的对象或者这句话主要讲的内容。 这句话主要讲什么,“什么”就是主语 我是中国人:主语是我,而不是中国人 英语很难学:主语是英语 Iamateacher,主语是“I” Chineseishard,主语是“Chinese” 什么词语可以构成主语 名词、代词、数词、动词不定式、动名词、句子、其他。 名词 名词都可以做主语(世间万物的名称):人名、地名、物品等 人称代词/指示代词 代词就是为了避免重复而代替名词的词语。避免啰嗦 代替人的代词就叫做人称代词(有些人称代词也可以指代事物);英文代词的使用频率比中文高,英文不喜欢重复,甚至不能容忍重复 人称代词又分为主格和宾格:主格就是作主语的格式,宾格就是作宾语的格式。作用不同。 人称代词的主格只有:“I、we、you、she、he、it、they“;This和that是指示代词也可以作主语 数词 123456789(基数词);第一、第二、第三、……(序数词) 动词不定式或者短语 非谓语动词 动名词或者动名词短语 句子也可以作主语(主语从句) 其他 不是名词

  • glog Google开源日志库

    glog为google开源库用于实现应用层日志记录,提供了基于C++Stream流及各种帮助宏定义的日志记录接口,提供到控制台、文件的日志记录功能; 以下以基于windows平台下,最基本框架使用入手,分析该开源项目,示例代码; #defineGOOGLE_GLOG_DLL_DECL   #defineGLOG_NO_ABBREVIATED_SEVERITIES   #include"glog/logging.h"   intmain(intargc,char*argv[])   {     FLAGS_log_dir="./glog_log";google::InitGoogleLogging(argv[0]);   LOG(INFO)<<"Found"<<15<<"cookies";   google::ShutdownGoogleLogging();   return0;   } 该基本实例代码中,一般在静态链接libglog_static.lib时需预先声明的宏GOOGLE_GLOG_DLL_DECL,此外在包含logging.h头文件前需要

  • 手机端rem

    1(function(doc,win){ 2vardocEl=doc.documentElement, 3resizeEvt='onorientationchange'inwindow?'onorientationchange':'resize', 4recalc=function(){ 5varclientWidth=docEl.clientWidth; 6if(!clientWidth)return; 7if(clientWidth>=750){ 8docEl.style.fontSize='100px'; 9}else{ 10docEl.style.fontSize=100*(clientWidth/750)+'px'; 11} 12}; 13 14if(!doc.addEventListener)return; 15win.addEventListener(resizeEvt,recalc,false); 16doc.addEventListener('DOMContentLoaded',recalc,false); 17})(document,window);复制

  • vue出镜率比较高的十大面试题

    1、vue的底层原理 vue是M-V-VM模式,通过modelView作为中间层,进行双向数据的绑定和变化①通过document.createDocumentFrament()方法建立虚拟Dom树②一旦被检测到数据发生变化,会通过Object.defineProperty定义的数据拦截③拦截到数据变化从而通过订阅-发布模式触发观察者,从而改变虚拟dom中具体数据④最后通过更新虚拟Dom的元素值,从而改变最后dom树的值,完成双向绑定   2、VueRouter路由模式hash和history的实现原理,以及他们的特性 hash模式实现原理:location.hash的值就是url中#后面的内容。以下几个特性:①url中hash值只是客户端一种状态,向服务端发送请求时hash部分不会被发送②hash值的改变,都会在浏览器增加一个历史记录,因此能通过浏览器回退、前进按钮控制hash的切换③可以用hashchange事件去监听hash变化,从而对页面进行跳转(渲染)④可以通过a标签设置href属性,当用户点击后hash值会发生变化,或者通过js对location.hash赋值改变u

  • 奇数次的数?

    题意: 给出n对数,表示有2*n个数,只有2个数出现了奇数次,内存限制1MB,现在需要知道这两个数是什么。   题解: 首先这一道题只有两个数出现了奇数次,那么其余的数都出现了偶数次,很容易就想到了"^",满足的性质就是相同数的影响会抵消。 那么在二进制的意义下,对于第i位,记录第i位为1的所有数的异或和,那么对于这个数组只可能出现两种值,0,ans0,ans1,ans0^ans1 然后再随便找到ans0,然后再用所有数的异或和,异或一下就知道ans1了~   代码: #include<cstdio> #include<vector> #include<iostream> #include<algorithm> usingnamespacestd; #defineLLlonglong LLS[31],x,Xor,ans[2]; intn; voidadd(LLx) { for(inti=30;i>=0;--i) if((1LL<<i)&x)S[i]^=x; } intmain()

  • SQL调优

    1、使用子查询和关联查询实现相同的功能耗时对比:   使用子查询来查询处理结果耗时分析    使用关联查询的查询结果耗时分析    可以看到关联查询耗时只是子查询的三分之一,相同条件下使用关联查询可以大大提高系统性能。  

  • 关于从入 OI 以来学的各种知识点的系统总结

    前言   OI之路差不多快结束了,最近水平也萎得很厉害,这里就开个目录,记录一些需要总结的知识点吧。不定期更,勿催,我还要改模拟赛的题。 目录 嗯。。。

  • javascript典型bug——错误的闭包

    昨天QT给我的一个功能提了一个bug。大概意思就是说,一段在不同位置都会被调用的代码,在A处被调用的时候,似乎会对其他调用的地方产生影响。 我仔细debug了半天,终于找到了原因。简化过的代码如下: 1functionC(name,id){ 2this.name=name; 3varprivateId=id; 4if(typeofthis.showName!="function"){ 5C.prototype.showName=function(){ 6console.log(this.name); 7} 8C.prototype.showId=function(){ 9console.log(privateId); 10} 11} 12 13} 14 15varc1=newC('name1','id1'); 16varc2=newC('name2','id2'); 17 18c1.showName();//name1 19c1.showId();//id1 20c2.showName();//name2 21c2.showId();//id1!!!!复制 问题出在最后一行,c2的

  • 思科Webex与下一代视频会议

    视频会议在人们的日常生活中使用愈发频繁,尤其是在新冠肺炎疫情的影响下视频会议市场急剧增长,由此引发了思科网讯视频技术的不断更新。本次分享,我们邀请到了思科协作技术事业部的首席工程师ThomasDavies先生,他向我们分享了AV1的发展历程,开发AV1时所受到的挑战,以及AV2的发展前景及其在实时通信中的作用。   文/ThomasDavies 整理/LiveVideoStack   大家好,我是ThomasDavies。我是思科协作技术事业部的首席工程师,今天我想和大家谈谈AV1、思科Webex与下一代视频会议。   我今天的演讲涉及几个内容,首先,我想谈谈最近由新冠肺炎引起的视频会议应用的迅猛发展。视频会议应用的普遍性应该已经有一段时间了,但新冠肺炎创造了一个转折点,改变了实时通信的格局。然后,我想谈谈历史背景,即开放媒体联盟和实时通信的历史。我们是如何取得AV1今天的发展的,当我们开发AV1时,我们考虑了怎样的实时通信因素。然后我想谈谈我们在思科Webex上的AV1编解码器,以及我们正在为我们的推广做什么工作。最后,我想谈谈AV2在实时通信中

  • JS事件流模型

    JS事件流模型 (一)JS中的事件流模型 1.事件冒泡(fasle/不写):当触发一个节点的事件是,会从当前节点开始,依次触发其祖先节点的同类型事件,直到DOM根节点。2.事件捕获(true):当初发一个节点的事件时,会从DOM根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。3.什么时候事件冒泡?什么时候事件捕获? ①当使用addEventListener绑定事件,第三个参数传为true时表示事件捕获; ②除此之外的所有事件绑定均为事件冒泡。 4.阻止事件冒泡:  ①IE10之前,e.cancelBubble=true; ②IE10之后,e.stopPropagation(); 5.阻止默认事件:  ①IE10之前:e.returnValue=false; ②IE10之后:e.preventDefault();   //css #div1{   width:300px;;   height:300px;    } #div2{  &n

相关推荐

推荐阅读