Padrões de Integração com Apache Camel
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.
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.
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?