gRPC 是什么

gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信。底层通信采用的是 HTTP2 协议。gRPC在设计上使用了 ProtoBuf 这种接口描述语言。这种IDL语言可以定义各种服务,google还提供了一种工具 protoc 来编译这种IDL语言,生成各种各样的语言来操作服务。

gPRC特点

  • 定义服务简单,可以很快的搭建出一个RPC调度的服务
  • gRPC是与语言无关,平台无关的。你定义好了一个protobuf协议,就可以用protoc生成不同语言的协议框架
  • 使用HTTP2协议,支持双向流。客户端和服务端可以双向通信

gRPC为了解决什么问题

gRPC其实就是一种RPC,解决服务的远程过程调用问题。
它使得我们远程调用就像调用本地函数一样,程序员无需关心交互的细节。

RPC与RESTful区别是什么

  • 在客户端和服务端通信还有一种基于http协议的 RESTful 架构模式,RESTful一般是对于资源的操作,它是名词(资源地址),然后添加一些动作对这些资源进行操作。
    而RPC是基于函数,它是动词。

  • RPC一般基于TCP协议,当然gRPC是基于HTTP2,但它也是比HTTP协议更加有效率和更多特性。
    RESTful一般都是基于HTTP协议

  • 传输方面:自定义的TCP协议或者使用HTTP2协议,报文体积更小,所以传输效率更高
                    RESTful一般基于http协议,报文体积大

  • gRPC用的是protobuf的IDL语言,会编码为二进制协议的数据,而RESTful一般是用json的数据格式,所以json格式的编解码更耗时

为什么还是有很多公司用RESTful

以函数为基础的模式(RPC),如果服务端添加了一个函数,那么客户端也必须添加一个函数。
而以资源为操作基础的RESTful,URI对应的服务变化了,客户端一般是不需要关心和更新的,它对客户端是透明的。
所以RPC的操作变更,有时比RESTful的复杂,因为RCP需要2边都要添加代码,也就增加了工作量。

并且json格式是可阅读的格式,gRPC编码后是二进制格式,对人不友好,不利于阅读.
调试排错RPC也比RESTful难,毕竟HTTP大家都很熟悉,而RPC协议一般是自定义协议,需要程序员自己去研究。

那怎么选择呢?RPC OR RESTful

一般公司内部服务并发大,效率要求比较高的,可以用RPC。所以一般大公司内部用RPC比较多。不过大公司对外提供的api很多都是基于http的RESTful,为什么?因为这个简单、易懂,大家都熟悉,使用就方便。

而业务量比较小,并发小,可以直接用RESTful,json,不管是公司内部服务间通信,还是对外提供api服务。

所以选择:都是根据自己公司业务需求来判断,适合使用哪种,就选择哪种,不要盲目跟风,造成公司不必要的资源浪费。

golang中使用RESTful,用json传输数据,一般使用 https://github.com/gorilla/mux , https://github.com/gin-gonic/gin, https://github.com/labstack/echo,https://github.com/emicklei/go-restful
golang中的RPC现在一般使用g家的gRPC, https://grpc.io/, 毕竟大家都相信g家的技术实力 - -!

Protocol Buffers

这是google开源的并且非常成熟的用于数据结构序列化的框架。
使用protocol来序列化数据,需要编写一个proto文件,在proto文件中定义你的服务,rpc操作,返回和请求数据格式。
protocol buffers的数据是一个结构化的消息,每个消息都是一小的逻辑信息的记录,消息中包含了一系列的键值对,称之为属性,一个简单的例子:

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

定义了你传输的数据结构,就可以用protoc来生成对应语言的代码。这些代码提供了方法,可以操作每个属性,可以将数据序列化为元数据传输给对方,也可以将对方发送过来的元数据进行解析。
例子:

// 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 Buffer 官方文档: https://developers.google.com/protocol-buffers/docs/overview
从这里也可以获取 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 SayHello(stream HelloRequest) returns (HelloResponse) ;

Golang gRPC微服务01: 介绍的更多相关文章

  1. Golang gRPC微服务02: helloworld

    安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...

  2. 微服务架构介绍和RPC框架对比

    微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...

  3. 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比

    远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...

  4. jhipser微服务架构介绍

    内容提要 本文涉及以下内容: 微服务架构介绍 spring cloud介绍 jhipster架构介绍 微服务架构介绍 微服务概念 微服务和SOA很相似,都是按照业务功能把系统拆分成一个一个的服务.比如 ...

  5. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景

    笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景     简介:讲解网关的作用和使用场景 (画图)          1)什么是网关         API Gateway,是系 ...

  6. Grpc微服务从零入门

    快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...

  7. 经济学人使用Golang构建微服务历程回顾

    关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...

  8. Spring Cloud微服务框架介绍

    Spring Cloud为开发人员提供了一整套的快速构建分布式应用的工具,入服务注册.服务发现.熔断.负载均衡.路由等,提供了开箱即用的各种依赖以及良好的可扩展机制. 目前在Spring Cloud的 ...

  9. .net core 微服务项目-介绍篇

    项目介绍 1.各种方式连接API都会连接到 APIGateway 来进行统一的分发 Ocelot 2.当api需要授权时 需要请求授权服务 IdentityServer4 3.授权服务对请求进行调用u ...

随机推荐

  1. JAVA遇见HTML——JSP篇(案例项目)

  2. Error creating bean with name 'xxxx' defined in URL

    遇到这种情况,要检查一下以下配置: 1) service接口实现类上有没有加@Service注解,注解是不是引用的spring的类?不要导错包 2) 接口有没有写实现类,实现类是实现的对应接口么?比如 ...

  3. Java反射的使用

    反射的概述 1.Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 2.对于任意一个对象,都能调用它的任意一个方法和属性. 3.通过动态获取的信息以及动态调用对象的方法 ...

  4. springboot整合easyexcel实现Excel导入导出

    easyexcel:快速.简单避免OOM的java处理Excel工具 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套 ...

  5. BZOJ 2631 tree / Luogu P1501 [国家集训队]Tree II (LCT,多重标记)

    题意 一棵树,有删边加边,有一条链加/乘一个数,有询问一条链的和 分析 LCT,像线段树一样维护两个标记(再加上翻转标记就是三个),维护size,就行了 CODE #include<bits/s ...

  6. Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian

    链接: https://codeforces.com/contest/1220/problem/D 题意: Boy Dima gave Julian a birthday present - set ...

  7. Java数据库小项目02--管家婆项目

    目录 项目要求 开发环境搭建 工具类JDBCUtils 创建管家婆数据表 项目分层 MainApp层 MainView层 ZhangWuController层 ZhangWuService层 Zhan ...

  8. Microsoft.Practices.Unity使用配置文件总是报错The type name or alias could not be resolved.

    Type name could not be resolved. Please check config file http://stackoverflow.com/questions/1493564 ...

  9. [Hihocoder] 字符串排序

    题目 http://hihocoder.com/problemset/problem/1712 题解 https://www.zybuluo.com/wsndy-xx/note/1135606

  10. x86—EFLAGS寄存器详解[转]

    鉴于EFLAGS寄存器的重要性,所以将这一部分内容从处理器体系结构及寻址模式一文中单独抽出另成一文,这部分内容主要来自Intel Developer Mannual,在后续的内核系列中遇到的许多和EF ...