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. VisualStudio程序运行后控制台窗口一闪就没了

    这个虽然是千查万查出来的,但也不是原创的.希望对大家有所帮助. 方案一:网上最常见的解决方案是,在程序结尾的 return 0; 之前加 system("pause") 或 get ...

  2. Oracle之PLSQL

    PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)它是Ora ...

  3. Asp.net MVC 简单实现生成Excel并下载

    由于项目上的需求,需要导出指定条件的Excel文件.经过一翻折腾终于实现了. 现在把代码贴出来分享 (直接把我们项目里面的一部份辅助类的代码分享一下) 我们项目使用的是Asp.Net MVC4.0模式 ...

  4. class的二般用法

    一般来说,class就是给一堆元素添加样式的,但是还有二般的用法,就是用来作为一个开关,来切换他的子孙元素的样式.举个例子: <ul> <li><span>1< ...

  5. 自学Python1.1-简介

    1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 2.1  编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语 ...

  6. AJAX扩展-POST传递参数并跳转页面

    拓展的代码: 这段代码的原理是创建一个表单,所有args都创建一个隐藏的input,用post方法把这些参数传递过去 注意form表单一定要加载到页面中,即下面代码中标红的部分,不然参数是无法被传递的 ...

  7. git学习笔记5-撤销操作

    git撤销有四种情况,一是没有commit,想恢复所有文件:二是没有commit,想恢复全部文件:三是已经commit了,想恢复某个版本:四是本地已经提交了,想从远程库恢复. 1. 没有commit, ...

  8. 基于阿里云的MQTT远程控制

    好久没有写博客了,眼看自己的项目就要快做完了,先分享一下基于MQTT的远程控制,自己买了一个阿里的云端,然后在云端上安装了一个MQTT服务器,其实是一不小心买了两个,所以准备贡献出来一个供大家使用, ...

  9. php-基于面向对象的MySQL类

    class sqlHelper{ private $conn; private $host = 'localhost'; private $user = 'root'; private $pwd = ...

  10. scrapy框架第一章

    操作环境:python2.7+scrapy 安装比较简单,网上教程也超多,就不在此赘述. 示例网站:https://www.cnblogs.com/cate/python/ (爬去关于博客园所有pyt ...