Mule ESB 架构理解(以机场登机例子)

简介

Mule ESB是一个基于Java的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换。Mule ESB支持集成现有系统而无论其底层采用何种技术,如JMS、Web Services、JDBC、HTTP以及其他技术

整体结构

image.png

Mule通过Transports/Connectors与外围的异构系统连接,提供Routing(路由)、Transaction Management(事务管理)、Transformation(转换)、Message Broker(消息代理)、Transportation Management(传输管理)、Security(安全)等核心模块。Mule可以单独使用,也可以架设在常用的应用服务器上。

架构图

image.png

外围系统的服务请求通过Mule ESB的Transport接入,Mule通过Transformer进行数据的格式转换,然后经过Inbound Router进行消息过滤(内部通过配置filter实现)后交给Mule的Component进行业务逻辑处理,处理后的结果通过Outbound Router确定传递给哪个接收方,然后通过Transformer进行数据格式转换,通过Transport连接至接收方,传递信息。

此图描述的是Mule中的一个典型场景的处理过程,涵盖了Mule中的各个关键组件。其中某些处理步骤不是必须的,如Inbound Router、Transformer。后续可以看到一些其他场景的处理。

功能

  • a. 服务中介

将业务逻辑和消息发送分离
屏蔽服务的消息格式和协议
提供任意位置的服务调用
提供协议桥接

  • b. 数据转换

在应用间交换不同格式的信息
操作消息的负载内容,包括加密、压缩和编码转换
在异构的传输协议的数据类型间格式化消息

  • c. 消息路由
    基于消息内容和复杂规则路由消息
    消息的过滤、聚合以及重新排列序号
  • d. 服务创建和托管
    暴露端点、EJB、Spring Bean以及POJO作为服务
    作为轻量级的服务容器进行服务托管
    Mule ESB中有一些基本的概念,理解这些基本概念后才能理解Mule的内部机制。从中也可以看到Mule解决问题的基本思路。

基本概念

Model

Model表示托管各个服务的运行时环境。

image

可以理解为 T1 T2 T3航站楼

Service

Service是用来处理服务请求的基本单位,它调用各个组件进行服务请求的处理。

image

从柜台购买机票到候机厅登机理解为一组 service

Transport

Transport管理消息的接收和发送,数据转换的过程也是在Transport中通过调用Transformer完成的。

image

航站楼安全检查后在柜台使用身份证购买机票

  • Connector

Connector用于管控特定协议的使用,如HTTP Connector、JMS Connector等。

使用的哪国语言 汉语 英语 西班牙 俄语

  • End-Point

Endpoint用于表示一种协议的特定使用方式,如listening/polling、从中读取、向指定地址写入等,定义了发送和接收消息的通道。Endpoint控制的是底层的实体在Connector中如何被使用。

Endpoint定义于Inbound和Outbound Router中。

根据护照信息把个人登机信息读取。

Transformer

Transformer用于转换消息的内容。

image

消息翻译

Router

Router使用Filter基于消息中的属性信息进行消息的分发。

image

图 Router

Router在Service中的位置决定了Router的性质(inbound、outbound和response)和担任的角色(pass-through、aggregator等)。

安检不同通道 经济舱通道 头等舱通道 携程通道 携带小孩通道 通道路由

Component

Component是Service的核心部件,是Service的业务逻辑的实现。

image

图 Component: implicit bridge component

Component可以是Java Class(POJO、Spring Bean)、Web Service、Script等。

Component可定义自己的生命周期:initialise、start、stop、dispose,不过需要实现Mule的LifeCycle接口。Mule 3.0版本开始提供@PostConstruct和@PreDestroy的注解,对应生命周期的initialise和dispose阶段,不需要实现Mule的LifeCycle接口了。

身份核实、携带行李检查、搜身

Flow(@since 3.0)

Flow是Mule 3.0新引入的,包含一个消息源(Message Source)和多个消息处理器组成的处理器链。

image

图 Flow

----------------------------------------------------- 以下为重点--------------------------------------
5. 消息传递方式
5.1 异步方式

异步方式是一种单向调用,调用者不需要获得响应。

image

图 Asynchronous

异步方式通过inbound和outbound endpoint的exchange-pattern=”one-way”实现。

