首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

(转载)初探ESB服务结合之演示

2013-06-26 
(转载)初探ESB服务组合之演示1.?前言本示例模拟一个业务场景,展示了如何使用Apusic ESB来进行业务组合的功

(转载)初探ESB服务组合之演示
1.?前言

本示例模拟一个业务场景,展示了如何使用Apusic ESB来进行业务组合的功能。

2.?开发环境

Apusic ESB 5.1 + Apusic 5.1 + Adminconsole5.1 +ApusicStudiom5 + xfire1.2.6 + axis1.4

3.?业务场景介绍

现在我们假设在北京有一家贷款中介公司,对外提供贷款服务。目前,有一个业务流程目前是这样的:

1)客户到柜台登记,提出贷款申请。

2)客服人员根据这个客户的ID,从现有系统中的“客户信用度”服务中,得到该客户的最大贷款额度。

3)然后,手工登录深圳某家银行,从银行对外公布的“贷款利率”服务中,得到该客户在深圳这家银行的贷款利率。

4)接着,仍然手工登录上海某家银行,从该银行对外公布的“贷款利率”服务中,得到该客户在上海这家银行的贷款利率。

5)得到这两个利率值后,使用该中介公司的另外一个系统的“利率比较”服务,获得该客户当前信用度下,能够贷款的最优利率。

这个业务流程中,大量的需要客服人员的手工操作,费时费力,而且容易出错,严重制约了该中介公司的业务发展需要,因此该公司认为,非常有必要对此进行基于SOA的业务整合。通过Apusic ESB,将现有业务进行整合,来达到这样一个目标:

1)客户到柜台申请,提出贷款申请。

2)客服人员登录系统,输入客户ID,系统直接返回最优利率。

4.?模拟已有的业务服务

在具体演示ESB的功能前,我们需要模拟一下北京中介,深圳银行和上海银行三个点已有的对外服务:

1)北京中介的对外webservice:客户信用度服务,利率大小比较服务。

2)深圳银行的对外webservice:贷款利率服务。

3)上海银行的对外webservice:贷款利率服务。

在我们的演示目录夹(yanshi)下有几个子目录,其中beijing,shanghai,shenzhen三个子目录分别模拟北京,上海和深圳的部署情况,各子目录路又分别部署了Apusic5.1和 Apusic ESB5.1,各自的已有的对外的WebService就部署在这些Apusicserver5.1上。(别忘了三个Apusic5.1分别设置不同的端口:6888,7888,8888)

(转载)初探ESB服务结合之演示

OK,下面我们就来建立这几个WebService,并发布部署在各自的Apusic5.1tp5上,用来模拟已有的4个业务服务。

2)注意,工程路径是放到$Apusic_Home/domains/mydomain/application目录下,这样可以作为一个Apusic应用,待会需要通过这个应用发布WebService。

?(转载)初探ESB服务结合之演示

?

3)因为我们使用xfire来发布webservice,所以,你需要下载xfire1.2.6解压,然后解压后根目录的xfire-all-1.2.6.jar其lib目录下所有的jar包,拷贝到该应用的WEB-INF/lib目录下。

4)然后,开始编写两个服务的代码:CreditService和CreditServiceImpl,FinanceService和FinanceServiceImpl

CreditService.java:

package demo;public interface CreditService { public float getMaxBalance(String name);}

CreditServiceImpl.java:

package demo;public class CreditServiceImpl implements CreditService { public float getMaxBalance(String name) {  System.out.println("信用服务:取得贷款最大贷款余额.");  if (name.equals("orange")) {   return 2000f;  } else if (name.equals("apple")) {   return 1888f;  } else if (name.equals("jack")) {   return 555f;  } else if (name.equals("rose")) {   return 100f;  } else {   return 0f;  } }}

代码比较简单,CreditServiceImpl就是根据客户ID,得到这个客户能够贷款的最大额度,例如orange这个客户,可以最大的贷款额度为2000元。

FinanceService.java

package demo;public interface FinanceService { public float calculate(float rate1,float rate2);}

FinanceServiceImpl.java

package demo;public class FinanceServiceImpl implements FinanceService { public float calculate(float rate1,float rate2){  System.out.println("资金服务:返回最小的贷款利率。");  return rate1<=rate2?rate1:rate2; }}

