http服务端架构演进
摘要
在详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢?
- 什么叫正向代理,什么叫反向代理
- 服务代理与负载均衡的差别
- 有了nginx,为啥还需要LVS
- 都有哪些负载均衡的方式
服务端演进
在前面文章中我们介绍过最简单的一种客户端-服务端响应模式,如下
这是http服务最简单的一种形式,服务端就一层web服务器。
现在我们服务端变复杂了,用户数增加了,并发量增加了。对我们服务端要求增加了
- 服务能力:一台服务器满足不了这么多的http的请求了。我们需要增加机器了,进行服务扩容了
- 安全防护:开始有人对我们的服务进行网络攻击了,需要保护服务端服务器,限制ip地址
- 网站升级: 网站上线后,需要提供7*24小时无间断服务了,发布新的版本,需要保证网站的可用。
代理服务
为了解决这些问题,我们需要引入中间层也就是代理,在客户端和服务端中间插入一个中间环节,代理服务。代理,狭义上讲就是不生产内容,只是转发上下游的请求和响应。
代理服务按照是否匿名可以分为
- 匿名代理: 外部不知道真实机器,只知道代理服务器
- 透明代理: 外界知道代理,也知道真实服务器
按照靠近客户端还是服务端,分为
- 正向代理: 代理客户端,代表着客户端向服务器端发送请求
- 反向代理: 代理服务端,代表着服务器向客户端发送请求。
http协议对代理的支持
因为http协议最开始并没有考虑代理服务,设计的协议只是针对客户端-服务器模式。根据我们通常的架构标准,http协议层是不用关心使用者是如何使用的,代理服务这种中间产物自然不用考虑。服务端有获取客户端ip的需求,所以Squid这个缓存代理软件最先引入X-Forwarded-For头字段,用来表示 客户端的真实 IP。
格式如下,从客户端到各个代理服务,记录下每一层的转发
X-Forwarded-For: client, proxy1, proxy2
这个需求是如此的普世,所以慢慢变成了标准,被各个代理服务广泛使用,所以后来被写入到RFC 7239标准之中了
代理协议
HTTP 协议本身对代理服务并没有什么说明,所以就衍生出了代理协议,代理协议是haproxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取客户IP时非常有用。
- 多层NAT网络
- TCP代理(四层)或多层tcp代理
- https反向代理http(某些情况下由于Keep-alive导致不是每次请求都传递x-forword-for)
- https通信加密,不允许修改原始报文
另外由于每一层代理服务都需要解析http header 头X-Forwarded-For,然后追加自己的地址,所以这个成本也比较高。所以代理协议也变成了刚需,虽然是haproxy提出来的,但是也被各大代理服务器支持了,如nginx、apache、squid。代理协议格式
PROXY TCP4/TCP6 客户端ip 应答方ip 请求方端口号 应答方端口号 \r\n
这样请求方解析第一行就可以拿到客户端ip,不用再去处理http报文了。
负载均衡
负载均衡,其实就是分发请求。根据OSI七层协议
负载均衡分成两种
- 4层负载均衡,即工作在第四层传输层,利用ip地址端口进行请求转发,因为没有其他操作,所以效率比较高
- 七层负载均衡,即工作在第七层应用层,根据HTTP请求头,URL信息转发特定的主机。效率相对低一点。
nginx是七层负载均衡,LVS是七层负载均衡。
所以小型网站,nginx就足够,当流量足够大时,负载均衡成为瓶颈了,就可以在前面引入了LVS一层。
关于具体的负载均衡算法,参考这边文章,这里不再赘述
安全防护
前面我们提到过安全防护也是代理服务的一大重要功能。为了应对外部攻击,需要引入网络防火墙,WAF(Web Application Firewall)。工作在OSI 第七层,主要是对http报文进行更细致的审核,也就是各种filter。
比如
- IP 黑白名单
- DDOS攻击
- 各种注入
当服务的安全性要求没那么高时,或者对公司业务发展的ROI没那么高时,我们通常就在nginx层面配置一些规则即可。需求升级时,我们就要引入专门的模型,比如ModSecurity1。需求再升级时,引入外部云厂商提供的WAF服务。
最终架构形式
http服务端架构演进和我们单应用架构演进有异曲同工之处。在业务不复杂的时候,可以使用单体模块搞定(比如Nginx),当请求量增加,需求升级时,需要引入中间层来解决。当某个模块要求增加时,需要解耦出单独的模块来处理。
所以整体上看,一个中型的服务端架构如下图。
参考
https://juejin.im/post/5ccaaf0af265da035e213490
https://www.cnblogs.com/xybaby/p/7867735.html
关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路
相关阅读
详解http报文
http服务端架构演进的更多相关文章
- 1年内4次架构调整,谈Nice的服务端架构变迁之路
Nice 本身是一款照片分享社区类型的应用,在分享照片和生活态度的同时可以在照片上贴上如品牌.地点.兴趣等tag. Nice从2013.10月份上线App Store到目前每天2亿PV,服务端架构经过 ...
- 从服务端架构设计角度,深入理解大型APP架构升级
随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...
- 多个微信小程序一个服务端架构
由于某些特定的业务场景,当多个小程序需要一个服务端后台提供数据时,大家可能想到是HTTP路由.是的,实际上我们使用微服务的GateWay网关也是一样的,如下图微服务架构: 网关GateWay的作用在于 ...
- 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现
一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
- App服务端架构变迁
随着移动互联网时代的到来,移动技术也随之飞速发展.如今,App已然成为绝大多数互联网企业用来获取用户的核心渠道.以往以PC为主要承载平台的各业务线,源源不断集成加入到移动项目中来,原本以产品为中心快速 ...
- 移动App服务端架构设计
我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...
- APP和服务端-架构设计(二)
1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...
- APP和服务端-架构设计(一)
架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...
随机推荐
- Git使用(一)安装配置过程-Win7
公司项目需要使用Git作为项目的代码库管理工具.正好借此机会写个安装过程 1.首先下载Git下载地址:https://git-scm.com/download/win 当前下载版本:Git-2.13. ...
- 每天学会一点点(HashMap实现原理及源码分析)
HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希 ...
- 警告:Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
执行Maven Install打包的时候,提示以下警告信息: [WARNING] Using platform encoding (GBK actually) to copy filtered res ...
- SpannableString设置文本背景色
参考内容: http://blog.csdn.net/harvic880925/article/details/38984705 http://blog.it985.com/14433.html 1. ...
- Winform中通过代码给PanelControl添加子控件并进行定位
场景 DevExpress的PanelControl常用进行窗体页面的布局. 一般是拖拽一个PannelControl,然后是再拖拽其他控件. 如果是由代码生成控件并控制布局的话,怎样实现. 关注公众 ...
- 编译gaia
./rkst/mkimage.sh rk3066-eng -j8 gaia 分别是编译文件路径 编译的输出类型 处理器分配数 待编译模块 //flash gaia1. adb remount2. ad ...
- CCPC桂林
在得知我们队伍前往桂林参加CPPC区域赛后,我是非常激动的,因为我们网络赛并没有得到名额,如果不是新都赠予我们名额,我们都没有出去打比赛的机会,同时,我们也不想浪费这个名额,我们也想打出成绩来,于是我 ...
- 上海地铁游移动APP需求分析
人们在现实的生活中会遇到各种各样的问题,有不同的需求,我们需要加以解决,开发一个软件是一个很好的方法去解决这些需求和问题.那么,作为一个软件团队如何才能准确而全面地找到这些需求呢?主要有一下几个步骤. ...
- charles 发布Glist
本文参考:charles 发布Glist Publish Gist /发布代码段 选中某个文件,点击Publish Gist,如果你没有github,这个文件将被匿名发布,您也就无法删除它: 当然你可 ...
- 浅谈ViewPager与TabLayout的简单用法
今天介绍一下ViewPager与TabLayout的简单用法 1.准备 在一切开始之前,你懂得,先导库,老方法,在build.gradle直接添加下面这一句 implementation ...