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. hicoder1142 三分求极值

    在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 我们代入公式,有: $d = min(\sqrt{(X - x)^2+(aX^2+bX+c-y)^2 ...

  2. Codeforces 850C Arpa and a game with Mojtaba

    题意:给定一个正整数序列,两人轮流对这个数列进行如下修改:选取一个素数p和一个整数k将序列中能整除p^k的数除以p^k,问谁有必胜策略. 借此复习一下sg函数吧,sg(x) = mex ( sg(y) ...

  3. Codeforces Gym 101521A Shuttle Bus

    题意:给定一个2*N的方格,从左上角开始走,有些格子不能走,问能否一次遍历所有能走的方格 在Gym上看到一场香港的比赛,很好奇就去看了一下,发现第一题很有趣,并且很水,似乎讨论一下奇偶性就行了,然后. ...

  4. ubuntu16.04 Qt5.8 如何使用opecv3.2

    关于opencv3.2的编译有一大堆教程.可自寻查看.在Qt中使用opencv需要在pro文件中添加 相应的头文件和 动态链接库.如下 INCLUDEPATH += . INCLUDEPATH += ...

  5. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  6. iOS 力学动画生成器UIKit Dynamics 之碰撞效果解说

    UIKit Dynamic是iOS7 新增的一组类和方法.可赋予UIView逼真的行为和特征,不须要写动画效果那些繁琐的代码,让开发者可以轻松地改善应用的用户体验.一共同拥有6个可用于定制UIDyna ...

  7. java多线程编程核心技术——第七章补漏拾遗

    本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...

  8. 为什么说要搞定微服务架构,先搞定RPC框架?

    今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一.需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队 ...

  9. 自学Python3.2-函数分类

    函数的分类 内置函数,自定义函数,匿名函数 一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html ...

  10. centos6.5 yum update 报错Couldn't resolve host 'centos.ustc.edu.cn'

    异常信息 [root@localhost ~]# yum -y update Loaded plugins: fastestmirror, refresh-packagekit, security S ...