这个服务,就是传入两个利率比较大小,返回最小的一个。

5)services.xml

类写好了,我们需要把这个两个类发布成WebService,那么首先需要在WEB-INF/src目录下建立META-INF/xfire目录,并建立services.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://xfire.codehaus.org/config/1.0"><service> <name>CreditService</name> <namespace>http://www.beijing.com/CreditService</namespace> <serviceClass>  demo.CreditService </serviceClass> <implementationClass>  demo.CreditServiceImpl </implementationClass></service><service> <name>FinanceService</name> <namespace>http://www.beijing.com/FinanceService</namespace> <serviceClass>  demo.FinanceService </serviceClass> <implementationClass>  demo.FinanceServiceImpl </implementationClass></service></beans>

6)最后,修改web.xml为:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <description>XFire实例</description> <display-name>基于XFire框架发布Web服务的例子</display-name> <servlet>  <servlet-name>XFireServlet</servlet-name>  <servlet-class>   org.codehaus.xfire.transport.http.XFireConfigurableServlet  </servlet-class> </servlet> <servlet-mapping>  <servlet-name>XFireServlet</servlet-name>  <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping>  <servlet-name>XFireServlet</servlet-name>  <url-pattern>/services/*</url-pattern> </servlet-mapping></web-app>

7)好了,重启Apusic5.1服务器.

(转载)初探ESB服务结合之演示

8)我们就可以访问这个两个WebService的wsdl了。

a:http://localhost:6888/finance_house/services/CreditService?wsdl

(转载)初探ESB服务结合之演示

b:http://localhost:6888/finance_house/services/FinanceService?wsdl

(转载)初探ESB服务结合之演示

好了,这两个WebService就算发布成功了。

2)这个工程的路径应该放在表示上海的那个服务器的application目录中:

(转载)初探ESB服务结合之演示

3)同样的,拷贝xfire的相关jar包到该应用的WEB-INF/lib目录下。

4)然后,开始编写两个服务的代码:SHRateService和SHRateServiceImpl。

SHRateService.java:

package demo;public interface SHRateService { public float getRate(float money);}

SHRateServiceImpl.java:

package demo;public class SHRateServiceImpl implements SHRateService { public float getRate(float money) {  System.out.println("上海银行利率计算服务:取得当前贷款额度下的贷款利率.");  if (money >= 2000) {   return 0.01f;  } else if (money >= 1000) {   return 0.02f;  } else if (money >= 500) {   return 0.03f;  } else if (money >= 100) {   return 0.04f;  } else if (money > 0) {   return 0.05f;  } else {   return -1.0f;  } }}

代码也很简单,根据贷款的大小,返回不同的贷款利率,比如,如果贷款大于2000块,则利率为1%,如果是1000到2000块之间,则利率为2%等等,这是上海银行的利率情况。

FinanceService.java

package demo;public interface FinanceService { public float calculate(float rate1,float rate2);}

FinanceServiceImpl.java

package demo;public class FinanceServiceImpl implements FinanceService { public float calculate(float rate1,float rate2){  System.out.println("资金服务:返回最小的贷款利率。");  return rate1<=rate2?rate1:rate2; }}

这个服务,就是传入两个利率比较大小,返回最小的一个。

5)services.xml

同样的,首先需要在WEB-INF/src目录下建立META-INF/xfire目录,并建立services.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://xfire.codehaus.org/config/1.0"><service> <name>SHRateService</name> <namespace>http://www.shanghai.com/SHRateService</namespace> <serviceClass>  demo.SHRateService </serviceClass> <implementationClass>  demo.SHRateServiceImpl </implementationClass></service></beans>

6)web.xml和4.1节中描述的一样,就不重复写了。

7)OK,我们重启表示上海银行的Apusic5.1服务器.

(转载)初探ESB服务结合之演示

8)我们访问一下http://localhost:7888/bank_sh/services/SHRateService?wsdl

(转载)初探ESB服务结合之演示

好了,上海银行的也算发布成功了。

SZRateService.java:

package demo;public interface SZRateService { public float getRate(float money);}

SZRateServiceImpl.java:

package demo;public class SZRateServiceImpl implements SZRateService { public float getRate(float money) {  System.out.println("深圳银行利率计算服务:取得当前贷款额度下的贷款利率.");  if (money >= 2000) {   return 0.011f;  } else if (money >= 1000) {   return 0.019f;  } else if (money >= 500) {   return 0.031f;  } else if (money >= 100) {   return 0.039f;  } else if (money > 0) {   return 0.051f;  } else {   return -1.0f;  } }}

上面上海的是,如果贷款大于2000块,则利率为1%,而这里深圳银行的贷款利率是1.1%等等。

具体步骤参考上海的来进行就可以了,这里就不重复这些了。

5.?开始使用ESB 服务器

好了,上面的工作,其实是一个准备工作,即模拟原有业务流程中涉及到的4个具体已有业务服务,下面开始真正涉及到ESB。

注意,修改这几个esb服务器的配置(domains/mydomain/config/apusic.conf文件):.

1)修改默认的端口及SSL端口号分别为:2888/2889,3888/3889,4888/4889

2)RouterName分别是:

<ATTRIBUTE NAME="RouterName" VALUE="server_bj"/>

<ATTRIBUTE NAME="RouterName" VALUE="server_sh"/>

<ATTRIBUTE NAME="RouterName" VALUE="server_sz"/>

OK,三个点的ESB安装配置完成。

6.?ESB网络配置

OK,三个ESB服务器都起来了,AdminConsole5.1开始登场了,启动AdminConsole5.1,首先进行ESB网络配置:

1)打开“ESB网络管理”视图,右键“新建”->“ESB网络”.

(转载)初探ESB服务结合之演示

2) 在接下来的“新建ESB网络”向导中,填入相应的信息。

(转载)初探ESB服务结合之演示

3)点击“Finish”之后,然后双击“ESB网络演示”,然后,右键点击“ESB网络演示”,界面如下:

(转载)初探ESB服务结合之演示

4)登录成功的话,电脑会变亮。

(转载)初探ESB服务结合之演示

5)在右边的工具栏中单击“远程节点”,然后到设计界面上再点一下,会弹出“增加节点”的对话框,我们填入表示上海ESB服务器节点的信息:

(转载)初探ESB服务结合之演示

6)点击“OK”,之后,会出现表示上海的ESB节点的图标,并且是黑的,然后,通过右边工具的“路由连接”,在北京和上海两个节点上,拉上一条线,这个时候,ESB服务器会自动进行路由连接,过上几秒钟,如果连接成功,上海节点图标也会以高亮显示。

(转载)初探ESB服务结合之演示

7)同样的手法增加代表深圳的节点(注意端口号写4888,别忘了)。

(转载)初探ESB服务结合之演示

好了,ESB网络建立起来了,下面我们开始设计具体的业务组合服务的设计了。

7.?ESB服务组合设计

2)弹出一个对话框,点“Finish”。

(转载)初探ESB服务结合之演示

3)之后,我们进入服务组织的流程设计界面,下面我们开始设计新的业务流程。

2)在弹出的对话框中,按如下内容填写:

(转载)初探ESB服务结合之演示

3)点Finish,然后重复步骤1),把FinanceService也导入进来:

(转载)初探ESB服务结合之演示

4)下面在“server_sh”的“导入服务”上右键,然后选择“新建”->“导入服务”:

(转载)初探ESB服务结合之演示

5)导入上海银行的利率服务; 。

(转载)初探ESB服务结合之演示

6) 同样的手法,在“server_sz”的“导入服务中”,导入服务:

(转载)初探ESB服务结合之演示

2)在对话框中,填入:

(转载)初探ESB服务结合之演示

3)点击“Next”,出现增加参数和返回值的对话框,因为我们这个业务目标是这样的:客户输入ID后,得到最优(低)的贷款利率,所以这个服务的输入参数就是客户的ID,输入就是最优(低)的贷款利率,因此在这个对话框这样填入相应的值:

(转载)初探ESB服务结合之演示

4)点“Next”,出现上传Jar的对话框,因此我们没有使用复杂的自定义对象,所以,这里就不增加了,直接点“finished”。

(转载)初探ESB服务结合之演示

OK,经过导入和导出的步骤,我们左边的“ESB网络演示”看起来是这个样子(4个导入1个导出服务):

(转载)初探ESB服务结合之演示

参数name:用来作为节点credit的输入,也是整个流程的输入参数(start节点)

参数money:用来作为节点credit的输出,同时作为szrate和shrate两个节点的输入。

参数szrate是节点szrate的输出,并作为lowrate几点的输入参数之一。

参数shrate是节点shrate的输入,并作为lowrate节点的输入参数之一。

result是lowrate的输出参数,并且是整个流程服务的输出(start节点)。

2)选择credit节点,通过按钮来选择相应的参数和服绑定的服务:

(转载)初探ESB服务结合之演示

3)选择router节点,注意这个节点主要负责分支的走向,所以这个节点需要这是的是属性视图中的“合并与分支”的内容,选择“OR”类型,表示后续分支满足条件的都会走。

(转载)初探ESB服务结合之演示

4)szrate设置如下:

(转载)初探ESB服务结合之演示

5)shrate的节点设置如下:

(转载)初探ESB服务结合之演示

6)lowrate的节点设置如下

a)“任务配置”

(转载)初探ESB服务结合之演示

b)“合并与分支”

(转载)初探ESB服务结合之演示

因为lowrate是分支的汇合处,所以,这里需要指定合并类新,这里我们选择AND类型,表示流程到这里必须能带所有分支都走完,才继续后面的流程。

7)end节点不做任何设置。

2)然后,在下面的“同步服务组织”视图中,再右键点击“serviceOrg1”选择“提交到服务器”,在出现的对话框中点“OK”。

(转载)初探ESB服务结合之演示

OK,到这里为止,我们通过ESB的组合服务算是全部完成了,可以通过http://localhost:2888//newline/exports/LendService?wsdl来访问,验证一下这个服务是否整个发布在ESB上了,效果如下:

(转载)初探ESB服务结合之演示8.?客户端程序访问整合的业务服务

其实,演示到上面基本可以,不过为了演示更加完美,这里我们设计了一个访问了WebService的客户端,来真实的访问这个webservice。

1)在Apusicstudio中建立一个Java工程finance_client。(我这里的工程文件放在D:/network/supporter/trainings/SOA06SaiDi/yanshi/workspace/finance_client)

(转载)初探ESB服务结合之演示

2)这个客户端使用axis1.4的客户端桩形式访问webservice,先下载axis1.4并解压到硬盘某目录,然后拷贝lib目录下的jar包到该Java工程下的lib目录中。

3)然后再这个工程的src目录下,建立一个WSDL2Java.bat文件,文件内容为:

set Axis_Lib=D:/network/supporter/trainings/SOA06SaiDi/yanshi/workspace/finance_client/libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:/network/supporter/trainings/SOA06SaiDi/yanshi/workspace/finance_client/srcset Package=com.apusic.newline.exports%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% http://localhost:2888/newline/exports/LendService?wsdl

4)OK,运行cmd,在dos窗口下,执行一下这个bat文件,可以看到运行这个文件后,会在工程下生成一系列的类:

(转载)初探ESB服务结合之演示

5)然后,根据这些类,我们动手写一个Client.java

package demo;import java.rmi.RemoteException;import LendService.exports.newline.apusic.com.LendServicePortType;import LendService.exports.newline.apusic.com.LendService_Service;import LendService.exports.newline.apusic.com.LendService_ServiceLocator;public class Client { public static void main(String args[])   throws javax.xml.rpc.ServiceException, RemoteException {  LendService_Service service = new LendService_ServiceLocator();  LendServicePortType client = service.getLendServiceHttpPort();    String name = "apple";  float value = client.lendService(name);  System.out.println("尊敬的用户:"+name+",您最优的贷款利率是:"+value); }}

6)运行这个类,可以看到在后台的Apusic服务器上,各服务的调用:

(转载)初探ESB服务结合之演示

7)最终的运行结果为:

(转载)初探ESB服务结合之演示

8)可以看出apple这个用户的最优贷款利率是1.9%,这个时候,你可以从源代码入手,告诉用户这个0.019是否正确。

9)并且可以修改代码,把用户换成“orange”,再运行一下看效果:

(转载)初探ESB服务结合之演示

同样的,你可以再次通过源代码,告诉用户这个结果的正确性。

OK,一个基于SOA的企业整合的目标达到了。

9.?总结

本文初探了ApusicESB服务整合功能,希望起到抛砖引玉的作用,希望给大家带来一点帮助。

热点排行