@GrpcServise 注解的作用和使用

转载请注明出处:

1. @GrpcServise 的作用和优势

  在没有使用 @GrpcServise 注解编写服务端时,我们通常需要自定义 Server 以及端口,包括 start,stop ,注册service 方法等等,开发比较复杂。

  使用 @GrpcService 则可以省去 自定义server,端口,包括start,stop方法等等,可以直接去实现我们需要的 grpc 方法,并使用 @GrpcService注解 就可以完成grpc 服务端的代码开发。

  使用 @GrpcService 注解与不使用该注解编写服务端代码的主要区别在于,@GrpcService 注解可以使 gRPC Server 自动扫描注解的服务并自动将其绑定到 gRPC 服务器中,而不需要手动注册这些服务实现。

  使用 @GrpcService 注解的优势在于:

  1. 简化了 gRPC Server 的配置

    因为 Spring Boot 提供自动配置管理,所以无需创建自己的服务器实例或手动将服务绑定到服务器上。Spring Boot 能够自动注册服务 Bean 并将其添加到正确的位置。

    2. 易于维护

  当编写大型应用程序时,可能需要处理数百个接口和服务。使用 @GrpcService 注解可以避免手动维护所有服务实现实例的繁琐工作,并使代码更易于管理和维护。

2.@GrpcServise 的使用

  下面是一个简单的示例,展示了如何使用 @GrpcService 注解定义服务实现:   1.maven中添加相关的依赖:
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-spring-boot-starter</artifactId>
    <version>${grpc.version}</version>
</dependency>

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-core</artifactId>
    <version>${grpc.version}</version>
</dependency>

  2.使用示例:

@GrpcService
public class MyServiceImpl extends MyServiceGrpc.MyServiceImplBase {
    @Override
    public void myMethod(MyRequest request, StreamObserver<MyResponse> responseObserver) {
       // ...
    }
}

  同时,我们可以在spring boot的配置文件中设置grpc 相关的属性,例如 指定端口:

grpc:
  server:
    port: 8888

  @GrpcService 是一个 Spring Boot 处理器,它会查找实现了 grpc::BindableService 接口的类,并将其包装成一个 Spring Bean 对象。然后,将这些 Bean 对象注册到 gRPC Server 中。

 

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

