网络架构及其演变过程总结

最近读了韩路彪老师写的“网络架构及其演变过程”的文章,在这里做了一个记录,分享给大家!

软件的三大类型

首先我们说下软件的三大类型是如何演变过来的:

从一开是我们使用的单机软件,所谓的单机软件,就是所有的处理逻辑全部都pc电脑的程序上,并不需要联网就可以使用的,后来人们在使用的过程中,想要一个程序能够统一的去管理我们的软件,每个人电脑上的软件都能够连到这个程序,统一去的去处理我们的请求,这就衍生出来了客户机/服务器的软件类型,我们习惯的成为CS;由于人们在一个东西用久了之后,就会再想着有没有一种更简洁的办法去使用呢,因为最近他已经被频繁的更新系统弄烦了,而且换了电脑之后,又得重新安装一下那个程序才能使用,所以B/S就出现了,每个系统装完之后都会自带一个浏览器。我们现在可以把浏览器作为我们的程序客户端,通过他去请求服务,用户也不需要手动去更新软件和安装软件,只需要打开浏览器就可以享受服务。两种软件架构图如下所示。

引自《看透springMvc源代码分析与实践》

引自《看透springMvc源代码分析与实践》

对比两张图可以看出,从C/S向B/S演进的过程中,就是我们的客户端被浏览器取代了。

基础的架构B/S是如何演变今天这种复杂的架构呢?

传统的BS架构虽然很简单,但是他底层的实现机制确实很复杂,因为他必须要解决网络数据传输的问题,在网络通信中,使用最多的协议族就是TCP/IP通信,至于是怎么演变成今天这样一个完整的架构体系呢?

由于当一个企业刚开始使用系统的时候,这种传统的BS还是能满足的,传统的BS架构上,应用程序和数据库程序是放在同一个服务器上,到过数据累计到一定量的时候,就得使用更多的解决方案去处理它,首先我们想到的肯定是将数据库和应用程序进行分离,这个确实能解决暂时的问题,但是随着数据量的不断积累,所带来的问题不断增多,所以就衍生出了接下来的几种方案:

海量数据的解决方案

1.缓存和页面静态化

对于数据量大的问题,我们可以使用缓存,我们现在的系统中,在系统启动的时候,都会从数据库中将数据放到缓存中,后面所有关于该数据的请求,都会直接到缓存中去取,如果程序修改了该段缓存在数据库中的数据,则也会相应的去更新缓存。

页面静态化:可以使用一些模板引擎去渲染我们的动态数据,生成静态页面,还可以使用nginx服务器将我们上次请求的页面缓存到代理服务器中,下次就可以直接访问缓存中的页面

2.数据库优化

数据库优化又分为sql语句优化,分区,分表,存储过程,索引优化。sql语句优化就通过修改我们的业务逻辑处理的过程进行改造我们的sql语句,可以通过分析slq语句的查询时间,来进行优化。当一张表中数据两非常大,我们可能会想到使用分区去处理这些数据,通过对一堆的数据进行分区过后,我们在查询的数据的时候,可以只对某一个分区进行过滤,就不需要对整张表进行操作,对比效果肯定是明显的。分表操作主要是用来对一张表中固定不变的类型进行分表,系统查询的时候可以去指定类型的表中去获取数据。添加索引有利于我们的查询速度,通过索引可以快速定位到满足条件的数据所在的指针位置,根据指针就可以快速定位,但是使用索引的同时也会给我们对数据库的增删改操作带来了效率问题,每次更新数据的时候都需要更新相应的索引,但是只要我们合理的使用索引,肯定会给程序带来一定的效率的提升。当我们的sql语句书写的非常复杂的时候,我们不妨使用存储过程去代替sql语句。存储过程可以解决一些复杂的逻辑问题,可以随意调用sql的函数,减少我们重复操作数据库的次数,提升效率。

3.分离活跃数据

