上一节,我们学习了linux下文件服务器NFS的搭建,了解了他的基本原理。可以说也是很简单的一个服务。今天我们学习影响互联网最重要服务web服务(应用服务)。什么是web服务呢?就是我们平常在浏览器输入一个网站的地址,然后能给我们提供服务的就是web服务器。Web服务器的发展历史我就不多说了,我直接说下现在流行的搭建这种服务的常用软件。在Linux下比较常用的有三种分别是apache软件,tomcat软件,nginx软件。这三款是我在工作都接触过的,当然还有别的,其原理都是一样的,在这里我就不多说了。w_0001.gif

   Web服务器的工作原理前面我已经讲过了就是三次握手使用的是80端口。那我们前面都已经讲过了,今天讲什么呢?今天我们讲解下Web服务架构的演变

   网站我们常听说有静态网站和动态网站,那什么是静态网站和动态网站呢?官方的回答我就不引用了,我说下我的理解,有数据库的网站就是动态网站,没有数据库的就是静态网站。他们之间的区别是什么呢?看下面

静态网站w_0039.gif

1、         静态网页是以.htm.html.shtml.xml等为后缀的

2、         静态网页的内容相对稳定,因此容易被搜索引擎检索;

3、         静态网页的交互性较差,在功能方面有较大的限制

4、         静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件;

5、         静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难。

动态网站w_0038.gif

1、         采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等;

2、         动态网页以数据库技术为基础,可以大大降低网站维护的工作量;

3、         动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页。

在网站开始之初只有静态网站,后来才衍生出了动态网站,对于动静态网页最简单的最直接的判断就是看网址的后缀。


网站的初期,我们经常会在一台服务器上跑我们所有的程序和软件包括数据库。

wKioL1bbp7bzljXMAACNuXOeYws715.png

随着网站的上线,访问量逐步上升,服务器的负载慢慢提高,在服务器还没有超载的时候,我们应该就要做好准备,提升网站的负载能力。假如我们 代码层面已难以优化,在不提高单台机器的性能的情况下,增加机器是一个不错的方式,不仅可以有效地提高系统的负载能力,而且性价比高。

增加的机器用来做什么呢?此时我们可以把数据库,web服务器拆分开来,这样不仅提高了单台机器的负载能力,也提高了容灾能力。

wKiom1bbqRfh6k5nAADKzzTONrM106.png

随着访问量继续增加,单台应用服务器已经无法满足需求了。在假设数据库服务器没有压力的情况下,我们可以把应用服务器从一台变成了两台甚至多台,把用户的请求分散到不同的服务器中,从而提高负载能力。多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务。这时有负载均衡方案和高可用方案。w_0032.gif

wKioL1bbqx2QLVA9AACfWkOrXHQ109.png        注释:高可用方案指的是当一个web服务器宕机了,另一台会自动接管。w_0027.gif


wKiom1bcEy6wkRbkAACiG_xBWfk474.png         注释:负载均衡方案是当访问用户多了,负载均衡器把任务分配到不同Web服务器上


上面我们总是假设数据库负载正常,但随着访问量的的提高,数据库的负载也在慢慢增大。那么可能有人马上就想到跟应用服务器一样,把数据库一份为二再负载均衡即可。但对于数据库来说,并没有那么简单。假如我们简单的把数据库一分为二,然后对于数据库的请求,分别负载到A机器和B机器,那么显而 易见会造成两台数据库数据不统一的问题。那么对于这种情况,我们可以先考虑使用读写分离的方式。

读写分离后的数据库系统结构如下:w_0041.gif

wKiom1bcAraB0DPpAAEI8x_9Crw512.png


   随着访问量的增加,逐渐出现了许多用户访问同一部分内容的情况,对于这些比较热门的内容,没必要每次都从数据库读取。我们可以使用缓存技术,例如可以使用google的开源缓存技术guava者使用memcacahe作为应用层的缓存,也可以使用redis作为数据库层的缓存。

wKioL1bcBviy0-VYAAEg78rdJKk395.png

   我们的网站演进到现在,交易、商品、用户的数据都还在同一个数据库中。尽管采取了增加缓存,读写分离的方式,但随着数据库的压力继续增加,数据库的瓶颈越来越突出,此时,我们可以有数据垂直拆分和水平拆分两种选择。

数据垂直拆分w_0036.gif

垂直拆分的意思是把数据库中不同的业务数据拆分道不同的数据库中,结合现在的例子,就是把交易、商品、用户的数据分开。


数据水平拆分w_0037.gif

数据水平拆分就是把同一个表中的数据拆分到两个甚至多个数据库中。产生数据水平拆分的原因是某个业务的数据量或者更新量到达了单个数据库的瓶颈,这时就可以把这个表拆分到两个或更多个数据库中。

   我们的网站到现在虽然进行的垂直拆分和水平拆分,可能会有一些相同的代码,如用户相关的代码,商品和交易都需要用户信息,所以在两个系统中都保留差不多的操作用户信息的代码。如何保证这些代码可以复用是一个需要解决的问题。

解决方法:w_0048.gif

   通过走服务化的路线来解决

   什么是服务化呢?

为了解决上面拆分应用后所出现的问题,我们把公共的服务拆分出来,形成一种服务化的模式,简称SOA(即服务化)

有了服务化概念之后,我们如何进行远程的服务调用

解决方法:    

我们可以通过下面的引入消息中间件来解决。

   随着网站的继续发展,我们的系统中可能出现不同语言开发的子模块和部署在不同平台的子系统。此时我们需要一个平台来传递可靠的,与平台和语言无关的数据,并且能够把负载均衡透明化,能在调用过程中收集调用数据并分析之,推测出网站的访问增长率等等一系列需求,对于网站应该如何成长做出预测。 开源消息中间件有阿里的dubbo,可以搭配Google开源的分布式程序协调服务zookeeper实现服务器的注册与发现。

  现在我们的网站的已经达到了顶峰,我们把我们的网站放在一个地方,在中国不同地区的人访问的速度不一样,怎么样让不同地区的人能有相差无极的访问呢?

  有些童鞋可能立马想到把我们的网站分开放不就可以了嘛!对就是这样,我们在上海的机房放置一套这样网站服务,然后在在北京也放置一套这样的网站服务。以此类推,这样叫分布式网站。这些分布式网站之间会过一段时间进行数据同步一次,这样我们看起来网站的内容是一样的。

  这就是我们的网站演变路程,接下来我们会从单台服务器的搭建到一个服务器集群的搭建,给大家演示下,并告诉大家什么情况下采用什么样的架构!童鞋们简单吧!

  如果有把前面的基础命令学好,这些无非就是一些原理上的理解,你理解了这些原理,然后通过前面学习的命令找到相应的软件。就可以搭建出一个网站。当然我这里只是做了很简单的总结。后面我会细讲每一个不同架构的网站怎么实现。今天就到这里了,希望大家努力点儿!j_0028.gif