(转载)初探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)
OK,下面我们就来建立这几个WebService,并发布部署在各自的Apusic5.1tp5上,用来模拟已有的4个业务服务。
2)注意,工程路径是放到$Apusic_Home/domains/mydomain/application目录下,这样可以作为一个Apusic应用,待会需要通过这个应用发布WebService。
?
?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服务器.
8)我们就可以访问这个两个WebService的wsdl了。
a:http://localhost:6888/finance_house/services/CreditService?wsdl
b:http://localhost:6888/finance_house/services/FinanceService?wsdl
好了,这两个WebService就算发布成功了。
2)这个工程的路径应该放在表示上海的那个服务器的application目录中:
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服务器.
8)我们访问一下http://localhost:7888/bank_sh/services/SHRateService?wsdl
好了,上海银行的也算发布成功了。
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网络”.
2) 在接下来的“新建ESB网络”向导中,填入相应的信息。
3)点击“Finish”之后,然后双击“ESB网络演示”,然后,右键点击“ESB网络演示”,界面如下:
4)登录成功的话,电脑会变亮。
5)在右边的工具栏中单击“远程节点”,然后到设计界面上再点一下,会弹出“增加节点”的对话框,我们填入表示上海ESB服务器节点的信息:
6)点击“OK”,之后,会出现表示上海的ESB节点的图标,并且是黑的,然后,通过右边工具的“路由连接”,在北京和上海两个节点上,拉上一条线,这个时候,ESB服务器会自动进行路由连接,过上几秒钟,如果连接成功,上海节点图标也会以高亮显示。
7)同样的手法增加代表深圳的节点(注意端口号写4888,别忘了)。
好了,ESB网络建立起来了,下面我们开始设计具体的业务组合服务的设计了。
7.?ESB服务组合设计2)弹出一个对话框,点“Finish”。
3)之后,我们进入服务组织的流程设计界面,下面我们开始设计新的业务流程。
2)在弹出的对话框中,按如下内容填写:
3)点Finish,然后重复步骤1),把FinanceService也导入进来:
4)下面在“server_sh”的“导入服务”上右键,然后选择“新建”->“导入服务”:
5)导入上海银行的利率服务; 。
6) 同样的手法,在“server_sz”的“导入服务中”,导入服务:
2)在对话框中,填入:
3)点击“Next”,出现增加参数和返回值的对话框,因为我们这个业务目标是这样的:客户输入ID后,得到最优(低)的贷款利率,所以这个服务的输入参数就是客户的ID,输入就是最优(低)的贷款利率,因此在这个对话框这样填入相应的值:
4)点“Next”,出现上传Jar的对话框,因此我们没有使用复杂的自定义对象,所以,这里就不增加了,直接点“finished”。
OK,经过导入和导出的步骤,我们左边的“ESB网络演示”看起来是这个样子(4个导入1个导出服务):
参数name:用来作为节点credit的输入,也是整个流程的输入参数(start节点)
参数money:用来作为节点credit的输出,同时作为szrate和shrate两个节点的输入。
参数szrate是节点szrate的输出,并作为lowrate几点的输入参数之一。
参数shrate是节点shrate的输入,并作为lowrate节点的输入参数之一。
result是lowrate的输出参数,并且是整个流程服务的输出(start节点)。
2)选择credit节点,通过按钮来选择相应的参数和服绑定的服务:
3)选择router节点,注意这个节点主要负责分支的走向,所以这个节点需要这是的是属性视图中的“合并与分支”的内容,选择“OR”类型,表示后续分支满足条件的都会走。
4)szrate设置如下:
5)shrate的节点设置如下:
6)lowrate的节点设置如下
a)“任务配置”
b)“合并与分支”
因为lowrate是分支的汇合处,所以,这里需要指定合并类新,这里我们选择AND类型,表示流程到这里必须能带所有分支都走完,才继续后面的流程。
7)end节点不做任何设置。
2)然后,在下面的“同步服务组织”视图中,再右键点击“serviceOrg1”选择“提交到服务器”,在出现的对话框中点“OK”。
OK,到这里为止,我们通过ESB的组合服务算是全部完成了,可以通过http://localhost:2888//newline/exports/LendService?wsdl来访问,验证一下这个服务是否整个发布在ESB上了,效果如下:
8.?客户端程序访问整合的业务服务其实,演示到上面基本可以,不过为了演示更加完美,这里我们设计了一个访问了WebService的客户端,来真实的访问这个webservice。
1)在Apusicstudio中建立一个Java工程finance_client。(我这里的工程文件放在D:/network/supporter/trainings/SOA06SaiDi/yanshi/workspace/finance_client)
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文件,可以看到运行这个文件后,会在工程下生成一系列的类:
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服务器上,各服务的调用:
7)最终的运行结果为:
8)可以看出apple这个用户的最优贷款利率是1.9%,这个时候,你可以从源代码入手,告诉用户这个0.019是否正确。
9)并且可以修改代码,把用户换成“orange”,再运行一下看效果:
同样的,你可以再次通过源代码,告诉用户这个结果的正确性。
OK,一个基于SOA的企业整合的目标达到了。
9.?总结本文初探了ApusicESB服务整合功能,希望起到抛砖引玉的作用,希望给大家带来一点帮助。