Submarino.com.br

Service

Objetivo

Estabelecer um contrato implementável de diferentes formas.

Propósito

Em uma aplicação é comum centralizarmos as mecanicas que são aplicadas aos dados de forma independente dos dados. No passado fizemos isto com rotinas, procedimentos e funções. Passamos alguns parametros e esperamos algum resultado; explicita (funções) ou implicitamente (rotinas). Nos dias de hoje com a Orientação a Objetos fazemos o mesmo utilizando métodos.

Tradicionalmente os métodos produzem resultados sobre os dados do objeto a que estão associados, mas nem sempre assim é. Um método que calcule a soma de dois numeros irá retornar um resultado em que nada altera os numeros originais. Diferenciamos o que chamamos de objeto sem estado (stateless) e objeto com estado (statefull).

Serviços são objetos que produzem resultados (como calculos) ou mudanças no estado da aplicação, por exemplo guardando dados em um banco de dados. Contudo um serviço é um pouco mais que simples métodos que fazem coisas. Serviços , como no mundo real, sao definidos através de contratos assinados por duas ou mais partes.

O propósito do padrão Service é definir separadamente o contrato do serviço e o provedor do serviço ( a implementação). Desta forma, diveros e diferentes formas de prover o mesmo serviço podem ser realizadas sem modificar o contrato. Com isto, o implementador pode modificar a sua implementação sem que o cliente (que usa o serviço) tenha que modificar as suas invocações.

Implementação

Ilustração 1:

A implementação de um serviço tem duas fases. A primeira é definir o contrato. A segunda, definir a implementação. A primeira fase passa por definir uma simples interfaces. O quê o serviço pode fazer, quais argumentos necessita e quais resultados produz e que exceções podem acontecer. Em java isto é conseguido com uma interface java onde são declarados os métodos que é possivel invocar no serviço. A interface passa a ser um documento formal, onde inclusive a informação contida no javadoc deve ser seguida à risca.

A segunda fase é implementar a interface. Para isso basta criar um classe que implemente a interface e implemente cada método da forma acordada na interface. Multiplas implementações do mesmo serviço podem ser feitas, com propositos diferentes para acomudar diferentes necessidades. Por exemplo, podemos pensar em um serviço de cache com uma implementação que mantém tudo em memoria e uma outra é suficiente esperta para passivar (mover da memoria para o disco) os dados quando necessário.

Web Services

A parte mais importante de um Serviço é que ele possa ser acessado pelo seu contrato. Em teoria não importaria com que tecnologia esse contrato é implementado. É claro, que na prática, isso é uma limitação. Estabelecer o contrato com uma interface Java significa que nenhuma outra tecnologia pode ter acesso a ele, já que uma interface java só funciona em uma JVM.

O assunto de prover contratos "universais" é antigo e várias soluções foram encontradas ao longo dos anos. Tecnologias como CORBA e SOAP são duas expressões das tentativas de desacoplar a definição do contrato, da representação fisica do contrato. Atualmente o padrão de web services que se utiliza do protocolo HTTP para prover comunicação fisica e de um segundo padrão de dados como XML ou JSON para prover a logica entre dois extremos do servico é a mais bem sucessida e amplamente utilizada.

Com a facilidade de uso de Serviços e a facilidade de compor serviços utilizando serviços "menores", trouxe a ideia de arquitaturas orientadas a serviços (SOA). SOA não é sobre usar web services com SOAP e XML é sobre usar serviços com contratos agnósticos em que se inclui aqueles definidos com SOAP e XML , mas também os definidos com interfaces java ou .net ou qualquer outra tecnologia.

EJB

No mundo java, não precisamos ir muito longe para encontra exemplos do uso de serviços e SOA. Toda a especificação EJB é baseada em serviços. Os chamados Stateless Enterprise Java Beans e Statefull Enterprise Java Beans são exemplos claros de serviços em java e a especificação JEE nada mais é do que um sabor especifico de SOA.

EJB Statless de serviço criados em ambiente JEE podem ser fácilmente publicados como web services SOAP e portanto utilizados por outras plataformas.

DAO

O padrão DAO(Data Acess Object) é também uma especialização do padrão Service fornecendo mecanismos para encontrar dados em algum repositorio de dados. É por isso que uma DAO sempre é criado por meio de uma interface + uma implementação.

Discussão

Service é um dos padrões mais utilizamos no dia-a-dias de aplicações comerciais , escritas, ou não, para JEE, mas do que somos menos conscientes. Entender o conceito do padrão Service é fundamental para entender arquitetura de sistemas corporativos e de larga escala, já que os serviços são os componentes essenciais destas arquiteturas. Entender este conceito é também o primeiro passo para entender a importancia de padrões como Proxy e tecnicas como AOP (Aspect Oriented Programming).

Por outro lado, não é toda a implementação com uma interface que é um serviço. Um componente vital para que algo seja considerado um serviço é o contrato, e o contrato tem que ser formal para que interface+implementação sejam instancias de um serviço.

Padrões associados

Service se relaciona a muitos outros padrões. O primeiro passo para usar um serviço é encontrar um implementação que possamos usar, isso nos remete para o padrão Service Locator que permite encapsular a logica de procura da implementação. A opção de encontrar a implementação do serviço em uma máquina diferente daquela onde o queremos usar é muito grande e isso nos leva ao uso do padrão Proxy que permite esconder todos os truques tecnicos para invocar o serviço remotamente ( com ou sem web services).

As implementações do serviço são normalmente registradas em algum ponto centralizado onde o Service Locator as possa encontrar. Isto nos remete ao uso de Registry.

É possivel criar serviços compondo outros serviços já previamentes existentes. Isso é normalmente feito com um serviço que simplifica as chamadas e trata o fluxo de invocar os diferentes serviços compostos. O padrão Service Façade ( mais conhecido apena como Façade) é utilizado para esta composição.

Finalmente, o padrão Service é o padrão por detrás da origem dos famosos DAOs. Um DAO nada mais é que um serviço especializado em trabalhar com dados. As mesmas regras que se aplicam a serviços se aplicam a DAOs, contudo, por motivos historicos e de tradição algumas restrições são feitas como por exemplo o uso remoto.