grpc介绍
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介绍的更多相关文章
- go gRPC介绍, demo
参考文章: 1. https://www.cnblogs.com/kaixinyufeng/p/9651513.html 2. http://jia-shun.cn/2018/08/12/gRPC/ ...
- .NET Core微服务之路:基于gRPC服务发现与服务治理的方案
重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...
- .NET Core 微服务之grpc 初体验(干货)
Grpc介绍 GitHub: https://github.com/grpc/grpc gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计 ...
- .Net Core 3.0 gRPC部署问题解决
前言 .Net Core3.0终于如约而至的来了.在3.0中增加了许多东西.也有了许多的变化.今天我们看的就是在3.0中使用gRPC并遇到的问题.gRPC现在可以非常方便简洁的在.Net Core中使 ...
- 基于grpc的流式方式实现双向通讯(python)
grpc介绍 grpc是谷歌开源的一套基于rpc实现的通讯框架(官网有更完整的定义).在搞懂grpc之前,首先要弄懂rpc是什么.下面是自己理解的rpc定义,若有不对,望指出: rpc官方称为 远程过 ...
- 关于GRPC的讲解
gRPC服务发现&负载均衡 https://segmentfault.com/a/1190000008672912?utm_source=tag-newest GRPC编程指南 gRPC 介绍 ...
- 透过实例demo带你认识gRPC
摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...
- .NetCore|.Net6 gRPC服务开发及本地调试
前言 最近在项目中实装应用了gRPC技术,本着能把技术描述出来给别人能看的懂的思想及作为自己学习笔记的心态编写了此文.因为在实际项目中是webApi接口和gRPC接口使用在同一项目服务中,所以本文的例 ...
- .NETCore微服务探寻(三) - 远程过程调用(RPC)
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
随机推荐
- JavaSE&&JavaEE&&JavaME的区别【Java中常用的包结构】
一.javaEEJavaSEJavaME用的同一个jar包吗? javaEE JavaSE javaME 用的JDK是同一个,开发j2SE工程的话只要有JDK就可以了,开发J2EE工程和J2ME工程除 ...
- arguments,caller,callee之理解
arguments对象代表正在执行的函数和调用它的函数的参数,arguments是一个不是数组但类似 数组的对象,它具有同数组一样的访问性质及方式,可以由arguments[n]来访问对应单个参数的值 ...
- Android之使用MediaMetadataRetriever类获取媒体信息
一.昨天.介绍了使用MediaMetadataRetriever类来获取视频第一帧:http://blog.csdn.net/u012561176/article/details/47858099,今 ...
- 【CODEFORCES】 A. Dreamoon and Sums
A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...
- 【SqlServer系列】JSON数据
1 概述 本文将结合MSDN简要概述JSON数据. 2 具体内容 JSON 是一种流行的数据格式,用于在现代 Web 和移动应用程序中交换数据. JSON 还可用于在 Microsoft Az ...
- CentOS6.5安装MySQL5.6
CentOS6.5安装MySQL5.6,开放防火墙3306端口,允许其他主机使用root账户密码访问MySQL数据库 查看操作系统相关信息 ** 该查看方法只适用于CentOS6.5 (lsb_rel ...
- SDWebimage如何获取缓存大小以及清除缓存
sdwebimage如何获取缓存大小以及清除缓存 1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; ...
- 3D位置语音,引领吃鸡游戏体验升级
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 导语:在刚刚结束的首届腾讯用户开放日上,腾讯音视频实验室带着3D位置音效解决方案,向所有用户亮相,为用户提供360度立体空间的 ...
- IP地址简介
IP地址 IP地址,Internet Protocol Address,网络协议地址: IP地址与网络接口绑定,并不是指向一台主机,一个主机可能有多个IP地址,如果其连接多个网络,有多个网络接口: I ...
- iOS 实现后台 播放音乐声音 AVAudioPlayer 以及铃声设置(循环播放震动)
1.步骤一:在Info.plist中,添加"Required background modes"键,value为:App plays audio 或者: 步骤二: - (BOOL) ...