王日磊,陈 奎,张娜娜
(航空工业西安航空计算技术研究所,陕西 西安 710000)
目前,面向服务的架构具有迅速上线、高可靠、服务间松耦合的优点。JAVA作为纯面向对象的语言使得开发人员更容易理解原始需求、编写程序,并且良好的可移植性可以减少后续的部署和运行压力;JAVA具备丰富的原生类库,可以提升开发人员开发效率;JAVA提供对Web应用开发的支持;JAVA具有较好的安全性和健壮性,所以结合JAVA和SOA架构开发的系统就具有良好的可移植性、高效的部署性等优点。本文基于SOA模型和J2EE技术设计并实现以服务为中心的项目管理系统。本文提出基于服务为中心的系统实现技术和方法,可以为其他以服务为中心的系统实现提供方法指导和借鉴。
本章节介绍面向服务架构和J2EE技术的概念及优点,为后续章节提供技术指导。
面向服务架构(Service-Oriented Architecture,SOA)虽然近几年被广泛应用于各行业的数字系统和平台建设中,但是SOA的思想已经在20世纪90年代就被Gartner(高德纳)全球最具权威的IT研究与顾问咨询公司提出来。当时各大企业都逐步建设或引入IT系统用于提升业务流程的效率,但是大多数IT系统均是定制化的,提供的功能和平台是绑定的。Gartner通过调研提出,对于商业或企业业务流程来说,IT系统的单元应该是服务,这个服务是独立的,不能与系统强耦合,只有这样,IT系统才具备更高的弹性能力。当前,服务化企业架构被广泛应用,IT系统提供的独立的服务可以快速满足企业的业务需求。同时,SOA也是一种系统模型,不同于传统以提供功能为主的系统模型,SOA模型是以服务为基础,这些服务既可以是单独面向用户的功能,又可以是不同应用程序一起联合提供的功能。在SOA模型中,可以通过定义高质量接口描述对这些功能定义为服务,再通过定义契约和规定将这些服务联系起来。因为这些服务是站在业务流程的角度定义的,所以并没有与底层的系统和平台紧耦合,这样的服务系统模型就可以满足现代业务流程经常发生变化的场景。因此,受市场情况、国家政策、第三方伙伴或其他各种因素的影响,都会导致业务流程频繁发生变更。
SOA具备两个基本特点。第一个特点是每个服务都是独立的业务实体。B/S架构因为其便利的访问特征,所以大多数IT系统均会提供Internet的访问机制,但网络环境的不可靠性,导致经常会发生丢包、断连等情况,使服务的稳定性受到很大的挑战。SOA认为,服务作为独立的业务实体,要能提供稳定可靠的访问,假如服务出现故障也能具备自我恢复的能力,结合常见的主备机制、集群化部署、事务处理等技术实现服务的稳定、独立运行。第二个特点是基于文本进行消息传递,在网络环境中,大量的系统的操作系统或设计不同,其架构均不一致,无法采用二进制进行消息传递,而且不同的操作系统、平台定义的数据也不相同,导致服务之间无法开展正常的消息传递,因为文本消息不涉及具体的处理逻辑,所以只能通过文本进行消息传递。
为了正常提供服务,SOA模型除定义服务之外,也描述了如何设计、部署和运行服务。其中,服务注册库用来登记和存储每个服务的描述信息。服务网关可以用来解决不同应用环境之间服务无法相互识别的问题。服务总线就像一条公共高速公路,为用户提供透明的服务。服务组装引擎是用来组装不同的服务,最终满足和完成实际的业务。服务运行环境是指管理服务部署、运行所需要的资源。
BS架构(浏览器和服务器架构模式)的系统是随着Internet技术的流行而被广泛应用,具备便利的访问性,同时服务器端承载业务和数据存储,减少了客户端的主机负载。为了实现BS架构,JAVA EE技术孕育而生,它能快速实现Web服务并尽快部署上线,同时因JAVA本身的优点使得基于J2EE开发出来的Web服务具备良好的移植性,为提供端到端的安全架构模型解决了Internet安全性问题。
J2EE的Web开发技术包括应用服务器运行各种Web应用,同时对EJB(Enterprise Java Beans,企业级应用程序的组件)、Servlet(小服务程序)、JSP(JAVA服务网页)、XML(可扩展标记语言)等技术予以全面支持。
(1)EJB,提供让客户端使用远程分布式对象的框架,极大地简化具有良好的可扩充性的企业级应用的开发。EJB组件结构是基于组件的分布式计算结构,是分布式应用系统中的组件。
(2)Servlet,一般被称为小服务程序或服务连接器,是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容[1]。
(3)JSP,是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者[2]。XML可扩展标记语言是标准通用标记语言,是一种允许用户定义标记源语言,支持标记数据、定义数据类型[3],XML具备扩展性良好、内容与格式松耦合、严格遵循语法等特点。
JAVA消息服务JMS(Java Message Service) 是Java提供的面向消息中间件(MOM)的API(应用程序编程接口),主要用来支持服务之间的异步通信。JMS支持发布/订阅模式和队列模式。其中,发布/订阅模式借鉴了现实生活中的出版社(发布图书)和读者(订阅图书),消息的消费者(读者)订阅自己关注的消息(图书)即可,消息生产者(出版社)生产(出版)消费者(读者)关注的新消息(新书) 后,会通知消费者(读者) 接受处理。在JMS发布/订阅模式中,通常以Topic(主题)标识消息,是一对多的模式,意味着同一个主题可以同时被多个消费者订阅和消费。在JMS队列模型中,通常以Queue name标识消息,是一对一的模型。在生产者和消费者都是在集群的环境中,通常需要将这两种模式结合使用,因此情况会复杂很多,而且需要考虑容错性、负载均衡、消息一致性、消息优先级等复杂的问题。
上文提出的面向服务架构,是针对高校中常见的项目管理系统进行分析,并且梳理了常见的基础业务服务概念。通常,项目系统需要确保项目工作端到端完成全程闭环管理,可以将系统功能划分为以下3个部分。
(1)任务计划。项目管理主要对任务进行管理,任务管理主要包含任务计划的管理。一是任务计划管理。其中,任务计划需要实现任务计划的分级管理,主要是为了解决多级任务矩阵关联问题。二是支持从任务导出项目,实现任务与项目的关联。三是有任务就需要进行任务推进、任务督办,所以任务需要在每个关键节点得到验证。四是任务计划存在不同的类别和优先级,所以任务计划需要划分为校级、部门级任务计划。五是任务计划需要实现对应的报表功能,主要包括任务月度、季度、年度报表展示及动态呈现。六是任务过程跟踪管理,主要包括任务进度管理、任务报送、任务完成情况及荣誉上报等功能。
(2)项目管理。完整的项目管理体系有助于在项目维度端到端跟踪项目的状态、监控项目的进展、识别项目的关键风险。针对项目维度的管理包括项目管理过程、项目范围定义与计划、项目进度管理、项目费用管理、项目质量管理、项目团队管理、项目信息管理、项目风险管理及分项管理。
(3)指标管理。项目管理需要有对应的指标评估项目的效果,所以需要支持指标管理,包括建立指标库及指标关联项目、任务,支持实时跟进项目、查看任务完成情况及指完成率。此外,指标库需要实现统计归类、查询、修改、维护、关联等功能,还需要细化指标类型(质量指标、数量指标、其他指标),基于季度、年度等不同的时间维度,分析基于指标类型的指标完成率。
基于SOA模型和J2EE技术,针对上述系统进行分析,可以将系统技术模型设计划分为服务运行时环境层、业务子系统、服务层、服务中心、服务引擎(如图1所示)。
图1 基于SOA模型的项目管理系统架构
(1)服务运行环境层。主要包含数据库、操作系统、Web运行容器、工作流引擎等。数据库采用MySQL数据库,MySQL数据库具有免费、开源、性能良好、支持多线程且占用资源少、安全可靠的特点,主要用于业务数据、服务数据的持久化存储,定义数据类型及数据之间的关系逻辑,同时为服务子系统、系统服务总线提供统一的数据库访问接口。
(2)操作系统。主要分为Linux和Windows,其中Linux主要运行系统服务端,包含Web服务器、工作流服务器等。Windows主要是客户在主机上通过浏览器访问系统的前台页面。Tomcat主要运行J2EE开发的各种Web服务器。Activiti是一个工作流引擎,支持参考实际业务流程将原来复杂的业务系统中的流程重新定义并运行,当后续实际业务流程发生变更时,只需要重新配置工作流,能提升系统的健壮性。Spring Cloud是许多框架的集合,主要基于Spring Boot降低分布式系统的基础平台开发难度,包含常见的服务发现、服务注册、消息总线等,可以较好地支持SOA模型开发。
(3)系统服务总线。主要用于异步通信场景,即消息发送后可以立即收到响应结果,区别于同步通信模式(消息发送后需要等待对端系统返回处理结果)。本系统主要采用ActiveMQ实现系统服务总线,ActiveMQ是目前业界比较流行的开源消息总线且支持JMS规范。
(4) 服务子系统。使用JavaSeverlet(JAVA服务程序技术)技术实现业务流程中最主要的4个子系统,即任务计划、项目管理、指标管理、考核管理。这些子系统主要是对业务逻辑进行封装和实现,并定义对应的调用接口供系统和服务总线调用。
(5)服务层。主要提供常见的公共服务,如日志服务、企业微信服务、告警等公共服务。与服务子系统不同的是,服务层主要关心公共的和经常被调用访问的服务,如果某业务服务需要经常被其他服务或第三方系统调用,就需要将这些服务放置在服务层。服务层也通过系统服务总线调用服务子系统。
(6)服务中心。使用Zookeeper(分布式应用程序协调服务)技术实现。Zookeeper可以解决分布式系统中多个进程之间的同步限制,防止出现脏读的协调服务,例如分布式锁。由于Zookeeper中的数据是存储在内存当中的,因此它十分高效。服务提供者需要向Zookeeper进行服务注册,服务提供者需要提供主机名、端口号、服务名称等。本地一般用Map缓存已经注册的服务,也可以用文件的形式保存到本地,当网络抖动等原因重新恢复连接Zookeeper时,需要从缓存取出重新注册。服务消费者向Zookeeper发出订阅请求服务提供者时,服务消费者在第一次收到服务提供的响应消息后,会将响应存入缓存中。如果再次请求相同的服务时,则不需要再次请求Zookeeper,可以直接访问缓存,提升了响应速度。如果后续服务提供者发生变更,服务消费者就会收到变更通知,此时重新请求并更新本地缓存。
(7)服务组装引擎层。主要使用Activiti(开源的自动化业务工作流引擎)技术实现,此时服务不同于技术实现层,是指现实业务流程,比如审批一个项目的端到端流程,使用Activity的流程设计器可定义业务流程,并标记对应调用的服务,定义数据可以持久化存储在MyBatis数据库中,同时Activiti可以与Spring进行良好的集成,也能很好地管理事务和表达式解析等。
(8) Portal(前台界面)。主要使用VUE框架实现,VUE是一款前端框架,去掉原来JavaScript中繁琐的DOM(文档对象模型)操作,提高代码编码速度。与MVC模型(模型-视图-控制器模型)能实现模型到视图的单向展示,VUE是基于 MVVM(Model—View—ViewModel,模型-视图-视图模型)模型,支持数据模型与视图的双向绑定,可以使开发者编程重点放在数据上,提升前台代码的质量和展示效果。
第三方系统和第三方数据库主要是指当前已经建设完成的系统和数据库。管理系统可以直接通过第三方服务开放的API进行服务访问,如果第三方服务是本校内建立的,可以考虑后续将其服务也注册到统一的服务中心,提升服务的管理和访问质量。第三方数据库可以通过数据库访问接口提供访问。
最终项目管理平台架构技术基于J2EE的Web技术和SOA模型,使用SpringCloud、Zookeeper、Activity、VUE等流程的技术和模架实现一个简单易用、多层次的安全设计、灵活的自定义、稳定可靠等特点的项目管理系统。
通过介绍SOA框架和J2EE的Web技术,提出基于J2EE的Web技术和面向服务框架的技术,针对常见项目管理系统的需求开展分析,引入业界流程的工作流、服务总线和前台框架技术,给出管理系统的设计模型,并基于以上技术最终实现一个面向服务的项目管理系统。此系统以服务为中心,具备快速上线、高可靠和服务间松耦合的特点。系统当前基于传统部署的方式开发与发布环境复杂,配置繁琐,下一步研究需要引入服务的容器化技术,并且实现环境和项目统一部署,快速迁移。