Web开发是一直以来程序员的热门发展方向,尤其是全栈工程师的薪资待遇很丰厚,最近有很多小伙伴问到我关于Web开发的问题,最常见的就是"web开发难吗"、"学什么语言做web开发好找工作"。
作为一个多年在线下教学web开发的老师,今天我用比较容易理解的方式来给大家讲讲web开发最重要的东西——服务器架构的原理,大家可以通过这个入门的讲解来自己给自己答案,一切事物看本质。
老规矩,前面先跟大家讲技术知识点,后面把自己收藏的干货送给大家,但愿能帮到需要的人。
首先我们先来看一张Web开发的服务器框架原理图,我们从这里开始了解:
暂时先不对里面的板块做详细分析,文章后面会具体讲解,我们先来梳理一下web开发的服务器框架原理。
从图中的白箭头我们可以看出来,服务器的响应过程可以大致分为两个流程:
请求数据过程:客户端→web服务器→业务服务器→缓存服务器→数据库
返回数据过程:数据库→缓存服务器→业务服务器→web服务器→客户端
举个例子,一个叫王二麻子的同学想从电脑上查一下自己的英语四级考试分数,这时候他在电脑上登录查询页面的时候,就是在客户端。当他在客户端输入完个人信息后点击查询按钮时,客户端就开始向web服务器发送王二麻子的数据请求,web服务器命令业务服务器去缓存服务器核实和处理一下,缓存服务器带着王二麻子的数据再去数据库调取数据。
当数据库调取完王二麻子的数据之后,就立马告诉缓存服务器,缓存服务器又跑去告诉业务服务器,业务服务器屁颠屁颠地把王二麻子的数据交给web服务器,web服务器大手一挥,终端悄无声息地就把王二麻子的数据呈现出来了,王二麻子一看数据可能就大骂一句:"XX,又要重考!"
过程就是这么个过程,虽然看起来跑来跑去很麻烦,但其实不麻烦的,计算机分分钟能处理千万个王二麻子。
web开发目前主要的客户端类型有IOS、Android、PC(电脑)和移动(手机等)四种客户端,这个就不多讲了,通常意义上,每一个用户的界面就是客户端了,用来呈现图片、文字、视频等数据给用户查看。
web服务器的主要功能有2个:负载均衡和静态资源服务器。
(1)负载均衡
什么叫负载均衡?我们先来看一张图哈:
这是最简单的一个服务器架构了,它没有web服务器,就只有客户端、业务服务器、数据库组成,在数据量较小的情况下,它是可以正常运行的。
假如一个业务服务器能支持5000个客户端访问,只要不超过5000台设备访问都是OK的,但如果超出了5000个客户端访问呢?那就只剩下2个方法,一是通过换开发语言来重构业务服务器以达到提升它的性能,涉及开发语言的性能,后面我们再讲;二是增加业务服务器的数量来保证大量用户端的正常访问,,增加负载能力,这也是较为常用的方法。
那么问题来了,增加业务服务器的数量,但它们"长得"都差不多,客户端就很郁闷,我该访问哪个服务器?
所以需要一个web服务器来统筹分配,分配客户端应该访问哪个业务服务器,合理分配资源,避免导致客户端统一访问某个业务服务器而造成负载超核,这就是web服务器的负载均衡作用。
(2)静态资源服务器
不是所有的数据请求都要访问数据库。前面我们所说的从客户端一步一步跑到数据库来进行数据的请求和返回数据动态请求,而有些数据存储在web服务器上的,不需要访问数据库就能获取数据到用户端,称为静态请求。
比如某些网页不常变化的一些文字、图片、视频等,基本就固定在某个地方做展示,开发员不调整就不会更新的那种,静静地待在那里,谁进入页面就显示出来,这些数据放在web服务器上而没有存在数据库,便于更快地展现给客户端。
业务服务器的主要功能是:接受数据、处理(查询、写入)数据、返回数据三方面。
(1)协议
目前服务器对数据的传输和处理主要遵循两种协议:http/https和socket请求。http协议属于应用层,socket就比较原生了,就是所谓的TCP/IP层,属于网络层。这两个就不细讲了,往这方面发展都会学的。
(2)开发语言
服务器的开发语言算是百家争鸣了,你可以用C、C++、Java、PHP、Python、Ruby等语言来开发,但是从性能、性价比方面还是有区别的。
目前在做服务器比较多的语言还是Java和PHP,为什么呢?第一,php相对比较简单,比较容易入门这功能;第二,java可以大规模的团队协作开发,封装成模块,代码可复用。
但现在还存在这么一种趋势:用C/C++和Python来做服务器开发的公司越来越多了,为什么呢?
因为很多服务器开发的开发时期是很久以前了,十年或十几年前了,那时候企业为了快速地攻城略池,先把业务跑起来,选用了开发周期短的语言来做服务器,虽然负载有限,但可以用硬件来补足,但随着手机和电脑的数量越来越多,客户端数量上升,如果还是用硬件来补足服务器的负载性能,将会面临很多问题。
比如说其中的电费问题,阿里就遇到过,机器得一直开着,随着阿里的业务量越来越大,硬件每天消耗的电费开销是个头疼的问题,日以继夜地烧下去只会是烧钱,光是电费开销就占到了公司年开销的10~30%,那怎么办?那就只能从服务器的开发入手,选用性能更高的语言来重构服务器,性能提高,有的服务器重构之后性能,单台性能可以提升10倍。
所以C/C++这种机器语言就成为了有实力的企业开发服务器首选,所以说C/C++永不过时。
对于中小型企业来讲,开发服务器不建议用C/C++,虽然它们的性能高,但开发起来难度大,而且市面上真正懂C/C++的程序员比较少,所以支付的工资自然也就高了。可以选用脚本语言来开发,让业务先跑起来,等到了瓶颈时,相信公司也有了稳定的资金支持了,这个时候再重构服务器更合适。
我个人比较推崇用Python来做中小企业的服务器开发,为什么不是其他的语言呢?
首先Python是一门面向对象的脚本语言,代码量少,语法简洁,逻辑清晰,从的代码优美程度和团队协作开发上来讲,PHP不如Python;Java虽然好,但是比较重,比如干一件事情C语言需要100行代码,那么Java差不多就是50行左右,而Python只需要10行。
我个人不推荐用Ruby来做服务器。一是因为Ruby是日本人做的东西,爱国情怀;二是Ruby是一种魔幻语言,什么意思呢?也就是你写了一个符号或者写了一个指令,他背后给你干了很多事儿,你看不到这个东西的底层,逻辑上不清晰,随便写,也就是说你按照它的一些特殊的符号,它会给你带来很多事儿。这种魔幻性语言他们不适合团队开发,团队开发的话呢,大家水平参差不齐,有的人掌握了更多的魔幻语法,有的人不掌握,不适合团队开发。
认真看文章的朋友可能会发现,在之前我们有讲过服务器架构的最简版,里面没有缓存服务器也能正常运行,那么问题来了,业务服务器需要数据直接去数据库找不就完了?为什么要增加一个缓存服务器?
这其实是为了减少数据库的负载和提升客户端的体验感。缓存服务器相当于一个缓存区,可以缓存数据。
举个例子,数据库的读取速度如果是4000次/s,如果此时有1万个数据在线请求访问数据库,可是数据库这1s很忙啊,忙不过来,那客户端那边就只有等待了,数据库需要2s多的时间才能给到客户端想要的数据,那如果是10万、100万、1000万呢?等20s、200s、2000秒?这样的用户体验感是不是很不好?
于是增加了缓存服务器,它可以将常用信息缓存在那里,读取速度快(具体多快可以去网上查一下缓存和内存的速度差别),当再次客户端再次请求时,就不需要访问数据库,直接拿缓存服务器里面的数据就可以了。
在数据的储存方面还有更高深的分布式文件储存系统,也是解决传统数据库的不足之处,比如阿里采用的的TDFS和亚马逊的GDFS等等,这方面属于比较高端的技术了,如果有机会也可以去了解一下。
关于web开发的服务器架构原理就给大家讲完了,从原理上来理解的话也并没有很困难,如果你选用合适的语言去做web开发也会事半功倍,尤其是Python来做开发,很多人前后端都能搞定,作为这样的全栈工程师在市面上是很吃香的。
各位友友,我的网盘资料是越堆越多了,尤其是小白入门Python的资料,我已经用不到了,现准备拿出来分享给大家,有需要的直接拿走。
需要的话可以添加我助教的微信(pykf20),她时间比较多,备注一下"领资料",方便她知道你的来意和最快速度给你东西,细品下图: