精通SOA基于服务总线的Struts+EJB+WebService整合应用开发(实例精通SOA网上书店系统实现)

精通SOA基于服务总线的Struts+EJB+WebService整合应用开发(实例精通SOA网上书店系统实现)

目前全球最大的软件服务商IBM在实施SOA方面一直处于领先地位,因此通过介绍如何用IBM的服务总线产品来构建SOA架构更能使开发人员把握SOA的精髓。

服务总线是实现SOA架构最核心的部分,它将对系统内部或者外部的各种服务进行集成和管理。目前IBM基于企业服务总线的产品有Websphere 6.0上自带的SIBus(Service Integration Bus),由于它已经和Websphere集成在一起,从而使它可以应用Websphere所带有的各种资源。从对这个产品的实施中,我们可以观察到它实施服务总线(ESB)架构的技术思路主要是通过消息引擎来驱动的。SIBus比BEA的Aqulogic服务总线多了一个消息层,也就是读者将要在下面章节中看到的目标(Destination),SIBus是通过消息队列Queue或者Topic等来实现的。这是服务总线中最核心的部分,笔者十分看好其技术前景。本章将通过一个网上书店的实例详细介绍如何基于IBM Websphere SIBus服务总线来构建SOA架构体系的整合应用,包括下面几个方面的内容。

l               基于企业服务总线SIBus构建SOA架构的基本原理。

l               创建网上书店系统的DB2数据库。

l               创建网上书店系统的组件架构。

l               创建网上书店的实际业务流程和实现步骤。

l               在Websphere RAD创建网上书店的业务模型服务组件,包括Session Bean、CMP和Web Service。

l               详细介绍构建基于SIBus服务总线的SOA架构的服务集成系统的步骤。

l               介绍如何实现服务总线和Struts用户界面的集成。

8.1        基于企业服务总线SIBus构建SOA架构的基本原理

以服务为导向的SOA架构体系是通过业务来驱动的,它通过业务来驱动服务,再通过服务来驱动技术。所以本节首先介绍网上书店系统的业务需求;接下来介绍网上书店系统的SOA实施,主要是如何划分服务接口,以形成一个松散耦合的服务系统;进一步介绍本章基于企业服务总线SIBus实现SOA的架构体系。

 

精通SOA网上书店系统实现之(1-4)

8.1.1        网上书店系统业务需求

网上书店系统的业务需求如下。

有一家大型的图书公司希望进一步拓宽市场渠道,计划创建一个自己的网上书店。这个网上书店主要包括下面几个子系统功能,下面从大的方面来介绍一下此网上书店系统应有的功能。

l               注册系统:用于用户注册和保存用户信息。

l               登录系统:用于用户登录校验。

l               用户查询系统:用来查询系统里有多少用户。

l               账户管理系统:用于管理用户资金账户,以便实现网上交易。

l               图书管理系统:用来管理系统中的图书,主要是往系统里加入新书。

l               图书查询系统:提供界面以便用户查询系统中的图书。

l               购物车:创建用户购书订单,实现实时网上交易。

上面只是这家图书公司对网上书店的功能需求,这家公司的其他业务考量如下。

公司下面有3个独立的部门:图书管理部门、客户管理部门和销售部门。每个部门都有自己一套独立的IT系统,提供自己独立的服务。

从成本和时间的角度出发,这家公司希望能重用3个部门的业务服务系统,将它们整合起来,快速创建一个网上书店。

由于内部工作业务的关系,每个部门的服务器的地址可能会经常发生改变;另外也由于内部业务工作的需要,每个部门服务接口方法的名字可能会发生变化,以客户身份校验为例,checkUser可能会变为checkLogin等。处于业务工作的需要,这3个部门要隐藏自己的服务器的地址和传输协议,不希望被外部用户直接访问到。

最后所开发成功的网上书店系统如图8-1所示。

图8-1        网上书店系统主页

8.1.2        网上书店系统SOA实施

SOA实施规划是最关键的。SOA的出发点完全不同于现有的建模和组件的出发点。现有的软件实施也是实际项目中的真实情况:软件的设计和开发人员在拿到业务需求后,马上就会想到是不是需要用到Struts的MVC架构,是用EJB还是用Hibernate,要不要用Web Service,使用什么样的应用服务器和数据库的服务器等。然后开始建模,并用程序设计语言和业务分析人员进行沟通,最后将业务需求分散为很多业务小点,一个个塞到各个软件模块之中。这样使得业务处于一个从属于技术和模块之下的地位,业务和技术紧紧地捆绑在一起。

笔者在做项目的过程中,深深体会到各个企业其实非常不希望自己的业务和技术紧密地捆绑在一起,它们非常担心它们所选中和应用的技术一旦被淘汰了,它们的业务服务也会跟着被淘汰。

SOA实施是以业务服务为导向的,业务服务独立于技术之上,技术处于从属的地位,一旦某种技术过时了,企业的业务服务可以很快切换到其他新的技术。

下面是SOA实施的过程。

(1)根据前述的SOA的第一个标准,结合图书公司的现状,将网上书店的业务分散为3个松散耦合的子服务系统,每个子服务系统中的服务可以是相关的,但是每个子服务系统之间完全是松散耦合的。实际上是3个服务接口:图书管理服务接口、客户管理服务接口和订单服务接口。

(2)从现有的3个部门的IT服务中整理和归纳出相应的服务接口方法,根据前述的SOA的第二个标准,这些服务接口的方法是粗粒度的,最接近实际业务服务本身。如图8-2所示为服务接口方法划分。

图8-2        根据SOA的要点划分服务接口

上面已经完成了本章8.1.1节所述的SOA的两个要点,剩下的要点3就需要服务总线来完成了。

8.1.3        基于企业服务总线SIBus的网上书店SOA架构

在完成上面的SOA实施的两步后,包括一系列的数据库开发、EJB开发后(后面章节将详细介绍),3个服务接口将会产生3个独立的服务接口,独立运行。具体来说,这里将产生3个独立的Web Service服务接口;然后将3个服务接口加入SIBus服务总线,通过服务总线将3个服务接口进行整合,所有的网上书店业务请求都通过Struts Web应用发给服务总线,服务总线根据不同请求,进行相应的转换;再判断不同的请求类型,路由给不同的服务接口。

这里的3个服务的具体实现、位置和传输协议对调用者来说都是透明的,因为前台Web应用只和SIBus服务总线打交道,把所有的业务请求都发给服务总线SIBus,完全不知道这3个具体服务的存在。此外SIBus还提供了消息中介的功能,如有需要,可以对输入参数、传输协议和返回结果根据业务需要进行相应的修改。这样就实现了前述的SOA要点3。

此外,SIBus可以对所提供的服务进行监控和监听,并能以入站服务的方式将所提供的服务以标准的Web Service发布给外部,并提供相应的WSDL文件。图8-3是本章实例所实现的基于企业服务总线SIBus的网上书店SOA架构。在这个架构中,服务总线上的端点监听器将负责接收所有的客户端的请求消息,它实际上是对应的入站服务。由于事先在创建入站服务时已经创建了它在接收请求消息时所要转向的目标,所以请求消息将会转给目标,目标在收到请求消息后通过事先创建的默认转发路由路径转给出站服务,出站服务将请求消息转给外部服务提供者,这里的外部服务接口分别为图书管理服务接口、用户管理服务接口和订单管理服务接口。具体的实现步骤后面将会详细介绍。

图8-3        本章实例所实现的SOA服务总线架构图

以上已经完成了网上书店系统的SOA实施和架构,下面的章节将详细介绍具体的实现过程。

8.2       创建网上书店系统的DB2数据库

数据库是网上书店系统的底层,用来持久保存网上书店系统的所有相关业务数据,这里首先予以介绍。

8.2.1       创建数据库的脚本

下面是在DB2创建数据库表结构的详细脚本,参见如下代码。

-- 1. 创建表bk_sequence_num,用来保存其他表的最大主键值

create table bk_sequence_num (

         index_num       int not null default 0,            --主键,必填,默认值为0

         max_user_id int not null default 0,          --最大用户序号,必填,默认值为0

         max_book_id int not null default 0,          --最大图书序号,必填,默认值为0

         max_account_id int not null default 0, --最大用户账户序号,必填,

                                                       默认值为0

         max_order_id int not null default 0,         --最大购书序号,必填,默认值为0

                                                    --定义index_num为主键

         constraint pk_sequence_num primary key (index_num)

);

-- 2. 初始化表bk_sequence_num

insert into       bk_sequence_num values(0,0,0,0,0); --将所有的初始序号都定为0

-- 3. 创建表book,用来保存图书的信息

create table book (

         book_id       int not null default 0,                  -- 图书号,必填,默认值为0

         book_name varchar(50) not null,                   -- 图书名,必填

         book_content varchar(750) not null,              --图书内容,必填

         author       varchar(20),                                  --笔者

         press varchar(50),                                    --出版社

         publishing_date        date,                              --出版日期

         ISBN        varchar(20),                                   --书号

         unit_price       decimal(10,2) not null,               --单价

         discount decimal(10,2) not null,                   -- 折扣

         constraint pk_book primary key (book_id)         -- 定义book_id为主键

);

-- 4. 创建表order,用来保存用户每次购买的总的信息,如总价等

create table order (

         order_id int not null default 0,             --购书号,必填,默认值为0

         userid int not null,                            --用户号,必填

         total_price decimal(10,2),                    --总价

         tax        decimal(10,2),                                 --税

         order_time timestamp,                          --购买时间

         constraint pk_order primary key (order_id),        --定义order_id为主键

         -- 定义userid为外键

         constraint fk_order foreign key (userid) references user (userid)

)

-- 5. 创建表order,用来保存用户每次购书的购书明细,每一种书的购买情况

create table order_item (

         order_item_num       int not null, -- 购书明细号,必填

         order_id int not null,                -- 购书号,必填

         book_id int not null,                 -- 图书号,必填

         quantity int not null,                -- 对应于一种书的数量,必填

discount decimal(10,2),                --对应于一种书的折扣

         --定义order_id和order_item_num为主键,此表有多个主键

         constraint pk_order_item primary key (order_id,order_item_num),

         constraint fk_order1 foreign key (order_id) references

              order(order_id),                 --定义外键

         --定义外键

         constraint fk_order2 foreign key (book_id) references book(book_id)

    

)

-- 6. 创建表user,用来保存用户的相关信息   

create table user (

         userid int not null,                     --用户号,必填

         login_name varchar(20) not null,        --用户登录名,必填

         name varchar(50) not null,               --用户姓名,必填

         password varchar(20),                      --用户登录密码

         phone varchar(20),                          --用户的电话号码

         email varchar(20),                          --用户email

         createTime TIMESTAMP default current timestamp,-- 用户的创建时间

         constraint pk_user primary key (userid),              -- 定义userid为主键

    

);

-- 7. 创建表account,用来保存用户账户的相关信息

create table account (

         accountid int not null,                      -- 账户号

         userid       int not null,                         -- 用户号

         registrationFee decimal(10,2) not null,-- 注册费、资金结余

         --定义accountid和userid为主键,此表有多个主键

         constraint pk_account primary key (accountid,userid),

         --定义外键

         constraint fk_account foreign key (userid) references user (userid)

);

8.2.2       数据库的ERWin数据库图

ERWin是实际项目中最常用的数据库表结构关系的设计工具,下面介绍基于ERWin的数据库图,它包括物理(Physical)图,即实际的数据库图;逻辑(Logical)图,即逻辑的易懂的视图。

1.物理(Physical)图

本章的数据库的ERWin物理图如图8-4所示,它是数据库的真实反映。

图8-4       数据库的ERWin物理图

2.逻辑(Logical)图

本章的数据库ERWin的逻辑图如图8-5所示,它可以让开发者更好地理解业务,和真实的数据库表是一一对应的关系。

图8-5       数据库ERWin的逻辑图

8.2.3       在DB2上创建数据库表

本章所创建的数据库表如图8-6到图8-10所示。

(1)USER表——记录用户详细信息

图8-6       DB2的USER表

(2)ACCOUNT表——记录用户资金账户信息

图8-7       DB2的ACCOUNT表

(3)BOOK表——记录图书的详细信息

图8-8       DB2的BOOK表

(4)ORDER表——记录用户每次购买的总的信息

图8-9       DB2的ORDER表

(5)ORDER_ITEM表——记录用户每次购买的详细信息

图8-10       DB2的ORDER_ITEM表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值