使用基本的Stdio Transport验证,通过标准输入传输字符串,将其原样传递给标准输出进行显示。相应配置如下:

xml 代码
1.

  1.        
    
  2.        
    
  3.        
    
  4.            
    
  5.        
    

  6. 15.
    运行服务,控制台显示结果如下:

1.Please enter: Hello, world!
2.INFO 2010-12-07 19:21:18,877 [ConsoleConnector.dispatcher.1]

  1. org.mule.lifecycle.AbstractLifecycleManager: Initialising:
  2. 'ConsoleConnector.dispatcher.23255376'. Object is: StdioMessageDispatcher
    5.INFO 2010-12-07 19:21:18,877 [ConsoleConnector.dispatcher.1]
  3. org.mule.lifecycle.AbstractLifecycleManager: Starting:
  4. 'ConsoleConnector.dispatcher.23255376'. Object is: StdioMessageDispatcher
    8.Hello, world!
    其中INFO输出是Mule第一次初始化相应Connector打印出来的,之后调用服务不会再次显示。
    异步方式适用于简单的消息传递的场景。

5.2 请求-响应方式

请求-响应方式即请求方调用服务后,服务立即处理并返回响应结果,不需将消息再次传递。

image

请求-响应方式通过input endpoint的exchange-pattern=”request-response”实现,相应配置如下:

xml 代码
1.

  1.            
    
  2.                
    
  3.                    
    
  4.                
  5.                    exchange-pattern="request-response">        
    
  6.                            
    
  7.                        
    
  8.                    
    
  9.                    
    
  10.                        
    
  11.                    
    
  12.                
    
  13.      
    

  14. 17.

    上边是通过service配置的,通过flow配置如下:

xml 代码
1.

  1.    exchange-pattern="request-response" />        
    
  2.            
    

  3. 8.
    在浏览器中输入“http://localhost:7007/services/Echo/echo/text/hello,world”,浏览器中会显示“hello,world”的输出信息。

请求-响应方式适用于单次服务调用的场景。

5.3 同步方式

同步方式即请求方调用服务后,component将处理结果发送给另一个外部服务处理,并将处理结果反方向返回。

image

图 Synchronous

同步方式通过inbound和outbound endpoint的exchange-pattern=”request-response”实现,相应配置如下:

xml 代码
1.

  1.    exchange-pattern="request-response" />      
    
  2.          
    

  3. 9.
    10.
  4.          
    

  5. 16.
    同步方式适用于通过Mule调用远程服务的场景。

5.4 异步请求-响应方式

异步请求-响应方式即请求方调用服务后不需要立即获得返回结果,component将请求发送给其他外围系统处理(可能有多个),全部处理完毕后通过指定的异步应答Router返回给请求方。

image

图 Asynchronous Request-Response

异步请求-响应方式通过在OutBound Endpoint中增加reply-to以及增加async-reply节点实现,响应配置如下:

xml 代码
1.

  1.    exchange-pattern="request-response" />      
    
  2.          
    

  3. 9.
    10.
  4.          
    

  5. 16.
    异步请求-响应方式适用于请求需要被多个远程服务并行处理,结果需要汇总处理后返回的场景。

注:上述代码未运行通过,queue1和queue2获得了请求消息并正常处理,但返回至async-reply时抛出异常,暂未定位到问题。

后将collection-async-reply-router改为single-async-reply-router未报异常,代码示例如下:

xml 代码
1.

  1.          
    
  2.          
    
  3.              
    
  4.              
    
  5.              
    
  6.          
    
  7.          
    
  8.          
    

  9. 17.

6. 配置模式

Mule 3.0版本提供了“pattern”的机制。Pattern总结了实际使用过程中的常见场景,以简化的服务配置方式提供。

6.1 简单服务模式(simple service pattern)

简单服务模式用于简化同步服务调用的配置,对应消息传递方式中的请求-响应方式。

image

简单服务模式通过simple-service 元素配置,主要的元素属性包括:

属性 说明
address 服务监听的地址,如vm:in
component-class Component的实现类
type direct: 默认;

jax-ws: 将component暴露为soap式的web service(component必须基于jax-ws的注解),address一般为Http Transport;

jax-rs: 将component暴露为rest式的web service(component必须基于@Path的注解),address一般为Http或Servlet Transport

代码示例:

