12 de May de 2009

Princípos Básicos de SOA – Serviços Abstraem a Lógica

Olá!

Após um tempo sem escrever, vou continuar explicando um pouco mais sobre os princípios básicos de SOA. Relembrando o que já foi escrito, passamos pelos primeiros três princípios, que tratam de serviços serem reutilizáveis, compartilharem um contrato formal e possuírem baixo acoplamento.

Hoje vou falar sobre o princípio que diz que os serviços devem abstrair a lógica nele contida. Ao final da explicação vou inserir um exemplo em JAVA para tentar ilustrar o princípio e facilitar a compreensão.

Serviços Abstraem a Lógica


4. Princípio: Serviços abstraem a lógica

  • O que é:
    • Serviços devem ser tratados como uma caixa preta, assim como componentes de um sistema. Assim sendo, a programação nele inclusa pode ser substituída a qualquer momento, sem afetar aqueles que o consomem.
    • Essa abstração deve existir tanto na linguagem de programação quanto na tecnologia, ou seja, os serviços devem tratar todas linguagens e tecnologias que o consomem da mesma forma, ignorando distinções como por exemplo big-endian ou little-endian (ordem dos bytes nas palavras).
  • Aspectos positivos:
    • Esse princípio é rotineiramente aplicado hoje em dia, não possui dificuldades em sua implementação;
    • Permite que agentes humanos interajam com sistemas complexos de forma simples, já que a suas interfaces são de simples compreensão.
  • Dificuldades:
    • Algumas dificuldades podem ser encontradas com linguagens mais antigas ou menos poderosas, como Cobol. O fato de serem menos complexas leva ao fato de poder exigir um certo esforço para converter os dados de modo a deixar as chamadas transparentes a qualquer consumidor.
  • Exemplo:
    • Situação inicial: Disponibilizamos um serviço que conta o número de verbos em um texto. Para isso, o serviço faz uma lista de palavras e, iterando essa lista, verifica quais são verbos, em um dicionário.
    •   public Integer numeroDeVerbos(String texto){
          // quebro o texto nos espaços em branco
          String [ ] arrayDePalavras = texto.split(" ");  
      
          int contador = 0; // contador de verbos
          for (int i = 0; i<arrayDePalavras.length; i++){
      
            // verifica se a palavra é verbo
            if ( PalavraEVerbo(arrayDePalavras[i]) ){
              // se a palavra é verbo, acrescenta 1 no contador
              contador ++;
            }
          }
      
          return contador;
        }

    • Situação secundária: Queremos disponibilizar, além do serviço inicial, dois novos serviços. Um deles que retornará o número de substantivos de um texto e o outro o número total de verbos + substantivos.
    • public Integer numeroDeVerbos(String texto){
      	String [ ] arrayTemp = contaVerbosESubstantivos(texto);
      	return arrayTemp[0];
      }
      
      public Integer numeroDeSubstantivos(String texto){
      	String [ ] arrayTemp = contaVerbosESubstantivos(texto);
      	return arrayTemp[1];
      }
      
      public Integer numeroDeVerbosESubstantivos(String texto){
      	String [ ] arrayTemp = contaVerbosESubstantivos(texto);
      	return arrayTemp[0] + arrayTemp[1];
      }
      
      /*
      * esse método retorna um array com 2 posições,
      * na primeira delas o total de verbos do texto, na segunda,
      * o total de substantivos
      */
      private Integer [ ] contaVerbosESubstantivos(String texto){
        // quebro o texto nos espaços em branco
        String [ ] arrayDePalavras = texto.split(" "); 
      
        int contadorDeVerbos = 0; // contador de verbos
        int contadorDeSubstantivos = 0; // contador de substantivos
      
        for (int i = 0; i<arrayDePalavras.length; i++){
          // verifica se a palavra é verbo
          if ( PalavraEVerbo(arrayDePalavras[i]) ){ 
      
            // se a palavra é verbo, acrescenta 1 no contador
            contadorDeVerbos ++;
      
          }else if(PalavraESubstantivo(arrayDePalavras[i])){
      
            // se a palavra é substantivo, acrescenta 1 no contador
            contadorDeSubstantivos ++; 
      
          }
        }
      
        Integer [ ] retorno = {contadorDeVerbos, contadorDeSubstantivos};
        return retorno;
      }

    • Na visão do usuário existem 2 novos serviços e o serviço antigo funciona como antes.
    • Na visão do implementador, ele abstraiu a lógica do serviço inicial (numeroDeVerbos) e criou um método privado (contaVerbosESubstantivos) para reutilizar o código nos novos métodos (numeroDeSubstantivos e numeroDeVerbosESubstantivos) e o primeiro serviço continuou tendo a mesma funcionalidade de antes.

Responses

Um bom design influência diretamente na abstração, publicando o mínimo necessário do backend encapsulado pelo serviço.

http://www.aqueleblogdesoa.com.br/2008/12/projeto-de-servicos-contratos-camadas-e-eda/

Olá, excelente seu post!
Como é possível garantir a disponibilidade e a vida útil de uma versão de um serviço?

Olá Suzanny, acredito a disponibilidade pode ser garantida utilizando-se de ferramental SOA, por exemplo, colocar o serviço num ESB (Enterprise Service Bus). Estas ferramentas tem funcionalidades que permitem publicar um mesmo serviço em mais de um servidor e fazer um balanceamento de carga, portanto, se um servidor cair o outro estará de pé. Isso ajuda a obter uma alta disponibilidade do serviço. Outra questão que pode aumentar disponibilidade usar o conceito de cloud computing. As clouds são grandes datacenter espalhados pelo mundo. Se um serviço estiver publicado em dois data center (ex: Brasil e Europa). Se um deles cair o outro ainda estará de pé.

Já sobre a questão vida útil acredito que uma boa modelagem utilizando os princípios apresentados neste blog irá ajudar a garantir isso. É claro que não podemos esquecer o alinhamento com o negócio.

Acredito que é isso.

Parabéns pelo post.

[...] último post escrevi sobre o princípio que define que serviços abstraem a lógica, com um exemplo de [...]

Leave a response

Your response: