抽象之虚拟层

计算机领域有句话:“计算机的任何问题都可以通过增加一个虚拟层来解决”。另言之:"All problems in computer science can be solved by another level of indirection"。其主要思想是将调用者和被调者隔离开,既屏蔽细节,又提高了灵活性。由于标准统一在此处收口,因此又提高了效率与安全性。

这个思想在计算机硬件、计算机网络、计算机网络无不如此。计算机网络的7层协议,每一层都可以看做下一层的虚拟层;计算机操作系统可以看作计算机硬件的虚拟层;JVM可以看作是操作系统的虚拟层;分层的计算机软件架构事实上也是利用虚拟层的概念;开启了云计算时代的Virtual Machine是bare metal/host OS的虚拟层(上层是不同的guest OS)。

这个思想在生活中也是经常见到。例如:集装箱的引入大大提升了全球化的效率。原来的货物都是杂乱的堆在车里或船里,而集装箱将货物和承载货物的工具分离开,大大提高了运输的效率,还增强了安全性。

有的人也许觉得集装箱不算什么大发明。但事实上它的标准化能大大提升效率。之前看到SAP的基础引擎提供了一套标准化的插件机制,所有的产品都是基于一个统一的插件开发平台,每一个产品都是一个插件,每一个插件都按照名字约定好了。大家都遵守这个简单的“共识”插件架构进行开发与维护,效率大大提升。这正是SAP基础引擎平台的神奇之处。背后的道理与集装箱是一样的。

道理非常简单,似乎人人都懂,但做起来并不那么简单。知道系统里哪个部分需要动手术加一层indirection,考量的是能力、经验和智慧。展开来说一下:

第一、抽象能力。计算机的任何问题都可以通过增加一个虚拟层来解决,这一虚拟层为什么要加,加在哪里?需要“抽象”。抽象是简化问题、解决问题的核心,也是设计的精髓。为什么要抽象?抽象能带来间接(Indirection),能隔离变化,间接能控制依赖方向,间接能提供扩展性。
比如:SOA也是这样的抽象和屏蔽实现的思想。插件框架也是用OSGi框架作为中间层来向上层屏蔽实现的细节,而ORM是对数据库的抽象。

第二、业务能力。业务理解深刻了,逻辑清晰了,自然就知道哪里经常变化,哪里可以进行共性的提炼。举个栗子:你经常写网页,后来发现数据与显示分离的好处,并且设计出MVC模式。因此,好的抽象与架构是不断对业务进行分析和思考而获取的。架构源于分析,而非设计。分析源于对业务的深刻理解。要想获得可扩展性,你需要看得远一点,对上下文做充分的了解。

第三、性能。分层的优点在于,依赖方向得到最好的控制,而且代码复用高、耦合低。每个层次有自己的核心问题,比如引擎这一层就是做一些业务无关的功能,比如渲染器、物理引擎。比如框架层就是为业务支撑的,着眼于开发效率。但随之而来的问题是多引入一层虚拟层带来的系统性能瓶颈问题如何解决。这个考验功底了。

最后要提醒的是,增加虚拟层也许会有一些副作用,最有名的是污水池反模式(architecture sinkhole anti-pattern).这个反模式是这样的,请求流简单的穿过几个层,每层里面基本没有做任何业务逻辑,或者做了很少的业务逻辑。比如一些JavaEE例子,业务逻辑层只是简单的调用了持久层的接口,本身没有什么业务逻辑。这其实是一种形而上学。本文强调的是一种思想,切记!

原文:抽象之虚拟层

时间: 2024-10-16 09:06:38

抽象之虚拟层的相关文章

网络虚拟化之FlowVisor:网络虚拟层(下)

