2.2. 模块结构
系统是一个整体,它具有整体性的目标和功能,但这些目标和功能的实现又是由相互联系的各个组成部分共同工作的结果。人们在解决复杂问题时使用的一个很重要的原则,就是将它分解成多个小问题分别处理,在处理过程中,需要根据系统总体要求,协调各业务部门的关系。在SD中,这种功能分解就是将系统划分为模块,模块是组成系统的基本单位,它的特点是可以自由组合、分解和变换,系统中任何一个处理功能都可以看成一个模块。模块如下:
(1)信息隐蔽与抽象
信息隐蔽原则要求采用封装技术,将程序模块的实现细节(过程或数据)隐藏起来,对于不需要这些信息的其他模块来说是不能访问的,使模块接口尽量简单。
(2)模块化
在 SD方法中,系统由多个逻辑上相对独立的模块组成,在模块划分时需要遵循如下原则:
- 模块的大小要适中
- 模块的扇入和扇出要合理
- 深度和宽度适当
(3)耦合
耦合表示模块之间联系的程度。紧密稠合表示模块之间联系非常强,松散稠合表示模块之间联系比较弱,非稠合则表示模块之间无任何联系,是完全独立的。模块的稠合类型通常分为七种,根据藕合度从低到高排序如下表所示。
(5)模块类型
在系统结构图中不能再分解的底层模块称为原子模块。如果一个系统的全部实际加工(数据计算或处理)都由底层的原子模块来完成,而其他所有非原子模块仅仅执行控制或协调功能,这样的系统就是完全因子分解的系统。如果SC是完全因子分解的,就是最好的系统。一般而言,在系统结构图(SC)中存在四种类型的模块如下图所示。
3.4. 面向对象设计的原则
- 单一职责原则:设计目的单一的类
- 开放-封闭原则:对扩展开放,对修改封闭
- 李氏(Liskov)替换原则:子类可以替换父类
- 依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
- 接口隔离原则:使用多个专门的接口比使用单一的总接口要好
- 组合重用原则:要尽量使用组合,而不是继承关系达到重用目的
- 迪米特(Demeter)原则(最少知识法则):一个对象应当对其他对象有尽可能少的了解
4. 设计模式
4.1. 设计模式概述
设计模式包含模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式等基本要素,其中的关键元素包括以下四个方面:
(1)模式名称。给模式取一个助记名,用一两个词语来描述模式待解决的问题、解决方案和使用效果,以便更好地理解模式并方便开发人员之间的交流。
(2)问题。描述应该在何时使用模式,即在解决何种问题时可使用该模式。
(3)解决方案。描述设计的组成成分、它们之间的相互关系及各自的职责和楠刁乍方式。模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供一个问题的抽象描述和具有一般意义的元素组合(类或对象组合)。
(4)效果。描述模式应用的效果以及使用模式时应权衡的问题,即模式的优缺点。
设计模式相关的概念:
架构模式:软件设计中的高层决策。例如C/S结构就属于架构模式,架构模式反映了开发软件系统过程中所作的基本设计决策。
设计模式:主要关注软件系统的设计,与具体的实现语言无关
惯用法:是最低层的模式,关注软件系统的设计与实现,实现时通过某种特定的程序设计语言来描述构件与构件之间的关系。每种编程语言都有它自己特定的模式,即语言的惯用法。例如引用-计数就是C++语言中的一种惯用法。
4.2. 设计模式的分类
根据目的和用途不同,设计模式可分为创建型(creational)模式、结构型(structural)模式和行为型(behavioral)模式三种。创建型模式主要用于创建对象,结构型模式主要用于处理类或对象的组合,行为型模式主要用于描述类或对象的交互以及职责的分配。
具体内容如下图所示:
(2)结构型模式
6. Web开发
Web开发相关技术如下:
从架构来看:MVC,MVP,MWM,REST,Webservice,微服务。
从缓存来看:MemCache, Redis, Squid。
从并发分流来看:集群(负载均衡)、CDN。
从数据库来看:主从库(主从复制),内存数据库,反规范化技术,NoSQL,分区(分表)技术,视图与物化视图。
从持久化来看:Hibernate,Mybatis。
从分布存储来看:Hadoop, FastDFS,区块链。
从数据编码看:XML,JSON。
从Web应用服务器来看:Apache,WebSphere,WebLogic,Tomcat,
JBOSS,IIS。
其它:静态化,有状态与无状态。响应式Web设计。
6.1. 负载均衡技术
- 基于特定软件的负载均衡(HTTP重定向)(应用层)
- 反向代理负载均衡(应用层)
- 基于DNS的负载均衡(传输层)
- 基于NAT的负载均衡(传输层)
- 混合型负载均衡
- 静态算法:轮转算法、加权轮转算法、源地址哈希散列算法、目标地址哈希散列算法、随机算法
- 动态算法:最小连接数算法、加权最小连接数算法、加权百分比算法
- 硬件负载均衡:F5
- 软件负载均衡:LVS、Nginx、HAproxy
6.1.1. 应用层负载均衡
1、HTTP重定向。HTTP重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群。
特点:实现简单,但性能较差。
2、反向代理服务器。在用户的请求到达反向代理服务器时(已经到达 站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache, nginx都可以充当反向代理服务器。
特点:部署简单,但代理服务器可能成为性能的瓶颈。
6.1.2. 传输层负载均衡
1、DNS域名解析负载均衡。DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP。
特点:效率比HTTP重定向高,减少维护负载均衡服务器成本。但一个应用服务器故障,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商那里, 站无法做更多的改善和更强大的管理。
2、基于NAT的负载均衡。基于NAT的负载均衡将一个外部IP地址映射为多个IP地址,对每次连接请求动态地转换为一个内部节点的地址。
特点:技术较为成熟,一般在 关位置,可以通过硬件实现。像四层交换机一般就采用了这种技术。
6.2. 有状态与无状态
无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任伺信息。
有状态服务(statefulservice)则相反,它会在自身保存一些数据,先后的请求是有关联的。
6.3. 缓存技术
MemCache:Memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负载。Memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Redis:Redis是一个开源的使用ANSIC语言编写、支持 络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Squid:Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP 协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/0驱动的进程来处理所有的客户端请求。
Redis与Memcache的差异如下:
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。他们都支持key-value数据类型。同时Memcache还可用于缓存其他东西,例如图片、视频等等,Redis还支持list、set、hash等数据结构的存储。
2、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。Memcache挂掉之后,数据就没了。
3、灾难恢复-Memcache挂掉后,数据不可恢复;Redis数据丢失后可以恢复。
4、在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcache相比一个最大的区别。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。
5、Redis在很多方面支持数据库的特性,可以这样说他就是一个数据库系统,而Memcache只是简单地K/V缓存。
所以在选择方面如果有持久方面的需求或对数据类型和处理有要求的应该选择Reddis。如果简单的key/value存储应该选择Memcache。
6.4. CDN(内容分发 络)
CDN的全称是Content Delivery Network,即内容分发 络。其基本思路是尽可能避开互联 上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
6.5. XML与JSON
扩展标记语言(Extensible Markup Language,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML的优点:
- 格式统一,符合标准;
- 容易与其他系统进行远程交互,数据共享比较方便。
XML的缺点:
- XM L文件庞大,文件格式复杂,传输占带宽;
- 服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
- 客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
- 服务器端和客户端解析XML花费较多的资源和时间。
JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。
JSON的优点:
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
- 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP,Python, Ruby等服务器端语言,便于服务器端的解析;
- 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
JSON的缺点:
没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性。
6.6. WEB应用服务器
WEB应用服务器可以理解为两层意思:
(1)WEB服务器:其职能较为单一,就是把浏览器发过来的Request请求,返回Html页面。
(2)应用服务器:进行业务逻辑的处理。
Apache:Web服务器,市场占有率达60%左右。它可以运行在几乎所有的Unix、Windows、Linux系统平台上。
IIS:早期Web服务器,目前小规模站点仍有应用。
Tomcat:开源、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。
JBOSS:JBOSS是基于J2EE的开放源代码的应用服务器。一般与Tomcat或Jetty绑定使用。
WebSphere:一种功能完善、开放的Web应用程序服务器,它是基于Java的应用环境,用于建立、部署和管理Internet和Intranet Web应用程序。
WebLogic:BEA WebLogic Server是一种多功能、基于标准的web应用服务器,为企业构建自己的应用提供了坚实的基础。
Jetty:Jetty是一个开源的servlet容器,它为基于Java的web容器。
6.7. REST(表达性状态传递)
REST (Representational State Transfer,表述性状态转移)是一种只使用HTTP和XML进行基于Web通信的技术,可以降低开发的复杂性,提高系统的可伸缩性。
REST的5个原则:
(1) 络上的所有事物都被抽象为资源。
(2)每个资源对应一个唯一的资源标识。
(3)通过通用的连接件接口对资源进行操作。
(4)对资源的各种操作不会改变资源标识。
(5)所有的操作都是无状态的。
6.8. 响应式Web设计
响应式WEB设计是一种 络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的布局。
方法与策略:
(1)采用流式布局和弹性化设计:使用相对单位,设定百分比而非具体值的方式设置页面元素的大小。
(2)响应式图片:不仅要同比的缩放图片,还要在小设备上降低图片自身的分辨率。
相关资源:实例讲解分布式缓存软件Memcached的Java客户端使用-其它代码类…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!