ESB之旅(loanBroker续3)
? 总结实现eclipse内部调试LoanBroker的修改:
? 1、使用org.mule.example.loanbroker.esb.LoanBrokerApp 以 java application启动的话需要将main函数最后一句改为:
?????? loanBrokerApp.run(true);——如果还是false则控制台只会输出一些警告信息(正常),而不输出所有的日志信息和最终结果,比较奇怪原因待查。
? 2、loan-broker-esb-mule-config.xml 需要修改配置:
?????? 1)<context:property-placeholder location="openejb.properties"/>和ejb:connector的配置都可以去掉了、ejb端点CreditAgency改为普通vm端点:
?????? 2)<service name="CreditAgencyGatewayService">征信所网关服务 的出站端点直接改为:
????????? <outbound-endpoint synchronous="true" ref="CreditAgency" />
?????? 3)增加一个service:
? 请求地址是:http://localhost:8888/loanbroker/?customerName=RossMason&ssn=1234&loanAmount=10000&loanDuration=24,里面参数可自行调整。结果的返回也是向浏览器返回了、如果返回结果不加处理那么会返回一个org.mule.example.loanbroker.messages.LoanQuote对象、浏览器会下载它、下载下来一个part后缀文件,为此增加一个转换器:
这样使得响应的对象返回到浏览器之前先执行toString方法、转为字符串反馈到浏览器上显示出来。
? 可以直接在loan-broker-esb-mule-config.xml上以mule server方式直接运行然后通过jetty rest发送请求、也可以运行LoanBrokerApp然后在控制台按提示输入。这样便实现了eclipse内部调试LoanBroker。
?
? 关于EIP :是关于类似J2EE模式的一组企业集成常见模式的书,经典的LoanBroker例子就是这本书提出来的、自称ESB者先拿这个例子练手那是必须的(serviceMix也有这个例子)。一段段翻译实在耗时,这里把这本书关于LoanBroker例子的叙述摘要如下:
? EIP LoanBroker webservice解决方案架构图:
?
? 从图上可见loanBroker对外共有7个接口,都是构建在http之上的soap协议的webservice、左侧第一个是客户请求的对外接口,由Axis实现、这是一种Service Activator 服务触媒 模式。
? 第二个是上面的与 credit agency(CA)的接口,loanBroker从CA获取额外信息丰富(enrich)了客户请求,这是一种Content Enricher 内容填充 模式。
? 上述两种模式都属于EIP这本书列举的企业集成常用模式,应该仔细看看!点击链接进去看即可,这些模式非常具有指导意义,就像j2ee模式比如前端控制器是MVC架构的基础。而且每个页面都很短、简明扼要地叙述一个模式看完有种豁然开朗的感觉。下面还会提及3种。
? 右边是联系五家银行的接口、也就是说loanBroker事先知道这五家银行服务的存在,然后与他们通讯,这是 Recipient List 接收者列表 模式。由于每家银行的服务格式可能各不相同,loanBroker使用Message Translator s消息翻译者 模式进行消息格式转换。
? 每个反馈消息都得经过Normalizer 规格化 模式转化为统一消息格式。请求和响应是同步传送的,这就是说客户端和loanBroker会一直阻塞直到每家银行都返回响应或者超时。最后收集所有响应消息并整理出最佳贷款利率返回客户端。以上五种常用模式图及简短说明:
? 1、服务触媒—— How can an application design a service to be invoked both via various messaging technologies and via non-messaging techniques?
照我的理解,入站、出站和内部消息队列(vm的、jms的)都属于service activator(上节强调过的异步应答路由器也是)的一部分、service activator可以是路由或端点。它比较简单就是暴露一个服务的消息通道。
? 2、内容填充—— How do we communicate with another system if the message originator does not have all the required data items available?
enrich或者叫augment还真不太好翻译(感觉有时候英语比汉语更具表达力!抑扬顿挫的发音也更适合演讲),暂时译为强化吧,内容填充模式强化一个消息其实就是往消息中注入更多内容使得消息丰富起来、携带的信息更多更完整。这是ESB最重要的模式,依靠bindings配置元素实现。
? 3、接收者列表—— How do we route a message to a list of dynamically specified recipients?
大多数邮件系统使用此模式。模式可以看作有两部分组成:一部分遍历接收者列表、第二部分逐一向接收者发送消息。
? 4、消息翻译者—— How can systems using different data formats communicate with each other using messaging?
Use a special filter, a Message Translator , between other filters or applications to translate one data format into another.
许多企业集成面临需要整合多家私有数据模型的已有应用的场景,如遗留系统、黑盒应用、客户的系统或者合作伙伴的应用,比如同样的客户概念,记账系统则关注客户的纳税人帐号、而客户关系系统则存储着客户电话和地址。应用的领域模型决定着应用的数据库设计、接口格式和编程接口API,企业集成不得不兼容它们。该模式类似GoF的Adapter适配器模式。
? 5、规格化—— How do you process messages that are semantically equivalent, but arrive in a different format?
上图的translator我的理解就是mule中的transformer转换器,在mule的loanBroker例子中消息的common format就是LoanQuoteRequest对象。
?
Web Services设计考量? 首先批驳了一顿SOAP ,说它里面的S已经不再Simple、应该改名叫:Complex Remote Access Protocol。然后提出了如下设计考量:
?
翻译待续...