一、简介
本文是将这几年在web编程的学习经历,从一开始的LAMP到java web、Django,我都练习着自己搭建,也有参与开发百万用户级别的手机APP,本文是试着将目前网页和APP的整体架构做一些简单的介绍,对细节有兴趣深入了解的推荐可以看《大型网站技术架构:核心原理与案例分析》、《大型网站系统与Java中间件实践》这两本书。
二、架构介绍
上图是一个非常简单的架构,现在的架构比这个复杂非常多,先讲一下基本交互,这边先省略一些中间件,当我们在博客园的web页面点选某篇文章,假如这篇文章我们之前没浏览过,这个时候浏览器会将请求传送到博客园的服务器,请求首先会先来到网关,网关判断请求类型是要读取网页,就会将请求转到读取页面的模块,读取页面模块再根据用户想看的页面在数据库里找寻,并回传给用户,这样就完成了一个简单的交互,下面针对各部分再一一说明
1、前端(web、APP、桌面客户端):
一般来说,前端就是指我们可以看到的界面,像是现在在浏览的网页,还有手机里面的APP,图片,视频,这些都是称为前端,前端主要的功能是要和人做交互,做输入输出,一般来说web前端使用了HTML、CSS、javascript这三种语言,如果要看一个网页的前端语言只需要在浏览器按右键点“检查”就可以看到了,而现在主要的前端都会利用像是bootstrap、JQuery这些框架来编写,以提高效率。
2、网关:
网关类似公司的前台和办事柜台,功能很多,主要有用户鉴权(检查用户账号密码,判断是否为正常用户)、负载均衡(分散流量,避免过度拥挤)、路由和监控(通常需要和中间件一起完成一系列的工作)。以上只是比较常见的功能,网关会根据需求被赋予多种的功能。一般对外接口也是由网关负责。
3、模块:
在现在微服务架构又称这些模块为“服务”,早期LAMP架构是所有的功能都挤在一起,没有分模块,随着现在互联网功能越来越复杂,为了日后的修改与扩展方便,便将这些“功能”拆分,现在的软件都是基于低耦合高内聚的原则去设计各个模块,方便日后迭代,每个模块都具有不同的功能,一般以“接口”的形式提供他们的服务,比如说用户服务的模块,就是可以对用户数据库进行增删改,接口不仅可以提供给自己,也可以提供给外部的软件使用,使用方法会写在“接口协议”或是“API文档”上,一般是用HTTP协议,POST方式调研,JSON格式返回,里面还会写到鉴权方式,请求格式和返回格式,这些就是模块与模块互相交互的方式。
4、数据库:
顾名思义,数据库就是数据储存的地方,一般来说数据库可以分为关系行数据库(RMDBS)和非关系数据库,关系型数据库就像EXEL表一样,有行有列,每一列都有相对于的名称,比如说员工资料库就是一种关系型数据库,如下图,一般是用SQL语言来对数据库做增删改
非关系型数据库NoSQL,比较常见的是KV型(一个Key对应一个Value)还有文档型数据库
5、举例:
假设今天有位新员工小美入职,职位是财务,首先我要在前端输入员工信息,前端会将这些信息带到网关,网关收到是要新增员工的请求,便将请求转发到“员工管理”的模块,模块传输数据库语言(例如MySQL)给数据库,数据库添加完成后返回添加成功的信息到前端,完成这一系列的操作
三、中间件介绍
上面的架构对于一个简单的应用其实已经够了,但是现在的互联网用户动辄百万,每天可能需要处理上亿条请求,功能负责又要快速响应,已经不是这种简单架构可以搞定的了,除了需要将多节点(Node)运行,还需要中间件的帮助,这边介绍几个比较常见的中间件
1、服务注册、发现:
常见的有zookeeper,主要功能是让网关知道有哪些服务,还有服务的位置(注册中心),服务是否正常运行等(健康检查),与网关一起合作,将用户发送的请求导向正确的处理模块。
2、消息队列:
常见的有reids等,主要功能是当请求量过大时,可以将请求放入到队伍中排队,再一一去处理,需要注意的是redis会将队列储存在内存里,需要准备足够的内存资源。
3、应用管理、配置管理:
互联网迭代周期短,需要时常进行新版本的迭代,从开发、测试到部署,都需要好的应用管理和配置管理系统,常见的有kubernates、apollo等,主要是负责将集成好的新版本部署到测试环境、预发布环境和生产环境,并进行配置的修改。
四、高可用
现在的软件都讲求高可用,意思就是大部分的时间要使用都可以使用,想想看如果有一天当你在排队结账的时候,支付宝突然不能用了,情况会是多么糟糕,所以高可用架构已经是当前的基本要求了。
一般达到高可用的主要方法是冗余、备份,下面会针对每个环节分别说明。
服务器:由于服务器故障是有可能突然故障的,当服务器发生故障的时候必须立刻通知路由系统,将接下来的请求发送到冗余服务器,假如服务器里有储存数据和资料的硬盘,也需要利用备份系统来回复(现在一般是使用RAID5),现在大型的网站都采用多节点虚拟机,即使某些硬件发生故障也不会影响到系统的正常运行。
服务、应用:假设每个服务好像是一个负责处理车牌登记的管理人员,多节点就是我多雇佣了十个人,来帮忙分担车牌登记的工作,假如里面有人去上厕所或是生病,我也还有人可以来处理车牌登记的工作,而监控系统会随时告知系统目前人员的工作情况,一旦发现人数过少的情况就会立刻通知运维进行处理。一般来说会利用zookeeper之类的中间件来负责服务集群管理这类的工作。