一篇讲解“服务调用”的良心之作( 二 )



PB 出现之后,也有很多类似的技术出现,如 Thrift、MsgPack 等,不在这里阐述,将这一类技术都以 PB 来描述 。
与前面的两种手段相比,PB 具有以下的优点:
使用 proto 格式文件来定义协议格式,proto 文件是一个典型的 DSL(domain-specific language)文件,文件中描述了协议的具体格式,每个字段都是什么类型,哪些是可选字段哪些是必选字段 。有了 proto 文件之后,C\S 两端是通过这个文件来进行协议的沟通交流的,而不是具体的技术细节 。
PB 能通过 proto 文件生成各种语言对应的序列化反序列化代码,给跨语言调用提供了方便 。PB 自己能够对特定类型进行数据压缩,减少数据大小 。服务网关
有了前面的演化之后,写一个简单的单机服务器已经不难 。然而,当随着访问量的增大,一台机器已经不足以支撑所有的请求,此时就需要横向扩展多加一些业务服务器 。
而前面通过域名访问服务的架构就遇到了问题:如果有多个服务实例可以提供相同的服务,那么势必需要在 DNS 的域名解析中将域名与多个地址进行绑定 。
这样的方案就有如下的问题:
如何检查这些实例的健康情况,同时在发现出现问题的时候增删服务实例地址?即所谓的服务高可用问题 。把这些服务实例地址都暴露到外网,会不会涉及到安全问题?即使可以解决安全问题,那么也需要每台机器都做安全策略 。由于 DNS 协议的特点,增删服务实例并不是实时的,有时候会影响到业务 。
为了解决这些问题,就引入了反向代理网关这一组件 。它提供如下的功能:
负载均衡功能:根据某些算法将请求分派到服务实例上 。提供管理功能:可以给运维管理员增减服务实例 。由于它决定了服务请求流量的走向,因此还可以做更多的其他功能:灰度引流、安全防攻击(如访问黑白名单、卸载 SSL 证书)等 。有四层和七层负载均衡软件,其中四层负载均衡这里介绍 LVS,七层负载均衡介绍 Nginx 。
上图是简易的 TCP/IP 协议栈层次图,其中 LVS 工作在四层,即请求来到 LVS 这里时是根据四层协议来决定请求最终走到哪个服务实例 。
而 Nginx 工作在七层,主要用于 协议本身来决定请求的走向 。
需要说明的是,Nginx 也可以工作在四层,但是这么用的地方不是很多,可以参考 Nginx 的 Stream 模块 。
做为四层负载均衡的 LVS
【一篇讲解“服务调用”的良心之作】由于 LVS 有好几种工作模式,并不是每一种我都很清楚,以下表述仅针对 Full NAT 模式,下面的表述或者有误 。
LVS 有如下的组成部分:
Direct Server(以下简称 DS):前端暴露给客户端进行负载均衡的服务器 。Virtual IP 地址(以下简称 VIP):DS 暴露出去的 IP 地址,做为客户端请求的地址 。Direct IP 地址(以下简称 DIP):DS 用于与 Real Server 交互的 IP 地址 。Real Server(以下简称 RS):后端真正进行工作的服务器,可以横向扩展 。Real IP 地址(以下简称 RIP):RS 的地址 。Client IP 地址(以下简称 CIP):Client 的地址 。客户端进行请求时,流程如下:
使用 VIP 地址访问 DS,此时的地址二元组为< src:CIP,DST:VIP > 。DS 根据自己的负载均衡算法,选择一个 RS 将请求转发过去,在转发过去的时候,修改请求的源 IP 地址为 DIP 地址,让 RS 看上去认为是 DS 在访问它,此时的地址二元组为RS 处理并且应答该请求,这个回报的源地址为 RS 的 RIP 地址,目的地址为 DIP 地址,此时的地址二元组为。DS 在收到该应答包之后,将报文应答客户端,此时修改应答报文的源地址为 VIP 地址,目的地址为 CIP 地址,此时的地址二元组为做为七层负载均衡的 Nginx
在开始展开讨论之前,需要简单说一下正向代理和反向代理 。
所谓的正向代理(proxy),我的理解就是在客户端处的代理 。如浏览器中的可以配置的访问某些网站的代理,就属于正向代理,但是一般而言不会说正向代理而是代理,即默认代理都是正向的 。
而反向代理(reverse proxy),就是挡在服务器端前面的代理,比如前面 LVS 中的 DS 服务器就属于一种反向代理 。
为什么需要反向代理,大体的原因有以下的考量:
负载均衡:希望在这个反向代理的服务器中,将请求均衡的分发到后面的服务器中 。安全:不想向客户端暴露太多的服务器地址,统一接入到这个反向代理服务器中,在这里做限流、安全控制等 。由于统一接入了客户端的请求,所以在反向代理的接入层可以做更多的控制策略,比如灰度流量发布、权重控制等等 。反向代理与所谓的 Gateway、网关等,我认为没有太多的差异,只是叫法不同而已,做的事情都是类似的 。

推荐阅读