grpc入门(一)

一.什么是grpc

  grpc是谷歌开源的一款高性能的rpc框架 (https://grpc.io),可以使用protocol buffers作为IDL(Interface Definition Language)文件,也可以作为底层的信息传输的格式(这也是本博文所介绍的方式)。

  以下内容属于笔者对 what is grpc? 的翻译,原文请见: https://grpc.io/docs/guides/index.html

  grpc的客户端应用可以像访问本地方法一样调用其他机器上的服务端应用的方法,使得我们可以非常简单的创建分布式应用与服务。和其他很多rpc框架一样,gprc也是创建一个服务接口,然后指定调用远程方法所需的参数和返回类型。在服务端,需要实现服务的接口,然后启动一个服务器来处理客户端的调用;在客户端,需要桩代码,提供与服务端相同的方法。

  grpc的客户端与服务端可以在不同的环境下相互调用,例如: 从谷歌内部的服务到我们的桌面应用,这些应用可以使用gprc所支持的不同的语言来实现。因此,你可以使用grpc轻松的创建一个java的服务端应用,使用go或者python或者ruby语言创建一个客户端应用。另外一方面,谷歌最近的所公布的一些接口使用了grpc,如此一来,你可以将谷歌的一些功能集成到你的应用中。

  grpc默认采用了protocol buffers, 这是google已经开源了的并且非常成熟的用于数据结构序列化的框架(也可以使用其他的数据格式例如json)。在这里快速的介绍他的用法,如果你对protocol buffers已经非常熟悉额了,你可以跳过这篇文章直接进入到下一个章节。

  首先,当使用protocol buffers来序列化数据,需要编写一个proto文件,文件中定义你想要序列化的结构数据,注意文件名必须以 .proto结尾。protocol buffers的数据是一个结构化的消息,每个消息都是一小的逻辑信息的记录,消息中包含了一系列的键值对,称之为属性,下面有一个简单的例子:

message Person {
string name = 1;
int32 age = 2;
bool has_ponycopter = 3;
}

  接着,当你已经制定了你的数据结构,你就可以使用protocol buffers编译命令protoc来生成你所擅长的语言对应的类。类中提供了简单的方法来操作每个属性(例如name()和set_name()), 另外这些方法内部可以将数据序列化为元数据传输给对方,也可以将对方发送过来的元数据进行解析。拿一个具体的例子来说,如果你使用的是c++,编译如上的例子后会生成一个叫做Person的类,你可以使用这个类来构建,序列化,并且得到 Person对应的protocol buffers消息。

  下面会给出一个更加详细的例子,你可以在一个普通的proto文件中定义grpc的服务,rpc的方法的参数和返回类型需要声明为一个protocol buffers的消息。

// The greeter service definition.
service Greeter {
//Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
} // The request message containing the user's name.
message HelloRequest {
string name = 1;
} //The response message containing the greetings
message HelloReply {
string message = 1;
}

  grpc可以使用带插件的protoc命令将你编写的proto文件生成代码。然而,使用grpc的插件的时候,你可以生成grpc的客户端和服务端代码,和一般的protocol buffers代码一样,可以构建,序列化,获取消息。

你可以从 Protocol Buffers document 文档中获取更多关于protocol buffers的说明,也可以从中学到如何获得和安装你所擅长的编程语言的 protoc 插件。

二. grpc的四种定义方式

  grpc允许用户定义四种形式的rpc方法(原文参照:https://grpc.io/docs/guides/concepts.html):

  A.客户端发送请求到服务端,然后服务端给出一个响应,就像一个普通的方法定义一样,如下所示:

rpc SayHello(HelloRequest) returns (HelloResponse) {}

  B.服务端的流式rpc:客户端发送一个请求到服务端,然后得到一个流用于读取服务端的的消息,客户端从返回的流中读取所有的信息,如下所示:

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {}

  C.客户端流式rpc: 客户端使用流将信息发送个服务端,只要客户端发送完所有的信息给服务器,就开始等待服务端的响应,如下所示:

rpc LotsOfGreeting(stream HelloRequest) returns HttpResponse {}

  D.双向流式rpc:服务端与客户端都是用读写流发送数据给对方。这两个流式相互独立的,所以他们的读写可以是任意顺序的,例如:服务端在接受到客户的所有的信息之前就已经开始响应,也可以先读取数据然后再写数据,或者其他任何组合,如下所示:

rpc BidiHello(stream HelloRequest) returns HelloResponse {}

  

grpc介绍的更多相关文章

  1. go gRPC介绍, demo

    参考文章: 1. https://www.cnblogs.com/kaixinyufeng/p/9651513.html 2. http://jia-shun.cn/2018/08/12/gRPC/ ...

  2. .NET Core微服务之路:基于gRPC服务发现与服务治理的方案

    重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...

  3. .NET Core 微服务之grpc 初体验(干货)

    Grpc介绍 GitHub: https://github.com/grpc/grpc gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计 ...

  4. .Net Core 3.0 gRPC部署问题解决

    前言 .Net Core3.0终于如约而至的来了.在3.0中增加了许多东西.也有了许多的变化.今天我们看的就是在3.0中使用gRPC并遇到的问题.gRPC现在可以非常方便简洁的在.Net Core中使 ...

  5. 基于grpc的流式方式实现双向通讯(python)

    grpc介绍 grpc是谷歌开源的一套基于rpc实现的通讯框架(官网有更完整的定义).在搞懂grpc之前,首先要弄懂rpc是什么.下面是自己理解的rpc定义,若有不对,望指出: rpc官方称为 远程过 ...

  6. 关于GRPC的讲解

    gRPC服务发现&负载均衡 https://segmentfault.com/a/1190000008672912?utm_source=tag-newest GRPC编程指南 gRPC 介绍 ...

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

    摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...

  8. .NetCore|.Net6 gRPC服务开发及本地调试

    前言 最近在项目中实装应用了gRPC技术,本着能把技术描述出来给别人能看的懂的思想及作为自己学习笔记的心态编写了此文.因为在实际项目中是webApi接口和gRPC接口使用在同一项目服务中,所以本文的例 ...

  9. .NETCore微服务探寻(三) - 远程过程调用(RPC)

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

随机推荐

  1. HttpClient(一)HttpClient抓取网页基本信息

    一.HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包, 并且它支 ...

  2. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  3. 逐步搭建Lamp环境之rpm软件包管理

    Linux中的rpm软件包管理类似于windows下的"xxx软件管家"."xxx电脑管家",其作用主要用于查询软件的安装情况.安装软件.卸载软件. 以下针对这 ...

  4. Java 中 for each

    格式: for(type element: array) {       System.out.println(element); } //ex:{ public static void main(S ...

  5. URI和URL差别以及相对路径和绝对路径的差别

    一.URL和URI定义: 1.URL是全球资源定位符的英文所写,您平时上网时在IE浏览器中输入的那个地址就是URL.比方:网易 http://www.163.com就是一个URL. 2.URI是Web ...

  6. 使用storyboard设置button边框属性(颜色,宽度,圆角)

    通常使用Category时.仅仅能加入方法,不可加入属性.可是在使用Storyboard时我们可能会使用到keyPath,这里设置的key都须要是所设置视图的属性值.而且类型有所限制. 比如:我如今有 ...

  7. POJ 3928 &amp; hdu 2492 &amp; Uva1428 PingPong 【树状数组】

    Ping pong                                                   Time Limit: 2000/1000 MS (Java/Others)   ...

  8. 联通假4G欺骗消费者!

    之前预约了联通4G升级,官网说从4月18日開始到5月1月生效.4月18日到5月1日之间10010会联系预约用户更改套餐.24号收到联通业务员打来电话,明白告知:联通4G仅仅是套餐是4G的.网络还是3G ...

  9. Shiro学习(一)总体介绍

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...

  10. 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!

    eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本,提高项 ...