Nos vários eventos e discussões sobre SOA que participamos nestes últimos 03 anos, inevitavelmente, éramos apresentados a cases reais de implementação de arquitetura orientada a serviços que não passavam de um conjunto de Web Services.
Este “erro” é tão comum que existe até um termo em inglês para designar esta arquitetura que “pretende” ser SOA: JBOWS (Just a Bunch of Web Services, ou apenas uma porção de Web Services). Este termo foi definido pelo Joe McKendrick ainda em 2005 (!).
Muitos arquitetos de integração estão implementando JBOWS, Web Services Integration (WSI) ou qualquer outra coisa e “juram de pés juntos” que isto é SOA. Não é!
Desde que Ronald Schmelzer escreveu um artigo com o título “Why Service Consumers and Service Providers Should Never Directly Communicate“, esta polêmica aumentou e provocou uma boa discussão na blogosfera.
Afinal, por que Service Consumer não deve ser comunicar diretamente com Service Provider?
Por várias razões mas, basicamente porque seu ambiente SOA deve pressupor um ambiente heterogêneo, sujeito a mudanças e com “baixo acoplamento”:
- Baixo acoplamento na Implementação
- Baixo acoplamento no “Contrato” de Serviço
- Baixo acoplamento na “Política” de Serviço
- Baixo acoplamento no Processo
- Baixo acoplamento no Schema de Dados
- Baixo acoplamento na Infraestrutura
- Baixo acoplamento na “Camada” Semântica
Sobre este assunto recomendo este artigo: “The Seven Layers of Loose Coupling” (também no site Zapthink.com).
Qual a Solução? Resposta: “Late-Biding”!
Late-biding significa basicamente que um cliente não está ciente (aware) do seu endpoint (service ou server). Um cliente faria uma requisição a um IP virtual e um “proxy” (também chamado de application delivery controller) verifica o cabeçalho HTTP para determinar o endpoint apropriado . O termo “late” (atrasado) é utilizado porque a decisão de direcionar ao endpoint só é tomada após a requisição do cliente.
- Cliente envia uma requisição para o application delivery controller
- O application delivery controller verifica a requisição e determina o endpoint (server ou pool)
- O application delivery controller direciona a requisição para o endpoint (server ou pool)
No mundo real uma das formas de implementar o late binding é através do uso do WSDL (Web Services Description Language).
- Cliente requisita o WSDL apropriado, opcionalmente de um registry
- Cliente determina o endpoint através de um parsing no WSDL
- Cliente direciona a requisição para o endpoint definido no passo anterior
Mais detalhes aqui.
Conclusão
O “Late-binding” não é a solução para tudo. Existem outras abordagens e em cada cenário devem ser avaliados os prós e contras. Este é um trabalho do arquiteto de integração mas, certamente você deve, sempre que possível, ter em mente os 7 níveis de abstração em seu ambiente SOA e o bom senso para fazer o trade-off correto.
Uma crítica interessante e cuja leitura também recomendo está neste post do blog da Anne Thomas Manes (Burton Group).
Boa sorte!