Padrões de Integração com Apache Camel

Padrões de Integração com Apache Camel
steppat
steppat

Compartilhe

Hoje em dia é difícil encontrar uma aplicação que funciona de maneira isolada, sem depender de nenhuma outra funcionalidade externa. Queremos reaproveitar funcionalidades já existentes que é a ideia principal do SOA. Ou seja, em tempos de Cloud e SOA a integração entre aplicações se tornou algo muito comum e faz parte do dia-a-dia do desenvolvedor.

O problema é que integração é uma tarefa árdua! Fazer que aplicações se comuniquem de maneira robusta e desacoplada não é fácil, pois não criamos as aplicações pensando na integração. Além disso, temos que trabalhar com plataformas, linguagens, formatos e protocolos diferentes, manter versões diversas, lidar com problemas da rede e falhas em geral, entre outras preocupações.

Logo Apache Camel

Um framework de integração ajuda a diminuir a complexidade e o impacto dessas integrações. Ao invés de escrever código de integração na mão usamos componentes para isso. Com um framework de integração seguimos boas práticas que foram identificadas e amadurecidas ao longo do tempo.

Banner promocional da Alura, com chamada para um evento ao vivo no dia 12 de fevereiro às 18h30, com os dizeres

Os Enterprise Integration Patterns definem uma série de boas práticas na integração que foram documentadas no livro com o mesmo nome. O livro descreve as vantagens e desvantagens de cada padrão e define um vocabulário comum a ser seguido. O Apache Camel, como framework de integração, implementa a maioria dos padrões de integração.

Essencialmente, Camel é um roteador (routing engine) e a tarefa do desenvolvedor é configurar, através de um Builder, as regras de roteamento. O desenvolvedor decide de onde vem as mensagens (from()), para onde enviar (to()) e o que fazer com a mensagem no meio desse processo (mediation engine).

Veja um exemplo de uma rota com Apache Camel configurada pela Camel DSL em Java: ```java from("jpa://br.com.caelum.livraria.modelo.Pedido?consumer.delay=5s") .marshal().xstream() .log(LoggingLevel.INFO, "XML do pedido: ${body}") .to("jms:queue:pedido") .marshal().xmljson() .log(LoggingLevel.INFO, "JSON do pedido: ${body}") .to("http4://localhost:8080/pedidos") .end();


Nesse exemplo verificamos a cada 5 segundos se há um novo pedido no [banco de dados](http://www.eaipatterns.com/SharedDataBaseIntegration.html). Caso exista, serializamos para XML e [encaminhamos para uma fila JMS](http://camel.apache.org/jms.html). Depois transformamos o [XML para JSON](http://camel.apache.org/data-format.html) para [enviar uma requisição HTTP](http://camel.apache.org/http4.html). A rota deve ser configurada pelo `RouteBuilder` que, por sua vez, é adicionado ao `CamelContext`:

```java
 CamelContext context = new DefaultCamelContext(); context.addRoutes(new RouteBuilder() { //configuração da rota from(..).to(..) });

context.start(); 

Pelos métodos from(..) e to(..) definimos os endpoint, ou seja de onde vem e para onde vai a mensagem (routing). No meio dos endpoints podemos aplicar regras (mediation) de transformação ou enriquecer, serializar para vários formatos, validar e processar os dados e muito mais, sempre seguindo os Enterprise Application Patterns. A lista de componentes é impressionante (+120), mas não estamos limitados aos componentes oficiais, pois é relativamente fácil criar o seu próprio componente.

Nesse momento poderia parecer que o Camel é um ESB (Enterprise Service Bus) e, realmente, algumas das funções de um ESB tradicional o Apache Camel também possui. O próprio site do Camel define o framework como "a small, lightweight embeddable ESB".

A explicação do site também deixa clara a diferença: O Apache Camel roda embutido dentro da aplicação. Um ESB é um container/servidor separado, um produto mais complexo com várias funcionalidades. Além do roteamento e mediação já vistos, um ESB adiciona outros recursos como monitoramento e gerenciamento de processos, balanceamento de carga e alta disponibilidade, oferece um registro de serviços, força segurança e disponibiliza ferramentas (tooling), entre outras funções. Isso também faz com que um ESB seja um produto mais complexo, enquanto o Apache Camel foca no roteamento e mediação.

Mais sobre a integração com Apache Camel é visto no nosso treinamento SOA na prática: Integração com Web Services e Mensageria.

E você, já usou Apache Camel?

Veja outros artigos sobre Programação