Esse é o segundo de uma série de artigos do nosso blog que estão abordando o tema SOA, conceito antigo e moderno que está enraizado nas atividades cotidianas da iProcess.
No primeiro post nós respondemos à pergunta: o que é SOA? Já nesse segundo gostaríamos de responder outra pergunta: o que é um serviço?
O que é um serviço?
O conceito de serviço surge como uma forma de resolver alguns problemas da integração de sistemas. No entanto, agrega a idéia de alinhamento com o negócio.
Assim, podemos dizer que um serviço:
- é uma unidade de software que executa uma função de negócio;
- estabelece um contrato bem definido: entradas, saídas, restrições, premissas, comportamento (lógica de negócio);
- esconde do seu consumidor todos os detalhes de implementação, incluindo infraestrutura e lógica interna;
- é auto-contido, independente e modular;
- pode ser reutilizado em outros contextos;
- realiza uma função de negócio integralmente, de forma consistente;
- pode ser disponibilizado e administrado individualmente;
- pode ser combinado com outros serviços para compor um serviço de mais alto nível ou um processo de negócio;
A arquitetura orientada a serviços desenvolveu-se com a idéia de basear a construção de aplicações em torno do conceito de serviços, facilitada pelo amadurecimento de padrões como XML e Web Services.
Características de um serviço
Algumas das características de um serviço são:
- o contato com o serviço é feito exclusivamente através da sua interface;
- o consumidor do serviço não necessita saber detalhes do funcionamento interno do serviço;
- podem ser síncronos ou assíncronos;
- encapsulado, modular e reutilizável;
- o contrato:
- descreve o seu objetivo e o seu comportamento;
- define os parâmetros de nível de serviço (disponibilidade, confiabilidade, etc).
A interface representa um “contrato” entre o provedor e o consumidor do serviço e deve identificar pelo menos:
- Nome do serviço
- Entradas
- Saídas
- Comportamento esperado
- Comportamento em caso de exceções
A interface deve ser projetada de modo independente da implementação. Ou seja, pergunte-se: “se a implementação for alterada, poderei manter a mesma interface?”. E isto é realmente muito importante! Caso contrário, o baixo acoplamento, fundamental para SOA, não existirá.
A composição de um serviço pode ser representada da seguinte maneira:
Onde:
- Consumidor: entidade interessada em utilizar o serviço;
- Interface: acordo para interação entre consumidor e provedor;
- Provedor do serviço: entidade responsável por oferecer o serviço;
- Implementação: lógica de negócio que executa os passos para atingir os objetivos do serviço.
Exemplos de serviços
Como resultado, podemos citar alguns exemplos de serviços:
Aprofundando um pouco mais, vamos citar um exemplo de como seria a definição completa de um serviço:
- Ação: Verificar crédito do cliente
- Nome do serviço: VerificarCreditoCliente
- Comportamente Esperado: Receber o CNPJ do requisitante e do Cliente e retornar a situação cadastral e do seu crédito
- Entrada: CNPJRequisitante (numerico), CNPJCliente (numerico)
- Saída: CNPJRequisitante (numerico), CNPJCliente (numerico), ClienteAtivo (true/false), ValorCredito (numerico), UltimaAtualizacao (data)
- Exceções:
- Negócio: RequisitanteInvalido, ClienteInvalido
- Técnico: ServicoInativo, TimeOut
Citamos agora o exemplo de um sistema que expõe 2 serviços: RegistroAusencia e ConsultaSalario. Sempre como exemplo, o primeiro serviço é utilizados pelos processos de viagem e licença médica e o segundo pelo sistema de folha de pagamento.
No contexto SOA, é muito importante não confundir uma sub-rotina reutilizável de software com um serviço. Para exemplificar isso, citamos um contra-exemplo de serviço: “validar CPF”. A ação não é adequada para ser serviço, já que não é uma função de negócio por si só e sim um algoritmo, uma peça de software.
Uma opção seria essa peça de software fazer parte de um serviço chamado “verificar integridade dos dados cadastrais”. O serviço poderia verificar a validade do CPF, o preenchimento correto de todos os campos, a consistência entre eles, a coerência com outros dados da base, etc.
Outros contra-exemplos de serviço:
- Gravar registro no sistema XYZ → acoplado à infraestrutura;
- Preparar dados → não executa uma função completa.
Confusões comuns sobre o conceito de serviço
Serviços X WebServices
WebServices é uma tecnologia de comunicação, utilizada para expor as funcionalidades de um componente de software. Serviços beneficiam-se da tecnologia dos WebServices para prover transparência da implementação (baixo acoplamento).
Serviços X componentes de software
Componentes de software são elementos que implementam alguma lógica. Combinados, podem fornecer funções de negócio, mas isolados podem ser apenas funções de infraestrutura, de comunicação, de manipulação de dados, ou até mesmo de negócio.
Um serviço não deve obrigatoriamente ser implementado como uma função única de software. Pelo contrário. As boas práticas de Engenharia de Software, como a componentização e a orientação a objetos, podem e devem ser utilizadas.
Vários componentes de software (como a validação do CPF) podem ser combinados para implementar um serviço de negócio.
Em breve vamos continuar a tratar desse assunto, trazendo sugestões para auxiliar a escolha de bons serviços candidatos.
5 Responses
Gostaria de saber as referências que vocês utilizam para identificação de serviços. quais técnicas?
Obrigado Paulo
Olá, Paulo.
Antes de mais nada, desculpe pela demora para responder.
No nosso blog temos um post que fala sobre a descoberta de serviços. Ele está disponível em https://blog.iprocess.com.br/2012/10/soa-escolhendo-e-definindo-bons-servicos-candidatos/
De qualquer forma, utilizamos normalmente duas abordagens:
* Abordagem top-down: Essa abordagem identifica a necessidade de um serviço através da análise de processos de negócio ou das interações com entidades externas. Ela normalmente é realizada pelo analista de negócio em conjunto com arquiteto de sistemas e tem como principal benefício o alinhamento mais natural com o negócio. Se o serviço (ou as capacidades necessárias) já existir em um sistema legado, será necessário procurá-lo e extraí-lo. Se o serviço ainda não existir, é necessário construí-lo.
* Abordagem bottom-up: serviços (ou capacidades) identificados através dos pontos de integração entre sistemas ou das funcionalidades já disponíveis nos sistemas atuais. Nessa abordagem corre-se o risco de criar serviços que não representam uma função de negócio ou que tenham acoplamento com a implementação. Porém, pode ser uma boa opção quando existem muitos problemas de integração spaghetti ou se deseja preparar para substituição de algum sistema de back-end.
Você poderá ver mais detalhes no post. Fique à vontade para nos enviar novas dúvidas.
Eduardo Cordeiro
Achei o artigo muito válido. Abordagem clara sobre o assunto e parte do que precisava, conseguir encontrar aqui. Obrigado.