`

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

    博客分类:
  • ESB
阅读更多

初探Apusic 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个业务服务。

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就算发布成功了。

4.2. 上海银行:贷款利率服务

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

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

4.3. 深圳银行:贷款利率服务

这个过程,和上面上海银行的发布过程是一样的,就是类的名字不一样,且返回的利率不一样:

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。

5.1. 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安装配置完成。

5.2. 启动ESB服务器

目前使用的ESB服务器启动命令和服务器的一样,通过domains/mydomain/bin/startapusic.cmd命令启动。现在,我们把三个ESB都启动起来。

如果你的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服务组合设计

7.1. 服务组织

1)在“ESB网络演示”上右键点击“北京”节点的“服务组织”,选择“新建”->“服务组织”。

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

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

7.2. 增加业务流程节点

根据我们新的业务流程,我们从右边的工具栏上拉出如下节点,并命名如下:

start和end分别是新的业务服务的起点和终点。

credite节点是信用判断服务节点,这里我们打算调用现有系统中已有的“信用判断服务”。

szrate节点是深圳银行的利率计算,这里我们打算把深圳银行现有的利率计算服务组合进来。

shrate节点是上海银行的利率计算,这里我们打算把上海银行的现有利率计算服务组合进来。

lowrate节点是利率大小比较,这里也组合现有中介服务公司现有的服务。

因为流程从credite节点到szrate和shrate是分支,因此增加一个router节点,这个节点的作用是进行一个流程判断。

增加各节点完毕后,我们通过右边工具栏的“连接”线,把这个新的业务流程串起来:

7.3. 导入现有业务服务到服务总线中

1)在“ESB网络管理”视图中,右键点“北京”的“导入服务”,选择“新建”->“导入服务”:

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

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

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

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

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

7.4. 导出新的业务服务

OK,现在4个已有的服务已经导入到服务总线中了,因为我们的目的是整合这些服务从而构成一个新的服务,因此我们还需要“导出服务”,以便外部客户端能够访问这个新的组合业务服务。

1)在“ESB网络演示”的“北京”节点的“导出服务”上点击右键,然后“新建”->“导出服务”:

2)在对话框中,填入:

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

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

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

7.5. 上下文参数设计

现在,我们看到已经有4个导入服务和1个导出服务,我们可以看到这些服务的方法都是由输入和输入参数的,现在我们把它们组织到一个流程里面,那么,在这个流程上,一定是要有数据进行传递的,否则,下一个节点的输入从何而来,所以,我们需要定义一些上下文参数,供这些流程中的节点进行调用。

在设计界的空白处点击一下,然后在“Properties”视图的“上下文参数”中点击“增加”来增加5个参数:

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

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

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

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

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

7.6. 业务流程节点属性设置

现在,我们看到已经有4个导入服务和1个导出服务,并且设置了上下文参数,现在我们就可以把这些导入导出的服务以及上下文参数设置到这些业务流程中的各个节点中了。

1)选择start节点,属性设置如下:

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

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

4)szrate设置如下:

5)shrate的节点设置如下:

6)lowrate的节点设置如下

a)“任务配置”

b)“合并与分支”

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

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

7.7. 上传服务

OK ,服务组织中的业务流程设计到这里我们已经基本完成,下面需要把设计好的流程上传到服务器中。

1)在“ESB网络演示”视图中的“北京”的“服务组织”中点击右键,选择“同步”

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/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的企业整合的目标达到了。

9. 总结

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics