一、简介
本文是将这几年在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,主要功能是让网关知道有哪些服务,还有服务的位置,服务是否正常运行等(利用心跳检测)。另外zookeepr还有配置管理,集群管理等功能,就不一一细讲了。
2、消息队列:
常见的有reids等,主要功能是当请求量过大时,可以将请求放入到队伍中排队,再一一去处理,需要注意的是redis会将队列储存在内存里,需要准备足够的内存资源。
3、应用管理、配置管理:
互联网迭代周期短,需要时常进行新版本的迭代,从开发、测试到部署,都需要好的应用管理和配置管理系统,常见的有kubernates、apollo等,主要是负责将集成好的新版本部署到测试环境、预发布环境和生产环境,并进行配置的修改。