一、现有架构的问题
大型应用系统项目在安全性保障、灵活可扩展性、服务组件可管理可重用等方面提出了较高要求,而现有应用系统架构还不能满足这些需求,有待提升完善。先分析一下系统架构现状,物理架构和逻辑架构如下图所示:
由上图我们可看出这种架构主要有以下问题:
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)层进行拆分,如下图所示:
为了增强系统安全性和接入服务性能,引入接入/交互服务器,在这个服务器上专门用来部署与UI相关的应用(War包),包括HTML/CSS/JS和具有安全策略功能(防SQL注入、防篡改)的Action(JavaBean)。
通过对代码结构进行调整后,接入/交互服务器有多种调优方式,比如可加入页面静态化处理提升性能,增加缓存机制,提高用户体验。在配置上也比之前安全和轻很多,有关数据库访问方面的配置都放到内网的应用服务器上。
现有系统按下图方式重新组织构建,即可实现接入/交互层、应用服务层的物理分离及分服务器部署;服务请求方统一以HTTP/JSON接口调用RESTful Web Services服务。
远程调用实例参考如下:其中Action和 Service分别布署在不同的服务器上。
注:这种方式适用于现有基于Spring框架构建的应用系统;若是异构系统,建议使用SOAP协议实现WebServices方式发布服务。
2、安全机制设计
我们可以借鉴WSDL和SOAP的Web Service安全规范来指导RESTful Web服务实现认证、授权、身份管理等安全需求。
为保证RESTful Web服务的安全性,设计考虑:
l 对客户端做身份认证;
l 对敏感的数据做加密,并且防止篡改;
l 身份认证之后的授权。
对客户端做身份认证,有几种常见的做法:
1) 在请求中加签名参数:
l 为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中 必须加上签名参数;
l 在实际项目中一般是设计动态加密种子数生成动态密钥,使每一次URL访问都有安全签名,很好的防止一个URL信息在不同的浏览器中可用。
2) 对敏感的数据做加密,并且防止篡改,做法如下:
l 部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如用户编号+密码),并加入某种随机数作为加密钥,以防范数据被篡改;
l 身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,可采用Shiro框架实现授权,也可以自定义来实现相关功能。
三、基于SOA架构的服务发布注册/查找机制
基于SOA架构设计理念,实现应用服务组件化并达到服务组件最大化重用目的,这就需要设计一套服务管理平台功能,包括服务发布/注册、服务查找、服务监控等功能。
下图描述了服务发布及注册、服务查找及服务调用的过程:
在此架构中有三类角色:服务提供者、服务注册中心、服务消费者。
1、服务提供者
服务提供者作为服务提供方,将自身的服务信息注册到服务注册中心,服务信息包含:
l 隶属于哪个系统
l 服务的IP,端口
l 服务的请求URL
l 服务的权重等等
2、服务注册中心
服务注册中心主要提供所有服务注册信息的中心存储,同时负责将服务注册信息的更新通知实时Push给服务消费者(主要是通过zookeeper的Watcher机制来实现的)。
3、服务消费者
服务消费者主要职责如下:
1、 服务消费者在启动时从服务注册中心获取需要的服务注册信息;
2、 将服务注册信息缓存在本地;
3、监听服务注册信息的变更,如接收到服务注册中心的服务变更通知,则在本地缓
存中更新服务的注册信息;
4、根据本地缓存中的服务注册信息构建服务调用请求,并根据负载均衡策略(随机负载均衡,策略负载均衡等)来转发请求;
5、对服务提供方的存活进行检测,如果出现服务不可用的服务提供方,将从本地缓存中剔除。
服务消费者只在自己初始化以及服务变更时会依赖服务注册中心,在此阶段的单点故障通过zookeeper集群来进行保障。在整个服务调用过程中,服务消费者不依赖于任何第三方服务。
四、总结
本文从提高系统安全性以及实现应用服务组件化的角度出发,提出了应用系统多层架构设计方案及实践方法,并对Web服务安全、服务发布注册/查找机制提出了实现方法建议,供产品设计开发和项目实施人员参考。