多层架构设计与实践

一、现有架构的问题

大型应用系统项目在安全性保障、灵活可扩展性、服务组件可管理可重用等方面提出了较高要求,而现有应用系统架构还不能满足这些需求,有待提升完善。先分析一下系统架构现状,物理架构和逻辑架构如下图所示:

 过1.png过2.png

由上图我们可看出这种架构主要有以下问题:

1、Web服务器安全性问题

现 有应用系统的后台服务程序安装部署在一台Web应用服务器上,也就是MVC的Action/Serivce/DAO三层都在一个War包中。Web应用服 务器部署在DMZ区,通过JDBC接口访问内网中的数据库服务器。一旦这台服务器被黑客攻击及获取了系统权限,则很容易通过SQL/JBDC接口侵入内网 数据库,窃取、篡改甚至销毁关键数据资料。因而,从安全性考虑,需要将接入/交互层与应用服务(含DAO)层进行物理架构分离、分区部署,以保障数据库系 统安全。

2、紧耦合性问题

现在的架构方式虽然在开发上已经有分层,现在也按MVC的方式进行构架,但在应用服务组件化、Web services松耦合性方面欠缺架构设计,为团队分工开发、局部功能模块优化升级、分布式部署带来了一些制约问题。

3、应用服务扩展性问题

在现有架构基础上进行应用服务扩展,从界面到DAO层都要有改动,各层都有牵制影响。因而,需要基于SOA松耦合架构设计思想,将应用服务(含DAO层)分离出来实现服务组件化,基于服务注册/发现机制以及服务总线ESB协调,实现动态服务扩展、灵活组合调用。

二、架构改进设计方案

1、合理分层设计

现有的架构设计已经有了清晰的分层设计,只是在部署及代码组织结构上耦合的比较紧,我们就在这二个方面进行封装后解耦合。在物理部署上,将接入/交互层与应用服务(含DAO)层进行拆分,如下图所示:

 过3.png

为了增强系统安全性和接入服务性能,引入接入/交互服务器,在这个服务器上专门用来部署与UI相关的应用(War包),包括HTML/CSS/JS和具有安全策略功能(防SQL注入、防篡改)的Action(JavaBean)。

通过对代码结构进行调整后,接入/交互服务器有多种调优方式,比如可加入页面静态化处理提升性能,增加缓存机制,提高用户体验。在配置上也比之前安全和轻很多,有关数据库访问方面的配置都放到内网的应用服务器上。

现有系统按下图方式重新组织构建,即可实现接入/交互层、应用服务层的物理分离及分服务器部署;服务请求方统一以HTTP/JSON接口调用RESTful Web Services服务。

 过4.png

远程调用实例参考如下:其中Action和 Service分别布署在不同的服务器上。

过8.png

注:这种方式适用于现有基于Spring框架构建的应用系统;若是异构系统,建议使用SOAP协议实现WebServices方式发布服务。

2、安全机制设计

我们可以借鉴WSDL和SOAP的Web Service安全规范来指导RESTful Web服务实现认证、授权、身份管理等安全需求。

为保证RESTful Web服务的安全性,设计考虑:

对客户端做身份认证;

对敏感的数据做加密,并且防止篡改;

身份认证之后的授权。

对客户端做身份认证,有几种常见的做法:

1) 在请求中加签名参数:

  l 为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中 必须加上签名参数;

  l 在实际项目中一般是设计动态加密种子数生成动态密钥,使每一次URL访问都有安全签名,很好的防止一个URL信息在不同的浏览器中可用。

       2) 对敏感的数据做加密,并且防止篡改,做法如下:

  l 部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如用户编号+密码),并加入某种随机数作为加密钥,以防范数据被篡改;

  l 身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,可采用Shiro框架实现授权,也可以自定义来实现相关功能。

三、基于SOA架构的服务发布注册/查找机制

基于SOA架构设计理念,实现应用服务组件化并达到服务组件最大化重用目的,这就需要设计一套服务管理平台功能,包括服务发布/注册、服务查找、服务监控等功能。

下图描述了服务发布及注册、服务查找及服务调用的过程:

过9.png

在此架构中有三类角色:服务提供者、服务注册中心、服务消费者。

1、服务提供者

服务提供者作为服务提供方,将自身的服务信息注册到服务注册中心,服务信息包含:

隶属于哪个系统

服务的IP,端口

服务的请求URL

服务的权重等等

2、服务注册中心

服务注册中心主要提供所有服务注册信息的中心存储,同时负责将服务注册信息的更新通知实时Push给服务消费者(主要是通过zookeeper的Watcher机制来实现的)。

3、服务消费者

服务消费者主要职责如下:

1、  服务消费者在启动时从服务注册中心获取需要的服务注册信息;

2、  将服务注册信息缓存在本地;

3、监听服务注册信息的变更,如接收到服务注册中心的服务变更通知,则在本地缓

存中更新服务的注册信息;

4、根据本地缓存中的服务注册信息构建服务调用请求,并根据负载均衡策略(随机负载均衡,策略负载均衡等)来转发请求;

5、对服务提供方的存活进行检测,如果出现服务不可用的服务提供方,将从本地缓存中剔除。

服务消费者只在自己初始化以及服务变更时会依赖服务注册中心,在此阶段的单点故障通过zookeeper集群来进行保障。在整个服务调用过程中,服务消费者不依赖于任何第三方服务。

四、总结

本文从提高系统安全性以及实现应用服务组件化的角度出发,提出了应用系统多层架构设计方案及实践方法,并对Web服务安全、服务发布注册/查找机制提出了实现方法建议,供产品设计开发和项目实施人员参考。

个人资料
Tony
等级:6
文章:20篇
访问:2.5w
排名: 19
推荐圈子
上一篇: 大型网站的灵魂——性能
下一篇:模块度与Louvain社区发现算法
猜你感兴趣的圈子:
系统架构圈
标签: 注册、应用服务、篡改、消费者、dao、面试题
隐藏