Golang gRPC微服务01: 介绍
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: 介绍的更多相关文章
- Golang gRPC微服务02: helloworld
安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...
- 微服务架构介绍和RPC框架对比
微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...
- 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比
远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...
- jhipser微服务架构介绍
内容提要 本文涉及以下内容: 微服务架构介绍 spring cloud介绍 jhipster架构介绍 微服务架构介绍 微服务概念 微服务和SOA很相似,都是按照业务功能把系统拆分成一个一个的服务.比如 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景 简介:讲解网关的作用和使用场景 (画图) 1)什么是网关 API Gateway,是系 ...
- Grpc微服务从零入门
快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...
- 经济学人使用Golang构建微服务历程回顾
关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...
- Spring Cloud微服务框架介绍
Spring Cloud为开发人员提供了一整套的快速构建分布式应用的工具,入服务注册.服务发现.熔断.负载均衡.路由等,提供了开箱即用的各种依赖以及良好的可扩展机制. 目前在Spring Cloud的 ...
- .net core 微服务项目-介绍篇
项目介绍 1.各种方式连接API都会连接到 APIGateway 来进行统一的分发 Ocelot 2.当api需要授权时 需要请求授权服务 IdentityServer4 3.授权服务对请求进行调用u ...
随机推荐
- JDBC下
存储过程名字前面一定要加一个sp,代表是存储过程 nofilter:没有过滤器,没有参数 )) BEGIN IF sp_name IS NULL OR sp_name='' THEN SELECT * ...
- Spring-简介-IOC理论推导
1.Spring 1.1.简介 Spring:春天----->给软件行业带来了春天! 2002,首次推出了Spring框架的雏形:interface21框架! Spring框架即以interfa ...
- python之global用法
如果需要在函数内部改变函数外部的变量,就可以通过在函数内部声明变量为global变量.这样当程序运行至global变量便会替换外部的同名变量. 例1: # -*- coding:utf-8 -*- n ...
- 数字签名 转载:http://www.youdzone.com/signature.html
What is a Digital Signature?An introduction to Digital Signatures, by David Youd Bob (Bob's public k ...
- Java的值传递和引用传递的说法
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java ...
- 2018ccpc吉林 E:THE TOWER——数形结合
题目 链接 给你一个圆锥(位于坐标原点,告诉你高h 和底面半径 r),和一个点(x,y,z)并告诉你这个点的速度, 让你求点和圆锥相撞的最小时间(保证一定相撞) 分析 易知,将直线的参数方程与圆锥曲面 ...
- 题解 [BZOJ4144] Petrol
题目描述 有一张 n 个点 m 条边的无向图,其中有 s 个点上有加油站.有 Q 次询问(a,b,c), 问能否开一辆油箱容积为 c 的车从 a 走到 b.(a,b均为加油站) 输入格式 第一 ...
- Codeforces Round #346 (Div. 2) C题
C. Tanya and Toys In Berland recently a new collection of toys went on sale. This collection consist ...
- 洛谷 P2184 贪婪大陆
题面 又是一类比较套路的题呢? 假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数. ...
- Python 爬取喜马拉雅音频
一.分析音频下载相关链接地址 1. 分析专辑音频列表页面 在 PC端用 Chrome 浏览器中打开 喜马拉雅 网站,打开 Chrome开发者工具,随意打开一个音频专辑页面,Chrome开发者工具中 ...