在前面两篇文章:网络虚拟化之FlowVisor:网络虚拟层(上)和网络虚拟化之FlowVisor:网络虚拟层(中)中分别介绍了FLowVisor的特性和实现,三连载的最后一篇介绍虚拟网络的隔离机制. 虚拟化的一个重要元素是切片之间的隔离,因为不同资源的隔离机制是不相同的,接下来将分别描述. 1. 带宽隔离 FLowVisor可以通过标记数据包的VLAN优先级比特位来利用现存的交换机带宽隔离特性.VLAN标签拥有三个比特域,PCP(VLAN Priority Code Point)有一个将数据包映

使用Ninject+Moq在单元测试中抽象数据访问层

一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑 二.步骤如下 2.1 定义数据访问接口和实现 public interface IDBAccess { List<string> GetList(string request); } public class DBAccessImp : IDBAccess { public List<string> Ge

什么是真正的软件定义数据中心?

目前,IT基础设施及其运营越来越复杂,人们通常采用云计算和虚拟化技术来满足各种业务需求.在过去的十年里,服务器虚拟化重新部署.管理以及优化了计算资源,将数据中心转化成为一个更加灵活高效的业务应用平台.专用服务器被动态托管之后,在虚拟服务器环境中能够根据需求运行应用程序. 虽然虚拟化重塑数据中心的运营,企业能够部署机架服务器汇集和分配应用程序的需求,但这种转变并不完整理.数据中心网络和存储资产仍然保持着孤立和静态配置,很少有设施能够自动化统筹管理混合网络和存储硬件. 软件定义的数据中心(SDDC)

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

数据库抽象层PDO

PDO(PHP Data Object),数据库访问抽象层,统一各种数据库的访问接口. PDO特性:编码一致性.灵活性.高性能.面向对象特性. PDO只是一个抽象的接口层,本身并不能操作数据库. 一.PDO安装与配置 1.配置PHP配置文件,开启相应扩展 extension = php_pdo.dll 2.开启响应数据库扩展 extension = php_pdo_mysql.dll 3.通过查看phpinfo可以看到PDO扩展的详细信息 二.PDO连接数据库 1.通过参数的形式连接数据库[建议

使用PS制作简单的抽象光教程

抽象光的制作在广告.海报.游戏场景设计中特别多,这类唯美的光线制作也是学PS时首要掌握的难点.当初,你只能拿着PS做照片美化的时候,你只把PS当成美图秀秀用,而等你学会了抠图,就为下一步要 进阶合成技术做了准备.我们今天要学的抽象光,也是在进阶合成技术的过程中必备的另一项技能. 一.抽象光背景 抽象光的背景一般来说是黑色.(请问:为什么不能是白色背景?)你见过白天的月亮吗?同样道理,光本身有趋于“白”的本质,如果四周都充斥着白色,那么这道光也就没有存在的必要了. 好了,现在让我们打开photos

mask层--- ios开发view圆角属性的layer层的实质

今天突然领悟了之前学习的一些基础的UI属性 就是在我们设置view的圆角的时候 比方说下面的代码 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 60, 60)]; button.layer.masksToBounds = YES; button.layer.cornerRadius = 30; 这里给button设置圆角属性 以前一直这么写 知道layer是view的绘制的一层 一直这么用 今天突然领悟

MyBatis知多少(7)持久层

持久层是适合使用MyBatis的地方.在面向对象的系统中,持久层主要关注对象(或者更精确地说应该是存储在那些对象中的数据)的存取.在企业应用程序中持久层通常用关系数据库系统来存储数据,虽然某些情况下其他持久的数据结构或者介质也可能使用.如某些系统就可能会使用简单的以逗号分隔数据的平板文件或XML文件.考虑到企业应用程序的持久化策略往往具有异质性,因此持久层需要关注的第二个问题就是抽象.持久层应该隐藏关于数据如何被存储以及如何被取出的所有细节.这样的细节决不能暴露 给应用程序的其他层. 为更好地理

四层and七层负载均衡

四层负载/七层负载 在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同? 废话不多说,详解如下: 1.    什么是负载均衡 1)负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间:其次,单个重负载的运算分担到多台节