component-class="demo.mule.umo.Echo" />Mule针对服务请求接入可以做额外的处理,比如增加Transformer配置进行数据转换。

6.2 桥接模式(bridge pattern)

桥接模式用于在inbound endpoint和outbound endpoint之间建立直接连接,不需要component提供业务逻辑。

image

桥接模式通过bridge元素配置,主要属性包括:

属性 说明
inboundAddress 服务请求接入地址
outboundAddress 服务接出的实际地址
exchange-pattern request-response: 默认,返回处理结果;

one-way: 单向

transacted true: 在向outbound endpoint分发时使用事务;

false: 不使用事务

代码示例:

outboundAddress="jms://topic:myTopic" />

Mule在接入、接出的过程中可以做额外的处理,比如增加Transformer配置进行数据转换。如果使用事务控制,对于异构的协议之间的事务需要有支持XA的事务控制器。

6.3 校验器模式(validator pattern)

校验器模式通过定义一个校验过滤器过滤服务请求,并同步返回ACK(ACKnowledge)或NACK(Not Acknowledge)结果。通过校验的服务请求被异步分发给处理方。

[图片上传失败...(image-8d8dfb-1582213116344)]

校验器模式通过validator元素配置,主要属性包括:

属性 说明
inboundAddress 服务请求接入地址
outboundAddress 服务接出地址
ackExpression 表达式,用于构建服务请求被接收时的信息
nackExpression 表达式,用于构建服务请求被拒绝时的信息
errorExpression @since 3.0.1

表达式,用于构建在服务请求分发出错时的信息
validationFilter-ref 过滤器的引用,也可以使用子元素指定

用于确定服务请求是否被接收

代码示例:

ackExpression="#[string:GOOD:#[message:payload]@#[context:serviceName]]"
nackExpression="#[string:BAD:#[message:payload]@#[context:serviceName]]"
outboundAddress="vm://test-service.in">

注:Mule的表达式后续补充。

6.4 web服务代理模式(web service proxy pattern)

Web服务代理模式用于将Web Service请求直接转发至远程目标Web Service服务端,Mule本身不提供实际的Web Service。

[图片上传失败...(image-26bacc-1582213116344)]

Web服务代理模式通过ws-proxy元素配置,主要属性包括:

属性 说明
inboundAddress Mule对外提供的地址
outboundAddress Web Service的实际地址

代码示例:

inboundAddress="http://localhost:7006/services/Echo"
outboundAddress="http://localhost:8000/services/Echo?method=echo">

Mule在转发的过程中可以做额外的处理,比如增加Transformer配置进行数据转换。

7. 总结

一. 服务调用

1. Mule实现并提供Web Service

在Mule上开发并发布一个Web Service供客户端调用。

•示例配置

 

 

 

     

 

•测试方法

在浏览器地址栏中输入“ http://localhost:65082/services/Echo1/echo/text/hello ”,回车后浏览器中将显示返回结果信息。地址中的“ echo ”是服务的方法,“ text ”是方法的参数,“ hello ”是参数的值。

2. Web Service Proxy

Web Service Proxy用来将客户端的WS请求直接转发至相应的远程WS服务端处理,并返回处理结果。Mule本身不做任何处理。 

2.1 配置方式1

•示例配置

 

 

•说明

注意 outbound-endpoint 中 address 参数中的表达式。

•测试方法

浏览器中通过“ http://localhost:65000/webservice/EchoService?wsdl ”(将内容复制,保存为 *.wsdl ),然后使用 SoapUI 测试。

2.2 配置方式2

•示例配置

outboundAddress="http://localhost:65082/services/Echo1?method=echo"> 

•说明

Mule 为这种常见的场景提供了现成的模式,以简化配置。

•测试方法

通过“ http://localhost:65082/services/Echo2?wsdl ”获取 wsdl 文件,然后使用 SoapUI 测试。

3. Web Service to Web Service

Web Service To Web Service用于在Mule中提供Web Service供客户端调用,Mule接收请求后调用远端的Web Service进行处理,并返回结果。 

•示例配置

 

 

 

•说明

注意outbound-endpoint中address参数的配置方式,使用了wsdl-cxf前缀表示此web service是由cxf提供的。

•测试方法

在浏览器中输入“ http://localhost:65082/services/Echo8/echo/text/hello ”进行测试。

