

















有关架构的概念和其重要性此处就不再详细讨论了,在很多社区和书籍中都有介绍过。在这里推荐两本书,分别是《企业应用架构模式》和《Microsoft.NET企业级应用架构设计》,其中,第二本适合.NET开发人员来看。另外,选择不同的网站 后台语言就意味着不同的架构路线和不同的开发框架,我们使用的开发语言和相关软件技术,已经在第二章中有过介绍。
互联网项目(门户、社区、电商等)在初期架构阶段,首先,要分清楚项目所针对的人群有哪些,并根据需求分析和上线后的推广力度来估算有多大的访问量;然后, 负责架构的人员根据这些资料设计架构粒度。现在投资互联网项目的成本都很大,已经不像几年前买个虚拟主机就可以搞定了。所以,前期一般不会把架构搭的很 大,或者买很多服务器来支撑这个架构。但是我们可以根据需求设计一套可灵活扩展的架构,然后根据项目的市场发展状况来扩展架构,两位圈内名人曾讲过这样的话:
本章分别从“物理架构”和“逻辑架构”两方面来描述目前项目的架构设计。
我理解的物理架构也可以称之为宏观架构,主要包括硬件与网络的部署策略、整体架构硬件的可伸缩性、安全以及性能上分析。下图是目前项目的逻辑架构视图,此图虽没有把相关扩展点画出来,但是会给大家介绍哪些是可以在后期进行扩展。

