Esse artigo faz parte da revista Engenharia de Software 2 edição especial. Clique aqui para ler todos os artigos desta edição

imagem

Projeto

CBD x SOA

Serviços, processos de negócio e componentes que realizam os serviços

                            

 

Muitas comparações já foram feitas entre desenvolvimento orientado a objetos (OO) e o desenvolvimento baseado em componentes (CBD). Componentes e objetos, possuem características similares, como a necessidade de interfaces bem definidas e a disponibilização de operações aos seus clientes. Essas semelhanças dificultam ainda mais o entendimento de OO e CBD. Algo muito parecido vem acontecendo no caso de CBD e SOA.

Como veremos, existem conceitos de CBD e SOA similares, por exemplo, encapsulamento, contratos e reuso, que podem dificultar a comparação dessas abordagens. Para uma melhor comparação é necessário compreender os conceitos essenciais envolvidos, quais sejam, processos de negócio, componentes realizadores dos serviços, entre outros.

O presente artigo não trata de tecnologia, como “REST versus SOAP/WS”, ou “serviços implementados com EJB/RMI”. Atualmente, existe uma infra-estrutura tecnológica pronta, que suporta o desenvolvimento OO + CBD + SOA sem muito esforço, mas não garante, apenas permite a aplicação das abordagens citadas. Web Services não são necessariamente SOA, e EJB não é necessariamente componente. Uma comparação de CBD x SOA é muito abrangente e, portanto, envolve questões de várias dimensões. Sendo assim, este artigo focará nos serviços que refletem os processos de negócio. Isto porque, é apenas nesse âmbito que o SOA pode cumprir sua promessa de alinhar TI com negócio.

SOA: evolução, não inovação

Desconfie quando alguém fala que uma abordagem em TI é totalmente nova, pois, normalmente, as novidades do mercado complementam ou corrigem as antigas, e não as substituem. Soluções como CBD e SOA se destinam, na maioria das vezes, a superar limitações humanas, como lidar com grande quantidade de informações complexas. Para lidar com tal complexidade, a abstração é uma ferramenta chave, e está intimamente relacionada com o conceito de encapsulamento. Focando nesse aspecto essencial, Page Jones descreve em seu livro “Fundamentals of Object-Oriented Design in UML” os níveis de encapsulamento. Baseando-se nesses níveis, é possível partir de simples linhas de código e chegar ao SOA, passando por CBD, mesmo considerando que essas abordagens foram concebidas em contextos diferentes. Para uma visão geral desses dois conceitos, observe o esquema da Figura 1. 

 

imagem

Figura 1. Esquema dos níveis de encapsulamento com serviços

 

No início, eram apenas linhas de código e vários GOTOs. Quem já programou assim lembra que, muitas vezes, face à necessidade de se fazer uma alteração, era mais fácil recodificar o programa inteiro em função da desorganização que existia. Além disso, para realizar qualquer manutenção, era preciso memorizar todo o código envolvido.

Com a adoção de sub-rotinas (primeiro nível de encapsulamento), foi possível reaproveitar as linhas de código. Estas linhas, encapsuladas através de uma sub-rotina, podiam ser chamadas quantas vezes fossem necessárias. Além disso, usava-se a decomposição funcional, ou seja, um problema era dividido em problemas menores (sub-rotinas) sucessivamente, e depois, as operações eram agrupadas em módulos lógicos. Infelizmente, a maioria das hierarquias de sub-rotinas geradas com essa abordagem não são suficientemente independentes para garantir reuso ou alterações controladas, pois, existe um acoplamento forte e sem controle. Assim, apenas esse nível de encapsulamento deixava a manutenção cara em ambientes com aplicações numerosas ou complexas. Neste caso, uma alteração no código poderia afetar de forma imprevisível todo o sistema, sendo necessário testá-lo novamente por completo.

Com a dificuldade na manutenção que a decomposição funcional provocava em sistemas grandes ou complexos, em determinado momento da história os dados passaram a ser o centro das aplicações, pois era possível mantê-los de forma relativamente estável. O código era tratado como algo descartável, ou seja, muito pouco esforço era feito para criar um código de qualidade e garantir o reuso no desenvolvimento. Dessa forma, o banco de dados passou a ser o centro de tudo. O efeito colateral dessa abordagem foi muita replicação de código.

Em função das limitações da abordagem de decomposição funcional, fez-se necessária a criação de mais um nível de encapsulamento: a classe. Nessa abordagem, as “sub-rotinas” e os “dados” estão em uma única estrutura. Os “dados” são protegidos através das “sub-rotinas”, e os “dados” também são objetos. Para uma definição um pouco mais formal, temos que citar a retenção do estado e a identidade única. Na abordagem OO, o foco está em atribuir responsabilidades (comportamento) coesas e para cumprir tais responsabilidades, os objetos trocam mensagens entre si. O paradigma orientado a objetos busca meios de diminuir o “gap semântico”. Em outras palavras, diminuir a distância entre o problema no mundo real e o modelo abstrato construído.

