一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。

在国外的一些公司,包括网飞、谷歌、 Square 和其他公司已经采用了gRPC,国内的字节跳动、美团、阿里巴巴在许多业务线上也采取了gRPC的通信方式。这篇文章是入门级别的文章,带大家初探gRPC。

什么是REST API

REST 是一种设计基于 web 的 api 的架构风格,它成为 REST api。当 Client 和 Server 使用 restapi 进行通信时,它们将拥有一个预定义的端点和有效负载契约。REST API 使用所有的 HTTP 方法,比如 GET、 PATCH、 PUT、 POST、 DELETE。

什么是RPC?

RPC (remote procedure call 是一种请求-响应协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。

RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。

什么是gRPC

gRPC is a modern, open source remote procedure call (RPC) framework that can run anywhere. It enables client and server applications to communicate transparently, and makes it easier to build connected systems. - From gRPC docs.

引用出自gRPC文档,大致的意思是gRPC是一个现代的开源远程过程调用(RPC)框架,可以在任何地方运行。它使客户机和服务器应用程序能够透明地通信,并使构建连接的系统更加容易。

这个框架是由 Google 开发的。与其他 RPC 系统一样,gRPC 还定义了一个接口,定义了客户机可以访问的所有方法。默认情况下,gRPC 使用协议缓冲作为接口定义语言和数据交换格式。它还支持其他数据交换格式,比如 JSON。

gRPC 中的 IDL 在扩展名为的文件中定义。保罗。我们可以在这些文件中定义一个版本,并以可选的不同语言维护相同 api 的不同版本。

由 gRPC 支持的不同类型的 RPC,包括:

  • Unary-从客户机发送单个请求,从服务器发送回单个响应。
  • Server Streaming-从客户机发送一个请求,然后从服务器发送回一系列消息。
  • Client Streaming -从客户端向服务器发送一系列消息,服务器用一条消息作出回应。
  • Bidirectional streaming -客户端和服务器相互发送消息流的地方。

它是否比REST更好?

像 REST API 这样的通信在使用一元操作的 gRPC 中是可能的,但是当涉及到流时,gRPC 允许全双工流,并使用静态路径进行通信,这消除了路径解析和查询参数增加的延迟。因此,它的性能优于 REST API。

服务端实现

在这个例子中,我们使用java gRPC 实现一对一(Unary)通信。

首先使用 Maven 创建一个简单的 Java 应用程序,在 maven 中添加以下依赖项。

<dependencies> <!-- https://mvnrepository.com/artifact/io.grpc/grpc-netty-shaded -->    <dependency>        <groupId>io.grpc</groupId>        <artifactId>grpc-netty-shaded</artifactId>        <version>1.45.0</version>    </dependency>    <!-- https://mvnrepository.com/artifact/io.grpc/grpc-protobuf -->    <dependency>        <groupId>io.grpc</groupId>        <artifactId>grpc-protobuf</artifactId>        <version>1.45.0</version>    </dependency>    <!-- https://mvnrepository.com/artifact/io.grpc/grpc-stub -->    <dependency>        <groupId>io.grpc</groupId>        <artifactId>grpc-stub</artifactId>        <version>1.45.0</version>    </dependency>    <dependency> <!-- necessary for Java 9+ -->          <groupId>org.apache.tomcat</groupId>        <artifactId>annotations-api</artifactId>        <version>6.0.53</version>        <scope>provided</scope>    </dependency>    <!-- This is needed to override a managed guava dependency-->    <dependency>        <groupId>com.google.guava</groupId>        <artifactId>guava</artifactId>        <version>21.0</version>    </dependency> </dependencies>

我们还需要添加相关的插件到我们的 maven 文件。

在配置完成相关依赖后,然后在.prot 文件中定义服务器接口proto协议。

syntax = "proto3"; option java_multiple_files = true; option java_package = "com.code_examples.grpc.v1"; service HelloWorldService { rpc ExecuteOrder(HelloRequest) returns (HelloResponse) {}; } message HelloRequest { string greetings = 1; } message HelloResponse { string info = 1; }

接下来使用 mvn clean install 构建项目。此步骤将自动生成stubs和abstract files 。在使用 IDE 引用我们创建的类时,一定要确保将它们添加到类路径中。

然后创建一个 Service 类并重写基类的 executeOrder ()方法。

@Override public void executeOrder(com.code_examples.grpc.v1.HelloRequest request,io.grpc.stub.StreamObserver<com.code_examples.grpc.v1.HelloResponse> responseObserver) {    HelloResponse response = HelloResponse.newBuilder().setInfo(request.getGreetings()).build();responseObserver.onNext(response);    responseObserver.onCompleted(); }

在这个service中,我们从请求中读取信息,并将其作为响应发送回客户机。

最后,我们创建建一个类来启动服务器。

public static void main(String[] args) throws IOException, InterruptedException {    Server server = ServerBuilder.forPort(8085).addService(new HelloWorldServiceImpl()).build();    server.start();    server.awaitTermination(); }

在main方法中,我们调用上面实现的service,并在端口8085上启动服务器。

最后我们运行main方法,完成启动服务器。

客户端实现

创建一个客户端类,并向服务器发送消息。

ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost",8085).usePlaintext().build(); HelloWorldServiceBlockingStub orderServiceBlockingStub = HelloWorldServiceGrpc.newBlockingStub(managedChannel); HelloRequest helloReq = HelloRequest.newBuilder().setGreetings("Hey Foo").build(); HelloResponse helloResponse = orderServiceBlockingStub.executeOrder(helloReq); System.out.println("Received response: " + helloResponse.getInfo()); managedChannel.shutdown();

运行客户端类并验证检查输出。以下为来自服务器的响应。

什么是 gRPC? 它比 REST API 好吗?相关推荐

  1. Grpc+Grpc Gateway实践二 有些复杂的Hello World

    Hello World 在上一节中我们已经完成了对环境的基本配置 这节将开始编写一个复杂的Hello World,涉及到许多的知识,建议大家认真思考其中的概念 需求 由于本实践偏向Grpc+Grpc ...

  2. .NET Core 下使用 gRPC

    gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. https://grpc.io/docs/guides/ https://github.com/grpc/grpc-dotnet h ...

  3. 一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

    今天给大家翻译一篇由ASP.NET首席开发工程师James Newton-King前几天发表的一篇博客,文中带来了一个实验性的产品gRPC-Web.大家可以点击文末的讨论帖进行相关反馈.我会在文章末尾 ...

  4. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  5. envoy api 网关_在边缘,作为网关或在网格中构建控制平面以管理Envoy代理的指南...

    envoy api 网关 最近, Envoy已成为流行的网络组件. 马特·克莱因( Matt Klein )在几年前写了一个博客,内容涉及Envoy的动态配置API,以及它如何成为Envoy的采用曲线 ...

  6. grpc istio_在皮质数据湖中使用grpc envoy和istio进行大规模数据摄取

    grpc istio Cortex Data Lake collects, transforms and integrates your enterprise's security data to e ...

  7. grpc协议_gRPC和协议缓冲区简介

    grpc协议 gRPC is a burgeoning piece of technology that allows you to build web services where you can ...

  8. 透过实例demo带你认识gRPC

    本文分享自华为云社区<gRPC介绍以及spring demo构架展示>,作者:gentle_zhou. gRPC,即google Remote Procedure Call Protoco ...

  9. gRPC应用demo--复杂proto文件编写

    Grpc 针对proto复杂对象转换传输DEMO,其中对象包含List.enum .Map.Map中包含List等复杂对象转换. proto 文件原文 syntax = "proto3&qu ...

最新文章

  1. Window对象中setInterval()和setTimeout()的区别
  2. Nginx搭建静态资源映射实现远程访问服务器上的图片资源
  3. 【CV】多目标跟踪:监控领域你必须要了解的算法
  4. VIVOtech:使用近场通信(NFC)技术的免接触付款解决方案的市场领导者
  5. 深入学习linux socket编程之select
  6. GetVersionEx 获取系统版本信息
  7. GlusterFS-Kubernetes云原生存储
  8. sqlplus登录问题
  9. 【Spring】Spring 中的bean 和我们java中的bean有什么区别以及spring 模拟实现
  10. Solr配置停止词注意
  11. arch linux 进入黑屏,无法从Arch Linux进入Beaglebone Black
  12. java sql update用法_使用if else条件将SQL UPDATE语句转换为php(codeigniter)
  13. 传输层学习之五(TCP的SACK,F-RTO)
  14. Nancy基于JwtBearer认证的使用与实现
  15. 201521123014《Java程序设计》第1周学习总结
  16. java之模块学习-接口回调机制详解
  17. 小程序长列表优化,解决数据过多白屏问题
  18. 【Webex】加入会议是无法正常加入!提示“下载会议组件时无法获取正确的参数。 请联系技术支持以获取帮助。...
  19. input密码框显示与隐藏
  20. 2011最犀利语录大全

热门文章

  1. 第四章 火灾报警与消防联动控制系统(下) - 安全防范技术原理设备与工程系统
  2. 使用Cheat Enginee(CE)找到“植物大战僵尸”阳光值的内存基址
  3. oracle怎么找出失效索引,Oracle数据库索引失效
  4. php网站源码安装教程
  5. SQL2012 management 打开提示无法创建窗口
  6. IOS – OpenGL ES 图像水晶球效果 GPUImageGlassSphereFilter
  7. 利用Hiero制作中文字库
  8. GDI+学习成果-金鱼宠物
  9. access查询成绩小于5分_计算机二级Access备考重点查询
  10. 使用wifiphisher进行钓鱼