4. Socket to Socket

Socket To Socket用于将客户端的Socket请求转发至远程的Socket服务端处理,并返回处理结果。 

•示例配置

 

 

•说明

主要配置 host 、 port 参数,表明服务地址。

•测试方法

通过 SimpleServer 和 SimpleClient 测试类,首先启动 SimpleServer ,然后启动 SimpleClient ,发送请求并接收处理结果。

5. JMS Topic

客户端发送Web Service请求,Mule将请求消息发送至远程JMS的Topic中。

•示例配置

 

 

 


 

 

•说明

JMS endpoint 是单向的,不需要返回值。通过 topic 属性指定 JMS Server 的 Topic 名称, connector-ref 指明了使用的 JMS 连接。

•测试方法

在浏览器地址栏中输入“ http://localhost:65082/services/Echo3/echo/text/hello ”发送请求, Mule 控制台上输出订阅者的处理结果(上述示例中通过 Mule 配置了一个 JMS 的订阅者)。也可以通过 ActiveMQ 的控制台,查看到 Topic 中增加了一条发布的消息。

二. 基于消息内容的路由

Mule提供基于消息内容的路由机制,根据消息中的指定信息,将消息发送至不同的服务端进行处理。 

1. Socket to Socket 路由

•示例配置

 

 
     

         

     
     

         

     
 

•说明

路由使用了 元素,表示路由分支。 When 元素使用 evaluator 指明表达式的解析方式,使用 expression 描述消息内容的判断条件。

•测试方法

同 Socket To Socket 测试,消息内容分别为 bjsh ,查看发送至不同服务器的输出。

2. Web Service to JMS Topic 路由

•示例配置

 

 

 
     

         

     
     

         

     
 

•测试方法

通过“ http://localhost:65082/services/Echo7?wsdl ”获取 wsdl 文件,然后通过 SoapUI 发送请求,查看返回结果。修改消息内容,查看结果的变化。

3. Web Service to Web Service 路由

•示例配置

 

 

 
     

         

     
     

         

     
 

•测试方法

使用“ 1bj123.4510]]> ”数据进行测试。

三. 数据转换

1. 压缩解压

Mule原生提供了gzip压缩方式的Transformer。 

•示例配置

 

 

 

 

 

 

 

 

 

•说明

gzip-compress-transformer 针对 byte[] 进行压缩处理,因此对于字符串类型的消息,首先需要通过 string-to-byte-array-transformer 进行转换。

•测试方法

在控制台的提示信息后输入测试字符串,完成后控制台输出同样的信息。

2. 加密解密

加密、解密是一种特定的数据转换方式,因此通过自定义Transformer的形式支持。 

•示例配置

 

 

 
     

 
 

 

 

 

•说明

DesEncryptTransformer 是自定义的压缩转换器, DesDecryptTransformer 是对应的解压转换器。

•测试方法

在浏览器地址栏中输入“ http://localhost:65082/services/Echo11/echo/text/ 测试字符串”,在控制台中可见加密后的字符串和最终解密后与原串相同的字符串。

3. 自定义Transformer

•示例代码

import demo.mule.dto.Envelope;

public class String2EnvelopeTransformer extends AbstractTransformer {
private static Log log = LogFactory.getLog(String2EnvelopeTransformer.class);

@Override 
protected Object doTransform(Object src, String enc) throws TransformerException { 
    Envelope env = new Envelope(); 
    if (src instanceof String) { 
        StringTokenizer st = new StringTokenizer((String) src, ","); 
        String area = st.nextToken(); 
        String data = st.nextToken(); 
        env.create(area, data); 
    } 
    log.debug(env); 
    return env; 
} 

}

•说明

自定义 Transformer 需要继承 AbstractTransformer 类,实现其 doTransform 方法。该方法接收两个参数,一个是消息对象,一个是消息的 Encoding ,方法抛出 TransformerException ,返回转换后的消息对象。

•实例配置

 

 

 

     

 
 

 

•测试方法

在浏览器中输入“ http://localhost:65082/services/Echo1/echo/text/bj,hello ”进行测试,观察控制台输出结果。

文章出处
https://www.cnblogs.com/liangqihui/p/7905310.html

你可能感兴趣的:(Mule ESB 架构理解(以机场登机例子))