软件框架——简介(1)

一、学习一点软件架构的知识

  • 认识

    1. 什么是软件架构,就是软件项目的顶层结构,就相当于总体设计图。
    2. 为什么需要软件架构?现代的软件功能要求越来越强,规模越来越大,演进越来越快,响应速度越来越高,稳定性越来越强等等。为了满足以上要求,软件设计变得越来越复杂,软件架构就是为了解决软件的复杂性而生的。
    3. 什么是软件架构师?它具有丰富的编程实践经验,对普遍性的行业业务有基本的认识,有较扎实的计算机的功底,有良好地沟通能力,有较强的学习能力;在公司内部,它应该是技术权威,它不会去写代码,却要能够指导项目组的技术人员去书写代码。能够依据自己丰富的经验设计项目的架构图,并能够结合架构图进行项目的核算及部署。一个追求进步的程序员,应该把成为架构师作为自己未来成长的方向。成为一个合格的架构师,除了有丰富的经验,还需要掌握很多架构方面的知识。
    4. 软件的复杂性体现在哪些方面?过却杂性主要体现在数据结构和算法,而现在它们已不能够成为软件复杂性的基本原因。现代的软件系统的复杂性主要体现在三个方面,分别是高性能,高可用,高扩展。因此架构师的工作就是围绕着这三个方面来开展的。
  • 高性能

    • 系统的响应速度快,算法执行有效率。QPS 指标,每秒可处理的请求量。
    1. 提高数据库的性能,读写分离的实现方式,把工作量进行分散,防止所有的操作集中到一台服务器,据统计,一套系统对数据库的访问 80% 的工作量都是查询,20% 的工作量是增删改,所有的增删改都在主机上完成,所有的查询都在从机上完成,根据数据库的工作量,从机至少一台,也可以进行多台扩展。底层主机完成数据的改变后,会马上把改变同步到所有的从机,从理论上来看,所有的机器上的数据都是一样的。这是现代多数系统采用的方式,以解决数据库性能不足的问题。数据库很容易成为性能的瓶颈,因此该种方式可以很大程度上的提高系统的整体性能。
    2. 分库分表,一台服务器的容量和一份数据库的大小是有限的,当系统的规模不断增长,一个数据库系统无法承载所有的数据,就算勉强够用效率也会急剧下降。分库是把一个数据库拆成多个数据库,一个库中包含部分表,把针对一台服务器的工作量分担到不同的机器上。此时的问题在于表与表之间的关联无法建立,多表查询无法实现。原来大家会把多表查询分解为多个单表查询,会增加代码的设计量。分表,当一个表中的记录多到一定程度,比如 mysql,单表记录的数据达到五千万左右效率会急剧下降,此时就要考虑进行分表,也就是把一张表拆成多个表,可以进行横向拆分也可以进行纵向拆分。现在多半使用 myCat 框架来实现分库分表的操作,从而降低手写代码的复杂性。
    3. NoSQL:代表一组与数据库存储相关的非关系型的数据库。比如 redis,mongdb,HBase 等。它们的作用一是解决普通数据库查询的低效率,二是用来存储非关系型数据库。
    4. 高性能缓存架构,缓存就是把经常使用到的经常需要查询的大量的数据存放在内存中,这份内存就是缓存。可以成千倍的提高查询速度。最具代表性的是 k-v 结构的缓存,比如 redis,memcach;特别是 redis 的 v 可以存放不同数据结构的数据,比如字符串,数字等基本类型,也可以是对象,集合,hash 等数据类型。
    5. 负载均衡:基于负载均衡的系统的数量可以不断扩展,不会因为用户量增加而造成单台机器的性能下降。负载均衡器分为两大类,一类是硬件设计,典型的是 F5(速度最快),另一类是采用软件,比如 nginx 反向代理,通用的网关软件。负载均衡器最核心的就是算法,算法决定了请求会如何被分配,比如轮流分配,依据服务器的性能分配,依据工作量分配等。
    6. 高可用:系统必须保证在出现任何问题的情况下还能提供正常的服务。比如停电、电缆被破坏、自然灾害等,很多情况都会让系统无法提供服务。
      • 采用双机架构,分为主备和主从两种,主备要求所有的服务器都有备机,备机与主机的功能相同,当主机不能工作就切换到备机,主备可能不在同一位置。主从是两台机器同时工作,比如上面读写分离就属于这种。这两种都要求可以完成数据的复制。
      • 采用多机集群,这是大型系统广泛采用的,从机要能够知晓主机的状态,主机每隔一段时间向外发送一个信号表示自己仍然在工作,如果一段时间内从机未收到该信号,此时多台从机就要按照 zab 规则进行选举,确定出一台主机进行工作。所有的从机都有机会成为主机。实现该功能的软件有 zookeeper 等。
      • 分区,也属于多机集群的一种情形,包括机房、城市、国家等。
    7. 高扩展:系统的工作能力及功能的演化能够随着需求的变化而不断变化,在规模上能够不断的扩张,功能上能够不断的增强。
      • 分层架构,软件系统按照功能的划分分成多层,最典型的就是 mvc 的三层架构,三层可以各自独立扩展,可以增强扩展性。因此,具有高扩展的软件一定是分层架构,一般是在三层的基础上进行再细分,比较典型的就是 android 系统的架构。
      • SOA 架构,面向服务的架构,当系统的规模和功能足够大时,就会基于一个完整的系统进行拆分,按照横向分可以把业务层作为单一的服务,数据访问也可以作为单一服务,视图及控制器也可以划分出来,直到形成前后端分离的形式。这种架构的拆分是很灵活的,方式千变万化,总有一种是最合适的。在 java 技术栈,搭建 SOA 的架构需要用到分布式服务的管理和协调软件,还要用到服务的注册和发现中心,也需要服务的监控设施等。比较典型的软件就是 dubbo 来实现 RPC,另外一个就是 zookeeper(动物管理员)实现服务注册和发现及集群管理。第四阶段的第一个项目就是采用 SOA 的项目来实现的。
      • 微服务架构,SOA 用来打造分布式的系统,但是它的每个服务粒度较大,每个部分还可能包含了比较多的内容,会对项目的敏捷式开发,维护及布置造成麻烦。微服务架构的层次划分和模块划分更细,一个项目组只有两到三个人,负责设计其中的几个服务。服务的粒度较小,一个项目可以由几十个微服务组成,各个服务独立设计,向外提供接口供外部访问,每个服务都可以单独部署,也可以做成集群实现很好的高性能,高可用和高扩展。当服务划分过细后,服务间的访问就变得很复杂了。对于微服务来讲,在设计、运维、发布、维护等各方面都提供类似于自动化的工具,因此需要掌握众多的工具及中间件。

二、Linux 操作系统的安装与使用

  • 现在的应用软件及各种支持软件大多是安装在 linux 操作系统上运行的。原因在于 linux 系统内核小,运行稳定,速度快,功能非常服务,一般作为服务器的操作系统来使用的。window 适合做开发,使用方便。

猜你喜欢

转载自blog.csdn.net/qq_44628734/article/details/121053093
今日推荐