[SOA] Mule ESB 3.x 入门(三)—— 消息路由

在前面两篇博文基础上,继续来看看如何利用 Mule 来实现简单的消息路由。消息路由是ESB平台上最基本最重要的功能,它是指通过一定的规则将消息从一个端点发送到另一端点。通常ESB平台上会统一管理很多服务,为了便于使用和管理通常会对外暴露一个唯一入口,通过请求携带的路由信息来进行分发。

如下图所示:

ESB平台将维护一套路由表,根据请求中的路由信息来做处理。这个路由信息就是指在路由表中能唯一识别真实服务信息(数据)的相关数据(key),利用Mule Message我们可以在以下几个地方做功课。

1. 利用Http Header 来传送路由信息
在 Http Header 中添加自定义信息,ESB平台根据Header的数据进行处理。
这种方式实施比较简单,接入方需要修改一点代码即再调用HttpRequest之前需要按照约定封装Header。
OAuth 认证也是通过Header携带Auth信息来做的。

2. 利用URL来传送路由信息
通过 QueryString(或者是rest风格的URL) 传递信息,这种方式实施更简单,接入方甚至无须直接修改代码改改配置文件的URL即可。
但通过QueryString传递数据比较暴露而且有长度限制。

3. 利用Http Body 来传送路由信息
将路由信息存放在 Http Body里,这种方式实施比较麻烦,接入方需要修改不少代码而且极不灵活。
需要整体规划,将报文格式全部统一下来。

接下来举个栗子,看看 Mule 3.x 如何实现消息路由的(方式2)。
实现方式2——根据URL路由信息处理,核心很简单,通过一个groovy 脚本来处理(Mule 自带Choose组件,但还是自己写脚本灵活)

import org.apache.log4j.*;
Logger logger = LogManager.getLogger("router");

class Router implements Serializable {
	def serviceId, address, contentType
} 
List routers = [
	new Router(serviceId:"svc001", address:"localhost:11788/Service1.svc"),
	new Router(serviceId:"svc002", address:"localhost:11789/Service1.svc"),
	new Router(serviceId:"svc003", address:"localhost:11790/Service1.svc"),
	new Router(serviceId:"svc004", address:"localhost:11791/Service1.svc"),
];

def requestSvcId = message.getInboundProperty("http.relative.path");
logger.info "======== request serviceId: ${requestSvcId}"

def requestContentType = message.getInboundProperty("Content-Type");
logger.info "======== request contentType: ${requestContentType}"

message.setOutboundProperty("SOAPAction", message.getInboundProperty("SOAPAction"));
message.setOutboundProperty("Content-Type", requestContentType);

def currentRouter = routers.find {
	r -> r.serviceId == requestSvcId;
}

logger.info "======== service address: ${currentRouter.address}"
if (currentRouter != null) {
	if (requestContentType != '') {
		currentRouter.contentType = requestContentType
	}
	message.setSessionProperty("router-info", currentRouter)	
}

message

Mule Flow:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <flow name="mule-esb-route-sampleFlow1" doc:name="mule-esb-route-sampleFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" address="http://localhost:9999/esb" doc:name="HTTP" />
        
        <logger message="---------- #[groovy:message.toString()]" level="INFO" doc:name="log request"/>
        
        <scripting:component doc:name="Groovy">
            <scripting:script engine="Groovy" file="router.groovy"/>
        </scripting:component>
        <http:outbound-endpoint exchange-pattern="request-response" 
              address="http://#[groovy:message.getSessionProperty('router-info').address]"
              doc:name="HTTP"/>
         
    </flow>
</mule>

接入方通过向 http://localhost:9999/esb/ {serviceId} 来发送请求使用服务。groovy 中定义的 List routers 即可看成是ESB平台内部管理的路由表
(实际使用时会保存在数据库中或者缓存容器中便于即时修改维护),Mule 通过 relative path 获取的 {serviceId} 来做映射。
最后将变量交给 Mule 的 <http.outbound-endpoint> 将请求转发到真实服务上去。

顺便做个广告,下面是我在 InfoQ 做的分享的PPT和视频,有兴趣的童鞋请移步观看。

http://www.infoq.com/cn/presentations/electricity-supplier-in-the-enterprise-service-bus


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mule ESB是一种开源的企业服务总线,用于实现不同应用程序之间的集成。Mule ESB开发手册提供了详细的指导和使用说明,帮助开发者成功构建和管理Mule ESB应用程序。 首先,Mule ESB开发手册介绍了Mule ESB的基本概念和架构。开发者可以了解到Mule ESB的运行时引擎、消息处理器和连接器等核心组件,以及它们之间的关系和工作原理。 其次,开发手册提供了如何安装和配置Mule ESB的步骤。开发者可以了解到如何下载和安装Mule ESB,如何配置运行时环境和相关依赖项,以及如何准备开发环境。 然后,开发手册介绍了Mule ESB的开发模型和应用程序的结构。开发者可以学习如何创建和管理Mule应用程序的项目结构、资源文件和配置文件。此外,手册还介绍了如何使用Mule ESB的XML配置文件进行应用程序的定义和配置。 接着,开发手册详细介绍了Mule ESB消息路由和转换功能。开发者可以学习如何使用消息处理器和连接器来定义消息路由规则和转换逻辑。此外,手册还介绍了如何使用Mule ESB的过滤器和验证器来处理和验证消息的内容。 最后,开发手册提供了关于运行和监控Mule应用程序的指南。开发者可以了解到如何使用Mule ESB的控制台和日志记录功能来监控应用程序的性能和运行状态。此外,手册还介绍了如何配置和管理Mule ESB的集群和高可用性设置,以确保应用程序的可靠性和可扩展性。 总之,Mule ESB开发手册是开发者学习和使用Mule ESB的重要参考资料。通过阅读手册,开发者可以掌握Mule ESB的基本概念和技术,提高应用程序的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值