当我们的表中有百分之20的数据修改的频率比较高,其余的基本不会更新的时候,但是又不能删除。我们不妨采用数据分离的操作。因为如果将这些数据放一起的话,每次去操作那些百分之20的数据都会关联到整张表,这个被占用的资源是可以解除的,我们可以将剩下的百分之80的数据定期移到另外一张表,请求查询的时候优先查询默认的表。默认的表中没有数据再去另外一张表中去查。

4.批量读取和延迟修改

合并多次请求,去查询数据库。

5.读写分离(数据库集群)

读写分离的实质是为数据库搭建一个集群。集群中有一台服务器专门去处理用户的写操作,其他服务器专门用来响应用户的读操作,当用户往专门处理写数据的服务器中写数据之后,写服务器会将数据同步到其他的服务器中,后面演进成写服务器先将数据同步到器中几台读服务器,然后被同步的读服务器去同步这些数据到剩下的读服务器中。

引自《看透springMvc源代码分析与实践》

6.分布式数据库

分布式数据库就是将不同的表存放到不同的数据库中然后再放到不同的服务其上,然后数据请求的时候通过一个系统将这个请求分到不同的节点上去查寻对应的表,然后再启动一个程序把数据整合后返回给用户。分布式数据库和数据库集群的区别:数据库集群是将用户的不同请求分配给不同服务器去处理,而分布式数据库则是将用户的单次请求去分配给不同的节点服务器去处理,然后整合结果返回。

引自《看透springMvc源代码分析与实践》

7.Nosql和hadoop

nosql指的是无结构化的数据库,与之对应的就是我们日常使用关系型数据库,使用nosql时我们无需提前定义字段,及内容格式,他的存储方式非常灵活,性能也高。hadoop是专门处理大数据的一套框架,hadoop对数据存储提供了一套解决方案,将一个表中的数据拆分成不同的数据块,数据库会放在不同的节点上,每个节点上都会放两道三块的数据,这个要看hadoop具体怎么配置,这样一来每块数据都有多个节点来保存,保证数据的可恢复性和稳定性。

引自《看透springMvc源代码分析与实践》

高并发的解决方案

1.应用和静态资源分离

刚开始的时候,系统中既包含了应用处理程序又包含了前端静态资源文件,当并发量达到一定的程度时就需要将应用和静态资源分离,因为前端资源没有状态。所以分离比较简单。只需要将静态资源放到其他服务器中,应用程序通过域名去访问

引自《看透springMvc源代码分析与实践》

2.页面缓存

利用相应的服务如nginx自身带的页面缓存机制实现页面缓存,用户再次访问就不需要再次去生成页面。也可以使用专门做缓存页面的服务器Squid,对于经常变的页面,我们可以使用ajax请求动态的去请求服务器。,修改数据

3.集群与分布式

集群是每台机器处理相同的事情,主要用来做分流,而分布式是处理一件事中的某一小部分,需要协同其他节点共同处理。集群分为两种方式:静态资源集群和应用程序集群,上面说过静态资源集群时没有状态的,所以实现简单,但是应用程序实现集群会出现很多问题,因为他有会话机制,我们必须要同步这些会话数据,才能保证访问的一致性,对于java,可以使用tomcat的自带的配置实现session共享,也可以将这个session交给第三方管理,实现同步共享,例如redis,还有一种办法就是当用户访问的时候第一次被轮到的服务器,接下来会一直被这个用户使用,这样就不存在会话失效的问题。nginx就可以通过改变负载均很的轮询算法实现这个功能。

4.反向代理

反向代理指的时用户根本不知道是哪台服务器为他提供服务。因为他请求的时中间的代理,代理通过一定的机制找到适合当前用户的目标服务器去处理用户的请求,与之不同的是代理服务器。代理服务器是用户主动发起的,用户知道目标,但是想要去与这个目标通信,必须要通过这个代理。

5.CDN

cdn在百度百科中是这么定义的

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

他会根据用户的请求,去分配给用户最合适的目标去处理用户的请求,主要是由CDN的自带的dns解析器工作。

引自《看透springMvc源代码分析与实践》

欢迎关注我的微信公众号

乐哉码农

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181202G195DX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券