相关文章

  • Oracle 10g 报错 ORA-04031 的解决方案

    Oracle10g慢慢退出了,但用的地方也还有。这里再记一下案例:数据库16:58出现大量4031,导致数据库无法使用,取对应时段的AWR发现shared_pool一直在收缩; 查看日志: **2018-07-2616:58:09.868 ORA-00604:递归SQL级别1出现错误 ORA-04031:无法分配32字节的共享内存("sharedpool","selectcount()fromsys.job...","sqlarea","tmp")查看对应的trc:LIBRARYCACHESTATISTICS: namespace     getshitratio   pinshitratio  reloads invalids ---------------------------------------------------------------------- CRSR     889957320  0.2452974322326  0.877  6674225  3570108出现大量的curso

  • 密码学的基础:X.690和对应的BER CER DER编码

    简介之前我们讲到了优秀的数据描述语言ASN.1,很多协议标准都是使用ASN.1来进行描述的。对于ASN.1来说,只定义了数据的描述是不够的,它还规定了消息是如何被编码的,从而可以在不同的机器中进行通讯。ASN.1支持一系列的编码规则,比如BER,DER,CER等。而X.690就是一个ITU-T的标准,它里面包含了一些对ASN.1进行编码的规则。有人要问了,那么什么是ITU-T呢?ITU-T的全称是InternationalTelecommunicationUnionTelecommunicationStandardizationSector,也就是国际电联电信标准化部门,主要用来协调电信和信息通信技术标准。X.690主要包含了BasicEncodingRules(BER),CanonicalEncodingRules(CER)和DistinguishedEncodingRules(DER)这三种编码规则。接下来,我们来看下这些编码规则的实现细节。BER编码BER的全称是BasicEncodingRules,它是最早的编码规则,使用Tag-Length-Value(TLV)的格式对所有信

  • 服务端测试之SkyWalking搭建

    点击上方蓝字,关注我们微服务架构的特性是服务体系多,这样意味着需要对很多的微服务需要进行监控以及质量体系的保障。特别是需要清晰的知道服务调用链以及服务请求的响应时间。基于这样的诉求,目前主流的APM的监控工具主要为SkyWalking和pinPoint以及Cat工具链。下面主要以SkyWalking工具为核心,来演示下基于SkyWalking全链路工具的整合和案例实战应用。 在安装SkyWalking前我们首先需要安装elasticsearch(在ELK环境搭建中文章中详细了说明了ES的搭建和应用)。到elasticsearch,到该工具的bin目录下,执行./elasticsearch就会启动ES的服务。监听的端口是9200,在浏览器访问http://localhost:9200/,就会显示如下的信息:下面来说明SkyWalking的下载以及安装。在SkyWalking的官方地址下载apache-skywalking-apm-8.3.0.tar.gz,下载成功后进行解压,在apache-skywalking/config的目录下,完善application.yml的文件,我们使用el

  • equals()与==的区别?

    ==:它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。因为Java只有值传递,所以,对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。equals():它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类。Object类equals()方法:publicbooleanequals(Objectobj){ return(this==obj); }复制equals()方法存在两种使用情况:情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。使用的默认是Object类equals()方法。情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。publicclasstest1

  • Elasticsearch分词:内置分词器

    "Settheshapetosemi-transparentbycallingset_trans(5)"复制标准分词器(默认使用)分词结果: set,the,shape,to,semi,transparent,by,calling,set_trans,5 POST_analyze { "analyzer":"standard", "text":"LikeX国庆放假的" } { "tokens":[ { "token":"like", "start_offset":0, "end_offset":4, "type":"<ALPHANUM>", "position":0 }, { "token":"x", "start_offset":5, "en

  • Android RecyclerVIew列表使用 (编辑、单选、全选、删除、动画效果+附源码)

    前言眼下都2020年了,你不会还在使用ListView吧?正文因为最近写的一个项目里面有关于列表的编辑相关的功能,其实也是类似与腾讯视频的观看历史的列表操作,你可以先尝试一下,写这个主要是业务逻辑要清晰,否则你很容易就会陷进去,走死胡同的。效果图如下: 源码如下: RecyclerViewUseDemo迫不及待想要自己运行在AS中的小伙伴可以直接下载或者克隆,打开即可,想了解具体开发流程和详细的业务逻辑的小伙伴,可以继续往下看,本章很长,请在流量和时间充足的前提下观看,如有问题,评论即可,我会尽快解决,多说无益,开搞~开发①新建项目 这一步没有什么好说的,但是你也要注意自己的AndroidStudio和Gradle的版本,我的是3.5.2。点击项目创建②配置build.gradle第一步 在工程级别的build.gradle文件中的allprojects{}闭包中添加maven库 maven{url"https://jitpack.io"}复制 第二步 在项目级别的build.gradle文件中的android{}闭包中,配置JDK的版本 compileOption

  • 对象存储,为什么那么火?

    上期文章,小枣君给大家详细介绍了数据存储技术的基本知识,其中重点对DAS、SAN和NAS技术进行了对比分析。我们知道,在很长的一段时间里,这三种架构几乎统治了数据存储市场。所有行业用户的数据存储需求,都是在这三者中进行选择。然而,随着时代的发展,一种新的数据存储形态诞生,开始挑战前面三者的垄断地位。没错,它就是云计算时代存储技术的新网红——对象存储。哈哈,也许搞着搞着,对象就有了呢!对象存储,也称为“面向对象的存储”,英文是Object-basedStorage。现在很多云厂商,也直接称之为“云存储”。不同的云厂商对它有不同的英文缩写命名。例如阿里云把自家的对象存储服务叫做OSS,华为云叫OBS,腾讯云叫COS,七牛叫Kodo,百度叫BOS,网易叫NOS……五花八门,反正都是一个技术。之前小枣君介绍过,DAS和SAN是基于物理块的存储方式,而NAS是基于文件的存储方式。在DAS和SAN中,存储资源就像一块一块的硬盘,直接挂载在主机上,我们称之为块存储。而在NAS中,呈现出来的是一个基于文件系统的目录架构,有目录、子目录、孙目录、文件,我们称之为文件存储。文件存储的最大特点,就是所有存储

  • python 发送和接收ActiveMQ

    ActiveMQ是java开发的消息中间件服务。可以支持多种协议(AMQP,MQTT,OpenWire,Stomp),默认的是OpenWire。而python与ActiveMQ的通信使用的是Stomp协议。而如果你的服务没有开启则需要配置开启。首先需要安装python的stomp库。命令如下:pipinstallstomp.py复制接着,就是上代码了具体如下:#-*-coding:utf-8-*- importstomp importtime queue_name='/queue/SampleQueue' topic_name='/topic/SampleTopic' listener_name='SampleListener' classSampleListener(object): defon_message(self,headers,message): print'headers:%s'%headers print'message:%s'%message #推送到队列que

  • Enrichment Map User guide用户指南

    EnrichmentMapUserguide译者:Y大宽http://www.baderlab.org/Software/EnrichmentMap/UserManual#rnk总概CM可以使GSEA结果以网络化的形式可视化呈现。可以是GSEA的结果,当然也可以是DAVID,BINGO等其他的富集结果。Nodes代表基因集,edge代表每个set间的重叠。这种方式呈现的话,高度冗余的基因集会被划为一组叫clusters,这样就大大增强了导航和解释富集结果的准确性。基因富集是一种数据分析技术,需要有一下2个输入。1.一个从基因组实验来的排列的基因列表2.基因集,依据先验知识来的已经归类的功能基因集(如GO)或实验数据(如共表达模型)。有了以上的输入,那么会输出一个基因集富集列表。也就是能更好的概况基因列表的基因集。通常gene-setenrichment指的的功能富集,因为指定的功能基因集(如GO)是基于功能范畴的。如下图。1.png快速使用手册生成EM(以下EnrichmentMap简称为EM)有几种选择:加载GSEA结果加载Generic结果加载David结果加载Bingo结果以上几

  • GDB高级技巧

    GDB高级技巧 yijian2009-2-22 难得有雅兴,边动手边记录操作步骤,本文主要示例一些平常较少使用到的GDB功能,掌握这些用法有助于提高GDB调试和解决问题的能力。 1)查看宏 默认情况下,在GDB中是不能查看宏的值及定义的,但通过如下方法,则可以达到目的: 编译源代码时,加上“-g3-gdwarf-2”选项,请注意不是“-g”,必须为“-g3”,查看宏的值使用命令p,这和查看变量的值的方法相同,如果想查看宏的定义,使用“macroexpand”命令即可 2)如果执行一连串命令? 这个借助命令“source”即可,“source”的参数为一个存有一串命令的文件名 3)如何同时给多个函数打断点? 使用“rb”命令,如果执行“rb”时不带参数,则表示在所有函数处打一个断点,“rb”后面可以接一个符合正则表达式的参数,用来对符合正则表达式的所有函数打断点 4).gdbinit文件 GDB在启动时,会在用户主目录中寻找这个文件,并执行该文件中所有命令,文件格式为: definecommand-alias command end 如要给“bmain”取一个别名“bm”: defin

  • JQuery中DOM操作示例代码

    Jquery的DOM操作1、插入节点代码示例:<ptitle=”选择你喜欢的水果”>你最喜欢的水果是?</p><ul><lititle=”苹果”>苹果</li><lititle=”橘子”>橘子</li><lititle=”菠萝”>菠萝</li></ul><scriptlanguage=”javascript”>var$li_1=$(“<lititle=’香蕉’>香蕉</li>”);var$li_2=$(“<lititle=’雪梨’>雪梨</li>”);$(“ul”).append($li_1).append($li_2);//插入节点$(“p”).append(“<b>这里的追加的内容。</b>”);$(“<b>这是要增加的内容</b>”).appendTo(“p”);$(“p”).prepend(“<b>在前面添加内容</b>”);$(

  • 小程序“自定义关键词”功能的常见问答

      我们知道小程序可以通过线下扫码、公众号、好友分享、长按小程序码、搜索小程序名称来找到,现在又多了一个新方式——小程序后台新增自定义关键词功能:已发布小程序的开发者,可提交最多10个与小程序业务相关的关键词,帮助你的小程序更好地被发现。 (登陆小程序后台——点击左侧“推广”添加关键词)自定义关键词搜索策略将于6月9日生效。届时,用户可以通过搜索关键词,找到相关的小程序。小程序的关键词每个月可以修改三次。开发者还可在后台看到关键词推广效果。我们希望通过“自定义关键词”功能,帮助用户在微信内更便捷地找到所需小程序,开发者的小程序可以更准确地触达用户。几个小程序“自定义关键词”功能的常见问答Q:谁可以使用小程序的“自定义关键词”功能?该如何操作?A:已有过正式发布版本的小程序可以使用这一功能,门店小程序暂不支持。登陆小程序后台后,进入左侧“推广”一栏就可按指引进行操作,关键词提交审核通过后,即可作为小程序的自定义关键词。Q:小程序的自定义关键词有什么用?A:关键词通过审核后,小程序将更大可能通过该关键词被用户搜索到。比如搜索“吃饭”,就能出来美食相关的小程序,小程序的名称中不一定需要带有“

  • RPM卸载 (Linux 使用)[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。 可以先用rpm-q‘xxx’或者rpm-qf‘xxx/bin/xxxx.xx’来查询一下所属的rpm包的名字。然后用rpm-e‘xxxxxx’来删之。‘xxx/bin/xxxx.xx’是一个包中任意的文件 ‘xxxxxx’是查询得到的rpm包的名称rpm-e的时候后面的文件名不用加版本号详细说明:安全地卸载 RPM卸载软件包,并不是简单地将原来安装的文件逐个删除,那样做的话,可能会出现这样或那样的问题。如,A软件包依靠B软件包做某些工作,若B软件包卸载了,则A软件包就不能正常运行了。RPM为用户安全考虑,会做某些检查,尽可能排除出错的情况。 RPM在卸载软件包时,分步骤进行如下操作: 1.检查依赖(Denpendency) 检查依赖的目的,在于确保当前没有任何软件包依赖于当前要卸载的软件包。 2.执行卸载前触发脚本程序(Triggerun) 3.执行卸载前脚本程序(Preuninstall) 本程序为软件包制作者设定,完成卸载前的一些工作,具体如,要卸载的软件包中某个 程序当前正在运行时,脚本程序必须杀掉它,否则无法正确卸载。 4.检查配置文件

  • 腾讯云API网关查询服务详情api接口

    1.接口描述接口请求域名:apigateway.tencentcloudapi.com。 本接口(DescribeService)用于查询一个服务的详细信息、包括服务的描述、域名、协议、创建时间、发布情况等信息。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeService。 Version 是 String 公共参数,本接口取值:2018-08-08。 Region 是 String 公共参数,详见产品支持的地域列表。 ServiceId 是 String 待查询的服务唯一ID。 3.输出参数 参数名称 类型 描述 ServiceId String 服务唯一ID。 AvailableEnvir

  • oracle忘记密码,修改密码

    1:输入命令:sqlplus/nolog,进入oracle控制台,并输入conn/assysdba;以DBA角色进入。2:若修改某一个用户密码,修改用户口令格式为:alteruser用户名identifiedby新密码;以test为例,密码修改为123456.可输入alterusertestidentifiedby123456;

  • Group容器的使用与点击事件-javafx

    Group容器的使用与点击事件 讲解group容器,添加和移除子组件的方式,子组件设置位置等 创建普通的三个button,如果不设置布局位置默认在位置上显示最后一个 @Override publicvoidstart(StageprimaryStage)throwsException{ Buttonb1=newButton("b1"); Buttonb2=newButton("b2"); Buttonb3=newButton("b3"); b1.setLayoutX(0); b2.setLayoutX(200); b3.setLayoutX(400); Groupgroup=newGroup(); group.getChildren().addAll(b1,b2,b3); Scenescene=newScene(group); primaryStage.setScene(scene); primaryStage.setTitle("test"); primaryStage.setWidth(600); primaryStage.setHeight(500); primaryStage.

  • mongodb4.4递增操作和递减操作$inc

     "$inc"  运算符可以用来修改已存在的键值或者在该键不存在时创建它。 1.假设我们创建了一个关于游戏的集合,将游戏和变化的分数都存储在了里面。当用户玩弹球游戏时,我们可以插入一个包含游戏名称和玩家的文档来标识不同的游戏: db.games.insertOne({"game":"pinball","user":"joe"})复制 当小球撞到砖块时,就会给玩家加分。分数可以随便给,这里约定玩家得分的基数为50。可以使用  "$inc" 修饰符给玩家加50分(score键原先并不存在,创建了这个键,并将值设置成了:50) db.games.updateOne({"game":"pinball","user":"joe"},{"$inc":{"score":50}})复制 如果小球落入了加分区,要加10000分。可以给 "$inc" 传递一个不同的值: db.games.updateOne({"game":"pinball","user":"joe"},{"$inc":{"score":1000

  • CUDA学习3 Max pooling (python c++ cuda)

    1.Python 在CNN4参数优化中有一个CNN模型,其中的限速步是maxpooling。 如下所示,Python中运行一个50*100*24*24的maxpooling需要3秒。 importnumpyasnp importtime defsimple_pool(input,ds=(2,2)): n,m,h,w=input.shape d,s=ds zh=h/d+h%d zw=w/s+w%s z=np.zeros((n,m,zh,zw)) forkinrange(n): foroinrange(m): foriinrange(zh): forjinrange(zw): maxd=-10000 foruinrange(min(d,h-d*i)): forvinrange(min(d,w-d*j)): ifinput[k,o,d*i+u,d*j+v]>maxd: maxd=input[k,o,d*i+u,d*j+v] z[k,o,i,j]=maxd returnz N,M,H,W=[50,100,24,24] a=np.reshape(range(N*M*H*W),(N,

  • 非常可乐

    Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N毫升和M毫升可乐的体积为S(S<101)毫升 (正好装满一瓶),它们三个之间可以相互倒可乐(都是没有刻度的,且S==N+M,101>S>0,N>0,M>0)。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。 Input 三个整数:S可乐的体积,N和M是两个杯子的容量,以"000"结束。 Output 如果能平分的话请输出最少要倒的次数,否则输出"NO"。 SampleInput 743 413 000复制 SampleOutput NO 3复制 复制 这种写法是利用了数论的写法。写法比较简单。1#include<cstring> 2#include<cstdio> 3#include<iostream> 4#in

  • 秋季面试准备(1)——atoi的实现以及C++库函数stringstream

      记得去年9月28日赶到交大去听july的算法面试讲座,他给我们出的第一个题目就是用代码实现atoi,限时10mins。由于当时很久没接触编程,当堂没写出来。记得当时讲解的时候就是要我们特别注意边界条件。写程序就像砌围墙,得先把边界条件弄好。转眼一年过去了,再过几个月就要出去huntingjob了,现在回顾下atoi这个函数。    1//判断字符是否是空格等特殊转义字符,这些输入没有显式输入 2isspace(intx) 3{ 4if(x==''||x=='/t'||x=='/n'||x=='/f'||x=='/b'||x=='/r') 5return1; 6else 7return0; 8} 9//判断是否是数字,过滤掉其他字符如字母,@等符号 10isdigit(intx) 11{ 12if(x<='9'&&x>='0') 13return1; 14else 15return0; 16 17} 18 19//atoi的实现 20intatoi(constchar*nptr) 21{ 22intc;/*currentchar*/ 23inttotal

  • Golang 获取当前系统架构和操作系统

    packagemain import( "fmt" "runtime" ) funcmain(){ fmt.Println(runtime.GOOS) fmt.Println(runtime.GOARCH) }复制 结果: #gorungo-cpu.go linux amd64复制  

相关推荐

推荐阅读