关于客户端缓存应该属于网站优化方面的知识,随着互联网技术的发展和客户端浏览器的支持,有效的利用客户端缓存可以为服务器减少很大的压力。客户端浏览器根据每个HTTP请求的Header信息来决定当前请求的资源是否需要缓存,目前项目的客户端缓存分为“动态页面”和“静态资源”两种:
有关“静态资源”在客户端缓存的强制更新,可以通过版本号的形式来强制更新客户端缓存,比如:
<script src="http://sta01.xxx.com/common.js?t=20120105111111.js"></script>
硬件防火墙的主要功能可以参考百度百科,这里介绍此项目正在使用的几个主要功能:
注:在购买防火墙时,要根据需求查看防火墙所支持多大的“吞吐量”,因为它是测量防火墙性能的重要指标。
公网千兆交换机
当外网请求过来时,防火墙会把其转换为内网请求,通过公网千兆交换机访问具体内网服务器,根据IDC提供的带宽,这里配置“千兆”已足够。
内网存储交换机
目前所有服务器都会有一块网卡接着内网存储交换机(万兆),服务器上的所有数据(除系统文件和程序文件)都是通过“iSCSI”协议存储到“存储设备”上的。
一个网站最重要的就是Web服务器,因为它会把数据转换为页面(HTML)返回给浏览者,这种说法仅限于目前的环境。在SNS区,Web服务器后面是由多台应用程序服务器组成。为了减少成本,现在项目只有一台Web服务器,但是此台服务器上运行了多个站点和服务,后期可以根据访问量,把这些站点和服务扩展到 另外的服务器上。此台服务器的系统环境和所运行的服务如下:
为了方便扩展,不同的站点都由不同的域名划分,同时也运行在不同的应用程序池当中。需要注意的是,Web服务器不会存储任何有关共享资源和用户的相关数据,所有资源都是通过绝对路径访问其它服务器上的内容,这样就方便以后为某个站点或服务增加负载均衡。有关负载均衡可以通过软件(Nginx)、硬件(F5) 或DNS轮循等几种方案来实现,因为硬件比较贵,所以我们在内部针对Nginx做过测试,在分离以上站点时,可以正常运行。很多大型站点是采用“混合型负载均衡”——以上几种方案都会使用。如果考虑到今后会使用负载均衡,在初期架构时,就要首先解决所有和状态有关的问题,比如用户登陆和验证码状态,在我们 SNS区架构时,就要考虑采用专门的状态服务器来存储这些内容。
301跳转:很多网站都会申请一些保护域名,并把这些域名转向到主域名上,我们的解决方案是在IIS上建立多个空站点,然后设置所有请求都转向到主域名站点上。
下面分享一些关于IIS7配置方面的资料:
当网站没有应用缓存时,每一个动态页面的访问请求,都需要通过连接数据库,执行相关数据查询,最后返回给客户端。这样无疑增加了服务器的压力,并且数据库连接是相对耗时的操作。在服务器端可以通地以下方式实现缓存:
缓存模块设计
在设计缓存模块时,我们定义一系列的缓存操作接口,使用者(Web服务器)并不清楚缓存模块当前所采用的是哪种缓存方案,使用者只需要调用具体的方法来管理缓存。缓存模块在初始化时会根据配置文件来决定当前系统需要使用哪种缓存方案,目前系统支持ASP.NET Cache、Memcache、Redis三种缓存策略,三种缓存策略在不同的部署环境都有各自的优势。
缓存策略
缓存是一个好东西,但是如果我们错误的使用了它,就会带来意想不到的麻烦。在实践当中,我总结了以下常见的注意事项:
目前网站的数据存储在一台数据库服务器上,采用 “SQLServer 2008 Enterprise Edition (64-bit)”数据库。考虑到后期的扩展,前期规划时需要完成以下工作:
安全设置
在开放的互联网环境中,互联网项目第一个要谈的就是安全问题,根据项目的不同,安全的侧重点也不一样。在保证操作系统本身的权限划分和漏洞升级后,在“第六章、内部测试”会讨论网站程序所需要的安全测试。在保证网站程序没有安全问题外,还要保证数据库服务器的访问安全性,我们分别从以下几个方面来确保数据库 服务器(SQL Server)的安全性。
备份机制
SQL Server已经具备了很强的备份功能,可以设置作业进行定时备份,根据需求选择具体备份策略,具体操作可以参考这篇文章“SQL Server 维护计划实现数据库备份”。
数据镜像和同步
当网站“主数据库服务器”发生问题后,网站程序需要自动切换到另外一台正常工作的数据库服务器,这时可以采用主从数据库镜像的方案,网站程序的数据库访问组 件只需要配置主数据库的连接字符串,就可以做到主从镜像自动切换,具体配置方法可考MSDN或者“SQL Server 2005 镜像构建手册”。如果只是需要在主数据库服务器发生问题后,手动切换或者开启另一台工作的数据库服务器,可以采用数据库复制的方案,具体配置方法参考“通过SQL Server 2008数据库复制实现数据库同步备份”。
前端优化中最好做的就是动静分离,在前期项目规划时就应该在内部搭建动静分离的开发环境,在项目中采用绝对路径和前端进行协作开发。如果前期只有一台服务器,可以在服务器上建立多个站点存放静态资源。静态资源服务器可以采用的CentOS系统,使用高性能的Nginx作为Web服务器。
缓存和压缩
调整Nginx的配置,为静态资源增加客户缓存输出,并且可以把静态资源存入到Nginx内存当中,当然也可以使用Squid来做。关于静态资源的压缩,推 荐使用“UI Compressor、Google Closure Compiler)”。如果有更高的区域性需求,可以使用第三方 CDN来做。
独立图片浏览服务器原因同上,图片浏览对于内容型网站来说是很重要的功能,在前期规划时需要注意以下事项:
基于安全和程序架构的原因,内容区前台和后台项目是分开部署的,并且采用不同的开发框架。内容区后台是单独部署在一台服务器上,管理员需要通过VPN才能登陆管理后台,并且后台采用HTTPS登陆。
以上所有服务器的数据存储都分为两种:
单独的存储设备是防止服务器系统或者服务器硬件坏掉时,不需要单独从硬盘中把数据复制出来的麻烦,只需要启动一台新服务器连接到内部存储设备就可以正常运行了。
远程管理卡
主要方便“运维”通过远程监控服务器(开机、关机)的重启过程,当然也可以远程管理操作系统。
管理工作站
一台远程管理服务器,安装 “VMware”系统,虚拟化了多个操作系统,方便安装相关监控和日志分析软件。
摄像头
监控机柜在IDC机房的动静。
逻辑架构从某种程度来看是物理架构的实现,但不仅限于此。它需要考虑功能的重用性与可扩展性、服务接口的定义,并定义整个系统的架构风格。
在分解复杂的软件系统时,软件设计者用得最多的技术之一就是分层。当用分层的观点来考虑系统时,可以将各个子系统想像成按照“多层蛋糕”的形式来组织,每一 层都依托在其下层之上。在这种组织方式下,上层使用了下层定义的各种服务,而下层对上层一无所知。另外,每一层对自己的上层隐藏其下层的细节。——《企业应用架构模式》
一般软件系统都是有“表现层”、“领域层”、“数据源层”组成,当然我们的系统也是:

