现在我们假设在北京有一家贷款中介公司,对外提供贷款服务。目前,有一个业务流程目前是这样的:
1)客户到柜台登记,提出贷款申请。
2)客服人员根据这个客户的ID,从现有系统中的“客户信用度”服务中,得到该客户的最大贷款额度。
3)然后,手工登录深圳某家银行,从银行对外公布的“贷款利率”服务中,得到该客户在深圳这家银行的贷款利率。
4)接着,仍然手工登录上海某家银行,从该银行对外公布的“贷款利率”服务中,得到该客户在上海这家银行的贷款利率。
5)得到这两个利率值后,使用该中介公司的另外一个系统的“利率比较”服务,获得该客户当前信用度下,能够贷款的最优利率。
这个业务流程中,大量的需要客服人员的手工操作,费时费力,而且容易出错,严重制约了该中介公司的业务发展需要,因此该公司认为,非常有必要对此进行基于SOA的业务整合。通过Apusic ESB,将现有业务进行整合,来达到这样一个目标:
1)客户到柜台申请,提出贷款申请。
2)客服人员登录系统,输入客户ID,系统直接返回最优利率。
在具体演示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个业务服务。
4.1.北京中介:客户信用度服务和利率比较大小服务
1)在ApusicStudio中建立一个Tomcat工程:finance_house。
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就算发布成功了。
1)同样,在ApusicStudio中建立一个Tomcat工程:bank_sh。
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%等等。
具体步骤参考上海的来进行就可以了,这里就不重复这些了。
好了,上面的工作,其实是一个准备工作,即模拟原有业务流程中涉及到的4个具体已有业务服务,下面开始真正涉及到ESB。
首先,首先是拷贝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安装配置完成。
目前使用的ESB服务器启动命令和服务器的一样,通过domains\mydomain\bin\startapusic.cmd命令启动。现在,我们把三个ESB都启动起来。
如果你的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网络建立起来了,下面我们开始设计具体的业务组合服务的设计了。
1)在“ESB网络演示”上右键点击“北京”节点的“服务组织”,选择“新建”->“服务组织”。
2)弹出一个对话框,点“Finish”。
3)之后,我们进入服务组织的流程设计界面,下面我们开始设计新的业务流程。
根据我们新的业务流程,我们从右边的工具栏上拉出如下节点,并命名如下:
start和end分别是新的业务服务的起点和终点。
credite节点是信用判断服务节点,这里我们打算调用现有系统中已有的“信用判断服务”。
szrate节点是深圳银行的利率计算,这里我们打算把深圳银行现有的利率计算服务组合进来。
shrate节点是上海银行的利率计算,这里我们打算把上海银行的现有利率计算服务组合进来。
lowrate节点是利率大小比较,这里也组合现有中介服务公司现有的服务。
因为流程从credite节点到szrate和shrate是分支,因此增加一个router节点,这个节点的作用是进行一个流程判断。
增加各节点完毕后,我们通过右边工具栏的“连接”线,把这个新的业务流程串起来:
1)在“ESB网络管理”视图中,右键点“北京”的“导入服务”,选择“新建”->“导入服务”:
2)在弹出的对话框中,按如下内容填写:
3)点Finish,然后重复步骤1),把FinanceService也导入进来:
4)下面在“server_sh”的“导入服务”上右键,然后选择“新建”->“导入服务”:
5)导入上海银行的利率服务; 。
6) 同样的手法,在“server_sz”的“导入服务中”,导入服务:
OK,现在4个已有的服务已经导入到服务总线中了,因为我们的目的是整合这些服务从而构成一个新的服务,因此我们还需要“导出服务”,以便外部客户端能够访问这个新的组合业务服务。
1)在“ESB网络演示”的“北京”节点的“导出服务”上点击右键,然后“新建”->“导出服务”:
2)在对话框中,填入:
3)点击“Next”,出现增加参数和返回值的对话框,因为我们这个业务目标是这样的:客户输入ID后,得到最优(低)的贷款利率,所以这个服务的输入参数就是客户的ID,输入就是最优(低)的贷款利率,因此在这个对话框这样填入相应的值:
4)点“Next”,出现上传Jar的对话框,因此我们没有使用复杂的自定义对象,所以,这里就不增加了,直接点“finished”。
OK,经过导入和导出的步骤,我们左边的“ESB网络演示”看起来是这个样子(4个导入1个导出服务):
现在,我们看到已经有4个导入服务和1个导出服务,我们可以看到这些服务的方法都是由输入和输入参数的,现在我们把它们组织到一个流程里面,那么,在这个流程上,一定是要有数据进行传递的,否则,下一个节点的输入从何而来,所以,我们需要定义一些上下文参数,供这些流程中的节点进行调用。
在设计界的空白处点击一下,然后在“Properties”视图的“上下文参数”中点击“增加”来增加5个参数:
参数name:用来作为节点credit的输入,也是整个流程的输入参数(start节点)
参数money:用来作为节点credit的输出,同时作为szrate和shrate两个节点的输入。
参数szrate是节点szrate的输出,并作为lowrate几点的输入参数之一。
参数shrate是节点shrate的输入,并作为lowrate节点的输入参数之一。
result是lowrate的输出参数,并且是整个流程服务的输出(start节点)。
现在,我们看到已经有4个导入服务和1个导出服务,并且设置了上下文参数,现在我们就可以把这些导入导出的服务以及上下文参数设置到这些业务流程中的各个节点中了。
1)选择start节点,属性设置如下:
2)选择credit节点,通过按钮来选择相应的参数和服绑定的服务:
3)选择router节点,注意这个节点主要负责分支的走向,所以这个节点需要这是的是属性视图中的“合并与分支”的内容,选择“OR”类型,表示后续分支满足条件的都会走。
4)szrate设置如下:
5)shrate的节点设置如下:
6)lowrate的节点设置如下
a)“任务配置”
b)“合并与分支”
因为lowrate是分支的汇合处,所以,这里需要指定合并类新,这里我们选择AND类型,表示流程到这里必须能带所有分支都走完,才继续后面的流程。
7)end节点不做任何设置。
OK ,服务组织中的业务流程设计到这里我们已经基本完成,下面需要把设计好的流程上传到服务器中。
1)在“ESB网络演示”视图中的“北京”的“服务组织”中点击右键,选择“同步”
2)然后,在下面的“同步服务组织”视图中,再右键点击“serviceOrg1”选择“提交到服务器”,在出现的对话框中点“OK”。
OK,到这里为止,我们通过ESB的组合服务算是全部完成了,可以通过http://localhost:2888//newline/exports/LendService?wsdl来访问,验证一下这个服务是否整个发布在ESB上了,效果如下:
其实,演示到上面基本可以,不过为了演示更加完美,这里我们设计了一个访问了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\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:\network\supporter\trainings\SOA06SaiDi\yanshi\workspace\finance_client\src
set 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的企业整合的目标达到了。
相关推荐
【WSO2 ESB服务编排】是企业级服务总线(Enterprise Service Bus)中的一种重要功能,它允许开发者通过组合、路由、转换和管理多个服务来创建复杂的业务流程。WSO2 ESB是开源软件供应商WSO2提供的中间件产品,它作为...
【普元ESB服务总线产品】是一款由普元公司推出的高效、稳定且灵活的企业级服务整合工具,旨在帮助企业构建和实现面向服务的架构(SOA)。该产品以服务总线的形式,解决企业内部和外部系统间的交互问题,优化了传统...
企业服务总线ESB技术设计方案 企业服务总线(Enterprise Service Bus,ESB)是一种软件架构模式,旨在提供一个集成的平台,用于集成企业内部的各种应用系统、服务和数据资源。ESB技术设计方案的目的是为了提供一个...
企业服务总线(ESB)架构介绍 企业服务总线(Enterprise Service Bus,ESB)是传统中间件技术与XML、Web服务等技术结合的产物,提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。ESB中间件产品利用的...
企业服务总线(Enterprise Service Bus,ESB)是一种架构模型,它可以将松散耦合的应用服务或业务模块进行分布式部署、组合和使用。ESB是基于开放的标准,服务的接口描述与具体实现无关,灵活的架构,可以满足不同...
【WSO2 ESB服务总线部署与使用详解】 WSO2 ESB(Enterprise Service Bus,企业服务总线)是一款开源的服务中介软件,用于集成和管理企业应用之间的通信。然而,由于WSO2 ESB产品已被整合进WSO2 Enterprise ...
**企业服务总线(ESB)详解** 企业服务总线(ESB)是现代企业级IT架构中的核心组件,它作为一个集成平台,旨在促进不同系统之间的通信和数据交换。ESB的概念源于20世纪90年代末,随着企业对集成各种异构系统的需求...
在软件开发中,企业服务总线(Enterprise Service Bus,ESB)是一种架构模式,它提供了一种在分布式系统中集成和交互服务的方式。C#中的Remote技术是.NET框架提供的一个关键组件,用于实现跨进程通信,它在ESB中扮演...
企业服务总线(Enterprise Service Bus,简称ESB)是企业级集成的重要工具,它作为服务导向架构(Service-Oriented Architecture,简称SOA)的核心组件,用于连接不同系统和应用程序,实现数据和服务的高效交互。ESB...
- **数据展现集成“ESB服务”数据来源应用**:演示了如何配置ESB事件,设置数据源,以及在泛微Ecology9.0中查看集成效果。 - **数据展现集成“ESB服务”数据来源分页应用**:扩展了上述示例,增加了分页功能,使得...
【企业服务总线ESB与SOA】 企业服务总线(Enterprise Service Bus,简称ESB)是基于Service-Oriented Architecture(服务导向架构,SOA)的一种中间件解决方案,用于在分布式环境中集成不同系统和应用。SOA的核心...
**ESB**(企业服务总线)是SOA(面向服务架构)架构中的关键组件之一,用于实现服务间的智能集成与管理。其核心作用在于简化不同系统间的服务交互过程,并提供标准化的数据交换机制。 1. **智能化集成与管理:** -...
ESB企业服务总线详细文档
3. **集成**:集成是ESB的核心功能之一,它连接各种数据库、聚合服务、适配遗留系统和应用程序,以及使用EAI中间件实现不同系统的互联。ESB还进行服务映射、协议转换,并支持各种应用程序服务器环境和语言接口。 4....
进入SOA阶段,服务被视为独立、自包含的业务功能,通过服务的组合和编排形成新的应用。SOA强调标准的接口和服务定义,使得不同系统间的互操作性得以提升。ESB作为SOA架构的核心组件,负责服务的发现、路由、转换和...
**WSO2 ESB 企业服务总线** WSO2 ESB(Enterprise Service Bus)是WSO2公司推出的一款开源的企业级服务总线,它基于Java语言开发,遵循ESB(企业服务总线)模式,旨在帮助企业实现服务的集成、管理和优化。作为一个...
**ESB(Enterprise Service Bus)** 是企业服务总线,是一种中间件,旨在促进不同系统间的集成和通信。它提供了一种方式,使得各种应用程序和服务能够通过标准接口进行交互,而无需了解彼此的具体实现细节。ESB的...
它在企业消息系统之上提供了一个抽象层,允许集成架构师无需编写大量代码即可实现服务间的通信。 在SOA中,ESB作为服务的中枢,负责管理服务的发现、交互和治理。它提供了以下核心功能: 1. 可靠消息传输:ESB确保...
IBM的WebSphere ESB是其ESB产品之一,专注于提供全面的服务集成能力,包括服务注册、服务安全、服务质量(QoS)管理等。另一方面,WebSphere Message Broker更倾向于作为一个强大的消息传递平台,它利用WebSphere MQ...