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:
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:
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.
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.