公共类库
统一公共类库的目的是为了方便团队使用一致的“公用方法”,所有能提练出来并与业务逻辑无有关系的“公用方法”。公共类库与业务逻辑无关,公司的所有开发小组都可以使用,并长期对它进行维护。在开发公共类库时注意以下几点:
目前项目的公共类库包括:工具函数库、Web请求处理库、XML操作库、IO操作库、脚本输出辅助库、常用算法库(加密、过滤等)。
系统日志
在第三章的功能介绍中,已经详细介绍了日志系统的功能和作用,系统日志项目的具体设计如下:

系统配置
访问配置文件的接口,详细功能在第三章有介绍。
数据缓存
上一节介绍了缓存的具体设计,数据缓存项目的具体设计如下:

内容区前台(ASP.NET MVC)
ASP.NET WebForm的缺点在网上也都有讨论,目前很多采用ASP.NET的互联网项目都是自己来实现“HttpHandler”做项目,不再使用ASP.NET自带的页面模型。微软也已经意识到了这个问题,这才有了ASP.NET MVC框架,ASP.NET MVC主要取代项目中的表现层,下面分享我们用它都做了什么:
内容区后台(ASP.NET WebForm)
ASP.NETWebForm自有它的缺点,当然也有它存在的优点,合理的使用可以有效的提高开发效率和代码重用。
处理领域逻辑的常见方法是将领域层再细分成两层。服务层独立出来,置于底层的领域模型或表模块之上。通常只有使用领域模型或表模块时才会这样细分,因为仅使用事务脚本的领域层并不复杂,没有必要再单独设服务层。表现逻辑与领域层的交互完全通过服务层,就好像应用程序的API一样。——《企业应用架构模式》
从逻辑架构视图上可以很清楚看到,内容区前台和后台的服务层架构也是不同的,前台的服务层主要有“ViewModels”和“Business logic”组成,而后台只有“Business logic”,后台很多页面逻辑已经在“Code-behind”中完成了。
在“第五章迭代开发”会分享服务层的一些最佳实践。
数据库访问层是完成服务层的具体实现,执行相关的存储过程或脚本命令,并以表模块或者对象(Data Mappings)的形式返回给服务层。如果项目有“读写分离”需求,就需要根据具体的业务逻辑在数据访问层把具体的操作路由到具体的数据库服务器,可以 通过调用数据库访问组件来实现,但前提是数据库访问组件必须支持多台数据库的操作。
注意:所有数据库访问操作都必须采用参数化传递,防止SQL注入,采用using来使用DataReader对象。
在项目中,数据库访问组件也属于“基础设施层”,因为它是一个统用的组件。在项目中,并没有采用第三方ORM框架来实现数据库访问,主要是为了后期扩展考虑,使用ADO.NET可以灵活的实现读写分离、负载均衡,也方便日志记录和异常信息的捕获。
在开发数据库访问组件时,需要以下注意事项:
本系列目录:2011 年终项目总结
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。