这篇文章将我所了解到的解决“服务调用”相关的技术演进历史简述一下,纯粹一篇科普文。
本文专注于演化过程中每一步的为什么(Why)和是什么(What)上面,尽量不在技术细节(How)上面做太多深入。
服务的三要素
一般而言,一个网络服务包括以下的三个要素:
需要说明在服务地址中:
这都属于 TCP/IP 协议栈的知识点,不在这里深入详述。这里还需要对涉及到服务相关的一些名词做解释:
基于 IP 地址的调用
最初的网络服务,通过原始的 IP 地址暴露给调用者。这种方式有以下的问题:
“尽量不使用过于底层的概念来提供服务”,是这个演化流程中的重要原则,好比在今天已经很少能够看到直接用汇编语言编写代码的场景了。
取而代之的,就是越来越多的抽象,本文中就展现了服务调用这一领域在这个过程中的演进流程。
在现在除非是测试阶段,否则已经不能直接以 IP 地址的形式将服务提供出去了。
域名系统
前面的 IP 地址是给主机做为路由器寻址的数字型标识,并不好记忆。
此时产生了域名系统,与单纯提供 IP 地址相比,域名系统由于使用有意义的域名来标识服务,所以更容易记忆。另外,还可以更改域名所对应的 IP 地址,这为变换机器提供了便利。
有了域名之后,调用方需要访问某个网络服务时,首先到域名地址服务中,根据 DNS 协议将域名解析为相应的 IP 地址,再根据返回的 IP 地址来访问服务。
从这里可以看到,由于多了一步到域名地址服务查询映射 IP 地址的流程,所以多了一步解析,为了减少这一步带来的影响,调用方会缓存解析之后的结果,在一段时间内不过期,这样就省去了这一步查询的代价。
协议的接收与解析
以上通过域名系统,已经解决了服务 IP 地址难以记忆的问题,下面来看协议格式解析方面的演进。
一般而言,一个网络协议包括两部分:
需要说明的是,包头一般为固定大小,或者有明确的边界(如 HTTP 协议中的 \r\n 结束符),否则无法知道包头何时结束。
无论是 HTTP 协议,又或者是自定义的二进制网络协议,大体都由这两部分组成。
由于很多时候不能一口气接收完毕客户端的协议数据,因此在接收协议数据时,一般采用状态机来做协议数据的接收:
接收完毕了网络数据,在协议解析方面却长期停滞不前。一个协议,有多个字段(field),而这些不同的字段有不同的类型,简单的 raw 类型(如整型、字符串)还好说,但是遇到复杂的类型如字典、数组等就比较麻烦。
当时常见的手段有以下几种:
自定义二进制格式最大的问题出现在协议联调与协商的时候,由于可视性比较弱,有可能这边少了一个字段那边多了一个字段,给联调流程带来麻烦。
上面的问题一直到 Google 的 Protocol Buffer(以下简称 PB)出现之后才得到很大的改善。
PB 出现之后,也有很多类似的技术出现,如 Thrift、MsgPack 等,不在这里阐述,将这一类技术都以 PB 来描述。
与前面的两种手段相比,PB 具有以下的优点:
有了 proto 文件之后,C\S 两端是通过这个文件来进行协议的沟通交流的,而不是具体的技术细节。
服务网关
有了前面的演化之后,写一个简单的单机服务器已经不难。然而,当随着访问量的增大,一台机器已经不足以支撑所有的请求,此时就需要横向扩展多加一些业务服务器。
而前面通过域名访问服务的架构就遇到了问题:如果有多个服务实例可以提供相同的服务,那么势必需要在 DNS 的域名解析中将域名与多个地址进行绑定。
这样的方案就有如下的问题:
为了解决这些问题,就引入了反向代理网关这一组件。它提供如下的功能:
有四层和七层负载均衡软件,其中四层负载均衡这里介绍 LVS,七层负载均衡介绍 Nginx。
上图是简易的 TCP/IP 协议栈层次图,其中 LVS 工作在四层,即请求来到 LVS 这里时是根据四层协议来决定请求最终走到哪个服务实例。
而 Nginx 工作在七层,主要用于 HTTP 协议,即根据 HTTP 协议本身来决定请求的走向。
需要说明的是,Nginx 也可以工作在四层,但是这么用的地方不是很多,可以参考 Nginx 的 Stream 模块。
做为四层负载均衡的 LVS
由于 LVS 有好几种工作模式,并不是每一种我都很清楚,以下表述仅针对 Full NAT 模式,下面的表述或者有误。
LVS 有如下的组成部分:
客户端进行请求时,流程如下:
做为七层负载均衡的 Nginx
在开始展开讨论之前,需要简单说一下正向代理和反向代理。
所谓的正向代理(proxy),我的理解就是在客户端处的代理。如浏览器中的可以配置的访问某些网站的代理,就属于正向代理,但是一般而言不会说正向代理而是代理,即默认代理都是正向的。
而反向代理(reverse proxy),就是挡在服务器端前面的代理,比如前面 LVS 中的 DS 服务器就属于一种反向代理。
为什么需要反向代理,大体的原因有以下的考量:
反向代理与所谓的 Gateway、网关等,我认为没有太多的差异,只是叫法不同而已,做的事情都是类似的。
Nginx 应该是现在用的最多的 HTTP 七层负载均衡软件,在 Nginx 中,可以通过在配置的 Server 块中定义一个域名,然后将该域名的请求绑定到对应的 Upstream 中,而实现转发请求到这些 Upstream 的效果。
如:
- upstream hello {
- server A:11001;
- server B:11001;
- }
- location / {
- root html;
- index index.html index.htm;
- proxy_pass http://hello;
- }
这是最简单的 Nginx 反向代理配置,实际线上一个接入层背后可能有多个域名,如果配置变动的很大,每次域名以及对应的 Upstream 的配置修改都需要人工干预,效率会很慢。
这时候就要提到一个叫 DevOps 的名词了,我的理解就是开发各种便于自动化运维工具的工程师。
有了上面的分析,此时一个提供七层 HTTP 访问接口的服务架构大体是这样的:
服务发现与 RPC
前面已经解决单机服务器对外提供服务的大部分问题,来简单回顾:
然而一个服务,通常并不见得只由本身提供服务就可以,服务过程中可能还涉及到查询其他服务的流程,常见的如数据类服务如 MySQL、Redis 等。
这一类供服务内调用查询的服务被称为内部的服务,通常并不直接暴露到外网去。
面向公网的服务,一般都是以域名的形式提供给外部调用者,然而对于服务内部之间的互相调用,域名形式还不够,其原因在于:
综上,内网间的服务调用,通常而言会自己实现一套“服务发现”类的系统,其包括以下几个组件:
比如,某个服务实例的响应慢了,此时分配给该实例的流量响应的就会少一些。
而由于这个系统能提供服务的寻址能力,所以一些寻址策略就可以在这里做,比如灰度某些特定的流量只能到某些特定的实例上,比如可以配置每个实例的流量权重等。
RPC 库提供以下功能:
有了这套服务发现系统以及搭配使用的 RPC 库之后,来看看现在的服务调用是什么样的:
现在服务的架构又演进成了这样:
Service Mesh
架构发展到上面的程度,实际上已经能够解决大部分的问题了。这两年又出现了一个很火的概念:Service Mesh,中文翻译为“服务网格”,来看看它又能解决什么问题。
前面的服务发现系统中,需要一个与之配套的 RPC 库,然而这又会有如下的问题:
可以看到,由于 RPC 库是嵌入到进程之中的组件,所以以上问题很麻烦,于是就想出了一个办法:将原先的一个进程拆分成两个进程。
如下图所示:
在服务 Mesh 化之前,服务调用方实例通过自己内部的 RPC 库来与服务提供方实例进行通信。
在服务 Mesh 化之后,会与服务调用方同机部署一个 Local Proxy 也就是 Service Mesh 的 Proxy。
此时服务调用的流量会先走到这个 Proxy,再由它完成原先 RPC 库响应的工作。
至于如何实现这个流量的劫持,答案是采用 Iptables,将特定端口的流量转发到 Proxy 上面即可。
有了这一层的分拆,将业务服务与负责 RPC 库作用的 Proxy 分开来,上面的两个痛点问题就变成了对每台物理机上面的 Mesh Proxy 的升级维护问题。
多语言也不是问题了,因为都是通过网络调用完成的 RPC 通信,而不是进程内使用 RPC 库。
然而这个方案并不是什么问题都没有的,最大的问题在于,多了这一层的调用之后,势必有影响原来的响应时间。
截止目前(2019 年 6 月),Service Mesh 仍然还是一个概念大于实际的产品。
从上面的演进历史可以看到,所谓的“中间层理论”,即“Any problem in computer science can be solved by another layer of indirection(计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决)”在这个过程中被广泛使用。
比如为了解决 IP 地址难于记忆的问题,引入了域名系统,比如为了解决负载均衡问题引入了网关,等等。
然而每引入一个中间层,势必带来另外的影响,比如 Service Mesh 多一次到 Proxy 的调用,如何权衡又是另外的问题了。
另外,回到最开始的服务三要素中,可以看到整个演化的历史也是逐渐屏蔽了下层组件的流程,比如:
可以看到,演进流程让业务开发者更加专注在业务逻辑上,这类的演进流程不只发生在今天,也不会仅仅发生在今天,未来类似的演进也将再次发生。
作者:codedump
简介:多年从事互联网服务器后台开发工作。可访问作者博客:https://www.codedump.info/,阅读更多文章。
网页题目:一篇讲解“服务调用”的良心之作!
文章位置:http://www.shufengxianlan.com/qtweb/news33/471383.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联