Introdução ao Mule ESB

Introdução ao Mule ESB

1. Visão geral

Mule ESB é um Enterprise Service Bus leve baseado em Java. Ele permite que os desenvolvedores conectem vários aplicativos juntos, trocando dados em diferentes formatos. Ele carrega dados na forma de uma mensagem.

O ESB oferece recursos poderosos fornecendo vários serviços, como:

  • Criação e hospedagem de serviços

  • Mediação de serviço

  • Roteamento de mensagens

  • Transformação de dados

Acharemos o ESB útil se precisarmos integrar vários aplicativos juntos ou se tivermos a noção de adicionar mais aplicativos no futuro.

O ESB também é usado para lidar com mais de um tipo de protocolos de comunicação e quando são necessários recursos de roteamento de mensagens.

Vamos criar um projeto de amostra na Seção 5 usandoAnyPoint Studio, que está disponível para downloadhere.

2. Mule Message Structure

Simplificando, o objetivo principal do ESB é mediar entre serviços e rotear mensagens para vários pontos de extremidade. Portanto, ele precisa lidar com diferentes tipos de conteúdo ou carga útil.

A estrutura da mensagem é dividida em duas partes:

  • Cabeçalho da mensagem que contém metadados da mensagem

  • Carga útil da mensagem - que contém dados específicos da empresa

Message is embedded within a message object. Podemos recuperar o objeto de mensagem do contexto. Podemos alterar suas propriedades e carga útil usando componentes e transformadores Java personalizados dentro de um fluxo Mule.

Cada aplicativo consiste em um ou mais fluxos.

Em um fluxo, podemos usar componentes para acessar, filtrar ou alterar uma mensagem e suas diferentes propriedades.

Por exemplo, podemos obter uma instância de uma mensagem usando o componente Java. Esta classe de componente implementa uma interfaceCallable do pacoteorg.mule.api.lifecycle:

public Object onCall(MuleEventContext eventContext) throws Exception {
    MuleMessage message = eventContext.getMessage();
    message.setPayload("Message payload is changed here.");
    return message;
}

3. Propriedades e Variáveis

Os metadados da mensagem consistem em propriedades. Variáveis ​​representam dados sobre uma mensagem. A forma como as propriedades e variáveis ​​são aplicadas ao longo do ciclo de vida da mensagem é definida por seus escopos. Properties can be of two types, based on their scope: inbound and outbound.

Inbound properties contêm metadados que evitam que as mensagens sejam embaralhadas durante a passagem pelos fluxos. As propriedades de entrada são imutáveis ​​e não podem ser alteradas pelo usuário. Eles estão presentes apenas durante o fluxo - uma vez que a mensagem sai do fluxo, as propriedades de entrada não estão mais lá.

Outbound properties pode ser definido automaticamente pelo Mule, ou um usuário pode defini-los por meio da configuração de fluxo. Essas propriedades são mutáveis. Eles se tornam propriedades de entrada quando uma mensagem entra em outro fluxo depois de atravessar barreiras de transporte.

Podemos definir e obter propriedades de entrada e saída, respectivamente, chamando os métodos setter e getter associados em seus respectivos escopos:

message.setProperty(
  "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
String inboundProp = (String) message.getInboundProperty("outboundKey");

Existem dois tipos de variáveis ​​disponíveis para declarar nos aplicativos.

Uma é a variável de fluxo, local para um fluxo Mule e disponível no fluxo, subfluxos e fluxos privados.

As variáveis ​​de sessão declaradas ficam disponíveis em todo o aplicativo.

4. Barreiras de transporte eflow-ref

Barreiras de transporte são conectores HTTP, VMs, JMS ou conectores semelhantes que exigem caminhos ou pontos de extremidade para que as mensagens sejam roteadas. Flow variables aren’t available across transport barriers, but session variables are available across the project in all flows.

Quando precisamos criar um subfluxo ou fluxo privado, podemos nos referir ao fluxo de um pai ou de outro fluxo usando o componenteflow-ref. Both flow variables and session variables are available in sub-flows and private flows referred using flow-ref.

5. Projeto de Exemplo

Vamos criar um aplicativo no Anypoint Studio que contém vários fluxos, que se comunicam entre si por meio de conectores de entrada e saída.

Vejamos o primeiro fluxo:

image

 

Podemos configurar um ouvinte HTTP como:

Os componentes do fluxo devem estar dentro de uma tag<flow>. Portanto, um exemplo de fluxo com vários componentes é:


    
    
    
    
    
    
    

Dentro do fluxo, fornecemos uma referência a um ouvinte HTTP configurado. Então, estamos mantendo um logger para registrar a carga útil que o listener HTTP está recebendo por meio do método POST.

Depois disso, é colocada uma classe de transformador Java personalizada, que transforma a carga após receber a mensagem:

public Object transformMessage(
  MuleMessage message,
  String outputEncoding) throws TransformerException {

    message.setPayload("Payload is transferred here.");
    message.setProperty(
      "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
    return message;
}

The transformer class must extend*AbstractMessageTransformer*. Também estamos definindo uma propriedade de saída dentro da classe.

Agora, já convertemos a carga útil dentro do objeto de mensagem e a registramos no console usando o logger. Estamos definindo uma variável de fluxo e uma variável de sessão.

Por fim, estamos enviando nossa carga útil por meio do conector da VM de saída. The path in VM connector determines the receiving endpoint:

image

A mensagem transportada e transformada pelo fluxo inicial atingeFlow1 por meio de terminais de VM de entrada.

O componente Java recupera propriedades de saída definidas pelo primeiro fluxo e retorna o objeto que se torna a carga útil da mensagem. O métodotransformMessage() para esta tarefa:

public Object transformMessage(
  MuleMessage message,
  String outputEncoding) throws TransformerException {

    return (String) message.getInboundProperty("outboundKey");
}

Em seguida, as variáveis ​​de fluxo e sessão são configuradas para o segundo fluxo. Depois disso, temos uma referência aFlow2 usando o componenteflow-ref.

image

EmFlow2,, transformamos a mensagem usando a classe de componente Java e a registramos no console. Também definimos uma variável de fluxoF3.

Depois de chamarFlow2 usandoflow-ref, Flow1, esperará que a mensagem seja processada emFlow2.

Qualquer variável de fluxo definida emFlow1eFlow2 estará disponível em ambos os fluxos, uma vez que esses fluxos não são separados por quaisquer barreiras de transporte.

Por fim, a mensagem é enviada de volta ao solicitante HTTP por meio de VMs. Configuramos todas as VMs como solicitação-resposta.

Podemos invocar esse aplicativo a partir de qualquer cliente REST postando quaisquer dados JSON no corpo. O URL serálocalhost:8081 conforme configurado no ouvinte HTTP.

6. Construindo projetos usando Maven na linha de comando

No arquivosettings.xml localizado no diretório conf do Maven, precisamos incluirpluginGroup:


    org.mule.tools

Também precisamos informar ao Maven onde encontrar os repositórios do Mule e isso precisa ser incluído na tag de perfil:


    Mule Org
    
        true
    
    
        
            mulesoft-releases
            MuleSoft Repository
            https://repository-master.mulesoft.org/releases/
            default
        
        
            mulesoft-snapshots
            MuleSoft Snapshot Repository
            https://repository-master.mulesoft.org/snapshots/
            default
        
    

Agora, podemos facilmente iniciar um projeto Maven usando o comando:

mvn mule-project-archetype:create -DartifactId=muleesb -DmuleVersion=3.8.1

Depois de configurar nosso projeto, podemos criar um arquivo implantável usando o comandomvn package. Agora podemos implantar o arquivo na pastaapps de qualquer servidor Mule independente.

7. Conclusão

Neste artigo, examinamos diferentes conceitos necessários de construção de um aplicativo ESB no Mule. Criamos um projeto de amostra ilustrando todos os conceitos descritos.

Agora podemos começar a criar aplicativos ESB usando o Anypoint Studio para atender às nossas diversas necessidades.

Como de costume, o projeto completo pode ser encontradoover on GitHub.