Com a estratégia de “dividir para conquistar”, e também inspirado nos princípios da engenharia eletrônica, foi criado mais um nível de encapsulamento, qual seja, o componente de negócio. O componente encapsula objetos, protegendo-os com uma interface, de maneira contratual. O uso de contrato (Design by Contract) implica que cada uma das operações do componente é definida em termos de sua assinatura (seus tipos de argumentos de entrada e saída) e de suas pré-condições e pós-condições. Um componente oferece funcionalidades, por meio de interfaces bem definidas, para o meio externo. Componentes de negócio são subsistemas projetados para serem reutilizáveis corporativamente, mas a reutilização não é a única motivação. A necessidade de lidar com modificações de maneira rápida e controlada tornou-se essencial atualmente.

Serviços são parecidos com componentes em muitos aspectos, por exemplo, a ênfase em interfaces.  Contudo, ele é a representação lógica de uma tarefa de negócio repetitiva que tem um resultado específico (por exemplo, verificação de crédito dos clientes e fornecer dados meteorológicos). Uma abordagem promissora mostra serviços sendo encontrados diretamente em processos de negócio. SOA é um estilo arquitetônico, que suporta a orientação a serviços, com foco nos processos de negócios. Para uma definição formal, veja o site The Open Group (http://www.opengroup.org/projects/soa/doc.tpl?gdid=10632). O desenvolvimento baseado em componente fornece uma base experimentada e testada para a implementação de SOA. Pode-se considerar que serviços, no caso do SOA, encapsulam componentes.

Conceituando SOA

Martin Fowler descreve a confusão em torno de SOA em um post no seu bliki, de leitura obrigatória, chamado Service Oriented Ambiguity (endereço relacionado no quadro Links). O cientista sustenta que é impossível responder o que é SOA, pois, para pessoas diferentes, SOA possui significados distintos. Entretanto, podemos relacionar algumas idéias e mitos recorrentes na conceituação de SOA, que, juntos, podem auxiliar na definição de tal estratégia - SOA é uma estratégia de TI para melhor atender o negócio e não apenas um projeto de desenvolvimento ou algumas ferramentas. Não existe SOA, por exemplo, se a empresa possui apenas um sistema.

Um dos principais erros na conceituação de SOA atualmente, mostra SOA como pura tecnologia, por exemplo, Web Services e EJBs. SOA tem dois aspectos fundamentais: a necessidade de se mapear processos e de ter governança SOA. Sem esses elementos não é possível obter os benefícios com SOA. 

Considerando que as empresas são grandes coleções de processos e que SOA promove o alinhamento com o negócio, concluímos que existe uma forte conexão entre os processos de negócios e a identificação de serviço. Em geral, os processos de negócios concentram-se nas tarefas repetitivas executadas em uma seqüência lógica. As tarefas, em uma organização, realizam alguma meta, freqüentemente para fornecer valor na forma de produto ou serviço para uma parte externa, como um cliente ou um parceiro. O serviço é a representação desta tarefa de negócio repetitiva. O mesmo está relacionado intimamente com o processo de negócio e possibilita que ele seja um vocabulário comum entre TI e as áreas de negócio, facilitando a comunicação. O negócio é a base para a identificação de serviços, e, para a identificação ser efetiva, cada processo precisa ser modelado.

Governança SOA é focada no ciclo de vida dos serviços. Governança SOA estende a Governança de TI para assegurar os conceitos e princípios de SOA. Em outras palavras, é uma especialização de Governança de TI. A Governança SOA endereça questões como: Maturidade dos Serviços; Infra-estrutura para a gerência dos serviços; Educação e Treinamento; Regras e Responsabilidades; e Mudanças organizacionais.

Freqüentemente, relaciona-se SOA à integração de sistemas, o que não condiz com a realidade. Basta observar que EAI (Enterprise Application Integration) surgiu com o objetivo principal de resolver os problemas da integração ponto a ponto, também conhecido como “spaghetti integration”, fornecendo um meio uniforme de integração, SOA tem ambições muito maiores. Além disso, EAI possui características algumas vezes conflitantes com SOA, como o fato de ser centrado em dados e não em processos e de não se direcionar pelo negócio. O que motiva a criação de um serviço não é a integração ponto a ponto. Entretanto, SOA dá grande ênfase às interfaces que, quando bem definidas, “facilitam” a integração e, até mesmo, o reuso de código. Para atender as necessidades de integração no contexto de SOA, evitando integração ponto a ponto, temos o Enterprise Service Bus (ESB). O ESB é um conceito, com algumas características de EAI, que fornece uma camada para a lógica de integração de serviços. Existem ferramentas para ESB que disponibilizam uma infra-estrutura flexível de conectividade para integração de aplicações e serviços, suportando SOA. O ESB tem como característica: roteamento de mensagens entre serviços; conversão de protocolos de transporte entre requisitante e serviços; transformação do conteúdo de mensagens entre o requisitante e o serviço; Mensagens Síncronas e Assíncronas (ver Figura 2).

 

imagem 

Figura 2. Enterprise Service Bus (ESB)

 

 

 O foco nas interfaces é o que dá ao SOA a habilidade de obter acoplamento fraco, composição, reuso e vários outros objetivos do projeto (design goals). 
A essência de SOA está mais relacionada à habilidade de atender o negócio rapidamente. Para tanto, obter um nível de granularidade para os serviços identificáveis nos processos de negócio é uma abordagem fundamental. Isto contribui principalmente em questões como a orquestração no contexto de BPM (Business Process Management) e a justificativa de investimentos em TI, uma vez que permite a visibilidade da associação do serviço com o negócio.

Podemos resumir BPM como a combinação de pessoas, tecnologia e processos. BPM é uma prática para melhorar a eficiência das organizações, automatizando os processos de negócios. A modelagem, a execução (orquestração de Serviço) e o monitoramento dos processos são disciplinas de BPM. A associação de BPM e SOA é importante para aumentar a capacidade de responder às mudanças do negócio.

Orquestração de Serviço

Depois de encontrados os componentes e serviços, a fim de se atender a uma aplicação específica, são necessários que se efetue a orquestração, ou seja, que tais serviços sejam “chamados” em uma ordem lógica, e que sejam cumpridas todas as pré-condições das interfaces envolvidas (Lógica de Processo). Em CBD, essa orquestração pode ser codificada pelo desenvolvedor na chamada “camada de sistema”. Tal camada poderia também orquestrar serviços no caso do SOA, mas, para uma maior flexibilidade e para atender as necessidades impostas pelo BPM, o padrão de mercado atual utilizado é o Business Process Execution Language for Web Services (BPEL4WS ou BPEL). Para obter mais informações, consulte o site OASIS WSBPEL (endereço relacionado no quadro Links).

  Em alguns casos será necessário algum tipo de workflow em nível de integração de serviços (Lógica de conectividade). Isto não deve ser confundido com o workflow de processos de negócios. Os ESB’s provêem formas de realizar orquestração para a lógica de conectividade.

  Sistemas de informação em geral possuem a lógica de processo de negócio e a lógica de integração misturada com a regra do negócio. Um grande desafio na abordagem SOA é dividir corretamente a lógica da aplicação, como na Figura 3.

 

imagem

Figura 3. Diferentes lógicas de uma aplicação na abordagem SOA

TI alinhada ao negócio

Existem autores que classificam serviços em “de negócio” ou “de infra-estrutura”, entre outras classificações possíveis. No caso dos serviços “de negócio”, o nível de granularidade dos serviços é tal que, as operações fornecidas pelos serviços podem ser identificadas nos processos de negócio, formando um vocabulário comum, facilitando a comunicação da TI com as áreas de negócio. Portanto, os usuários do negócio de soluções de TI tornam-se parte do processo de design e análise.

Também é interessante observar que esta conexão mais próxima com o modelo de processo de negócio associa mais diretamente os investimentos em TI às necessidades do negócio. Em outras palavras, um serviço baseado no processo de negócio pode ser usado para endereçar o orçamento de TI, justificando desta forma os custos de TI correlacionados aos resultados dos processos de negócio. Sem uma aliança entre as áreas de negócio e a TI, SOA não irá obter o sucesso esperado.  SOA deveria ser exigido pelo negócio, não somente pela TI.

Componentes que realizam os serviços

A adoção do SOA não revogou nada do CBD, pelo contrário, representou uma evolução deste. Isto porque o CBD trouxe a base essencial para que fosse possível suportar SOA, ou seja, a infra-estrutura fundamental para a implementação de serviços. A diferença é que, com CBD, têm-se na interface dos componentes todas as operações necessárias para “realizar” os passos dos UCs (Casos de uso). Os componentes são identificados decompondo-se o modelo de classe conceitual (de análise) observando os objetos principais (conceitos mais fortes) e o tipo de associação (agregação, herança...) entre os objetos relacionados; já com SOA, há serviços apenas se observados na perspectiva do negócio. Em outras palavras, a existência de um serviço só faz sentido se o mesmo estiver associado a uma atividade no processo de negócio (Figura 4).

 

imagem

Figura 4. Visão simplificada de identificação de serviços e componentes.

 

Como SOA trata do alinhamento da TI com os processos de negócio da empresa, os serviços devem ser rastreáveis. Pode-se identificar sua origem no negócio, ou seja, tudo começa nos processos de negócio da empresa. Por isso, normalmente temos uma granularidade grossa nos serviços. Não existe uma fórmula e conseqüentemente uma granularidade padrão, ou seja, a granularidade de serviços é definida em função das necessidades do negócio. As técnicas para encontrar serviços partem sempre da análise do processo. Não existe uma relação direta de uma atividade do processo com um serviço (1 para 1), mas ele sempre está relacionado, no final da análise do negócio (processo), a uma atividade do workflow. Os serviços encontrados com essa abordagem podem ser “realizados” a partir do uso de componentes de negócio.

Todavia, nem sempre as interfaces de componentes são muito granulares. Na verdade, para a interface dos componentes de negócio, podemos considerar os casos de uso (UC). UC são soluções para os requisitos funcionais, que produzem um resultado observável para um ator. Na descrição dos casos de uso temos as interações ator/sistema. Analisando essas interações, encontramos, por exemplo, a necessidade de exibir uma simples lista para uma “caixa de seleção” (alta granularidade) ou, até mesmo, coisas do tipo “aprovar um empréstimo” (baixa granularidade). Já com SOA, na maioria dos caos, temos uma baixa granularidade, já que a interface é identificada na perspectiva do negócio (processos de negócio), envolvendo uma análise do mesmo.

 Para encontrar serviços, geralmente considera-se que as operações em uma especificação de serviço corresponderão com as tarefas atômicas identificadas em um modelo de processo de negócios. Caso feita cuidadosamente, esta abordagem pode atingir os resultados esperados, mas o nível de detalhe geralmente obtido por esse tipo de abordagem não é suficiente para garantir serviços consistentes. Para tanto, é interessante usar um método de análise de processos de negócio. Os Casos de Usos de Negócios, aliados a uma análise de negócio, podem contribuir para a obtenção de serviços com a granularidade correta. 

Depois que os serviços são identificados (serviços candidatos), é necessário determinar quais devem ser expostos como serviços. Os serviços que fazem parte do processo de negócio que está sendo automatizado, serão implementados, mas não necessariamente exigirão a geração de WSDL ou de outras formas de exposição. Serão tratados como componentes da aplicação, evitando problemas de desempenho e gerenciamento de serviço. Portanto, são necessários alguns critérios para ajudar a decidir se um serviço deve ser exposto, como relevância para o negócio, possibilidade de reutilização e viabilidade técnica.

Os componentes são a melhor abordagem para implementar serviços, embora se deva entender que um aplicativo baseado em componente bem projetado não é necessariamente uma abordagem SOA. Conforme mostrado, temos que considerar muitas questões para melhor atender as mudanças no negócio, que é o objetivo.  Uma abordagem orientada a serviços implica em uma camada de arquitetura de aplicativo adicional. A Figura 5 demonstra como as camadas de tecnologia podem ser aplicadas à arquitetura.

 

imagem

Figura 5. Camadas de uma implementação SOA

 

Camada de Serviços: A camada de serviços é caracterizada por serviços que realizam funções individuais de um negócio. Serviços são compostos de Contrato, Interface, Componentes de Negócio (Lógica de Negócios) e são identificados no processo de negócio.

Camada de Componentes de negócio (Subsistemas): Um componente de negócio é uma parte de um sistema que encapsula as regras de negócio e as expõe através de interfaces bem definidas. Componentes são independentes, substituíveis e modulares, eles ajudam a gerenciar a complexidade e encorajam a reutilização. Estes são identificados decompondo-se o modelo de classe conceitual (de análise).

Camada de Classes e Objetos: Na camada de Classes e objetos é onde estão as classes, atributos e relacionamentos de um objeto.  Os objetos colaboram entre si para realizar as regras de negócio de um componente específico.

Por fim, o exemplo da Figura 6 mostra que SOA absorve o projeto baseado em componentes, ou seja, o serviço vai ser implementado por um ou mais componentes.

 

imagem
 Figura 6. Abstração em pacotes de SOA

 

Links

The Open Group, Service Oriented Architecture

http://www.opengroup.org/projects/soa/

 

IASA

http://www.iasahome.org/web/home/home

 

Artigo “Service Oriented Ambiguity”

http://www.martinfowler.com/bliki/ServiceOrientedAmbiguity.html

 

Service-oriented modeling and architecture

http://www.ibm.com/developerworks/webservices/library/ws-soa-design1/

 

OASIS WSBPEL

http://www.oasis-open.org/home/index.php

 

Livro “Fundamentals of Object-Oriented Design in UML”

by Meilir Page-Jones

 

Livro “Service-Oriented Architecture (SOA): Concepts, Technology, and Design” – Thomas Erl - Prentice Hall