微服务(二)之有HTTP协议,为何还需要在RPC中使用自定义的协议?

817 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

📢 导读: 本期是关于自定义通讯协议的讲解,和HTTP协议做对比,由浅入深,带读者遨游通讯协议的整个发展过程,以及帮助读者更深入的去了解RPC中的通讯协议。 如果期待更多干货和知识分享和后续与微服务相关的文章,那就动动小指头点波关注吧!

⛳️ 1.首先说一下HTTP和RPC的区别

  • HTTP只是一个通信协议,工作在OSI的第七层,不是一个完整的远程调用方案。
  • 其实rpc不是一种协议,rpc是一种调用过程的方案/范式/实现。RPC是一个完整的远程调用方案,它包括了:接口规范+序列化反序列化规范+通信协议等。

⛳️ 2.HTTP协议和RPC调用过程的发展史,这个很重要

  • RPC在1984年就被人用来做分布式系统的通信,Java在1.1版本提供了Java版本的RPC框架(RMI),而HTTP协议在1990年才开始作为主流协议出现,而且HTTP发明的场景是用于web架构,而不是分布式系统间通信,这导致了在很长一段时间内,HTTP都是浏览器程序和后端web系统通信用的东西,上面的文档格式都是HTML(非常啰嗦),没有人会把HTTP作为分布式系统通信的协议。在很长一段时间内,RPC才是正统。
  • 随着前端技术的发展,AJAX技术和JSON文档在前端界逐渐成为主流,HTTP调用才摆脱HTML,开始使用JSON这一相对简洁的文档格式,为后面用于系统间调用定下基础。最后随着RESTFUL思潮的兴起,越来越多系统考虑用HTTP来提供服务,但这时候,RPC已经是各种大型分布式调用的标配了。
  • 现在大部分的系统都是给浏览器使用的,因此HTTP协议必不可少,而这大部分系统中的绝大部分,对于后端系统间调用的性能都是要求不高的,毕竟走的都是内网,它们关心的是前端和后端的性能,因此后端系统间调用如果能够采用和前端一样的技术栈,那无疑是维护成本最低的,而这时HTTP的技术生态也刚好满足这个条件,所以就星星之火可以燎原了,当然也不可一概而论,具体用什么协议,我们具体情况还需要具体分析。

⛳️ 3.再说一下HTTP的REST风格调用

HTTP的REST风格的调用: REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。 在微服务的设计中,一个服务A如果访问另一个服务B,可以采用HTTP REST传输数据,并在两个服务之间进行序列化和反序列化操作,服务B把执行结果返回过来。我们的前后端分离开发也是一种REST风格的调用,如下图: 在这里插入图片描述在这里插入图片描述


⛳️ 4.再说一下RPC

为什么有RPC呢? 方法的调用无法在同一个计算机的进程内,因为目前分布式微服务架构的流行,目前由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,此时就需要不同的系统间的通讯,甚至不同的组织间的通讯,这个时候RPC就应运而生了。

RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API。

RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,其调用协议通常包含传输协议序列化协议

  • 传输协议包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 协议,也有如dubbo一类的自定义报文的tcp协议。
  • 序列化协议包含: 如基于文本编码的 xml json,也有二进制编码的 protobuf hessian等

出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用).它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想,如下图:

在这里插入图片描述


⛳️ 5.有http,为何还需要使用RPC在应用层自己定义协议

5.1简化传输的字节

有http,为何还需要在应用层自己定义协议,因为通用定义的http1.1协议的tcp报文包含太多废信息,如是一个get的请求头和响应头信息: 在这里插入图片描述

可以看到请求头里面包含的信息实在是太多了,如果我们只需要传输Hello,Yushiwen 这么几个字符,那么可以看到http请求头里面携带的信息就占用了整个请求信息的百分之80以上,如果我们用PRC,就可以自定义传输协议,简化需要传输的字节。

最后说一下HTTP2也有了很大改进,具体是自定义协议还是用HTTP协议,我们需要在具体的场景下具体分析。

5.2封装了更多的服务特性

RPC框架封装了很多服务特性,比如封装了“服务发现”,"负载均衡",“熔断降级”等面向服务的高级特性。


⛳️ 6.什么情况下自定义传输协议,什么情况下使用HTTP协议

具体得看业务场景,这里给出大致的思路:

  • Http协议适用于短连接、高延迟、大包通讯、通讯频率低,比如Web开发。
  • 自定义的协议可以使用于长连接、低延迟、小包通、讯频率高,比如我们玩的moba游戏王者荣耀。

微服务相关博文持续更新中......
author:YuShiwen