Labs SD >

Web Services II

Objetivos

Projeto:

UDDI

Para a publicação e pesquisa de Web Services usa-se um servidor de nomes que implementa a norma UDDI (Universal Description, Discovery and Integration).

Comparando com as outras tecnologias de chamada remota: no Sun RPC usa-se o rpcbind, no Java RMI usa-se o rmiregistry, nos Web Services usa-se o UDDI.

Mais informação: UDDI

JAX-R

Para comunicar com servidores UDDI, existe a biblioteca JAX-R (Java API for XML Registries), que permite publicar, pesquisar e eliminar registos de Web Services.

O esquema de dados do UDDI é consideravelmente mais rico do que o habitual num servidor de nomes, com diversas entidades e relações, que permitem guardar informação de negócio sobre a organização e os seus serviços. Como consequência, o JAX-R é uma biblioteca verbosa, que obriga a escrever muitas linhas de código para realizar as tarefas mais habituais de registo e de pesquisa.

Mais informação: JAX-R

UDDI Naming

Para tornar a utilização do UDDI mais simples foi criada a biblioteca UDDINaming que simplifica o esquema de dados para suportar apenas: 1 organização, 1 serviço e 1 implementação.
Esta biblioteca, cujo código está disponível para consulta e modificação, torna o registo e pesquisa de serviços mais sucinto.

Mais informação: UDDINaming JavaDoc

 


Exemplo

O exemplo seguinte é um Web Service que se regista no UDDI:

Nota: na aula passada vimos Web Services construídos a partir do contrato WSDL, mas os serviços podem também ser construídos a partir de código Java já existente, numa abordagem que se designa por implementation-first.
No exemplo acima segue-se esta abordagem: a interface Hello foi anotada com @WebService e o WSDL é depois gerado automaticamente quando o servidor é lançado.

Seguem-se instruções detalhadas para construir e executar o exemplo.

jUDDI (Java UDDI)

  1. O servidor de nomes a utilizar é o jUDDI alojado na RNL.
  2. Para que a configuração seja feita para todos os exemplos, pode-se criar um perfil Maven que sobrepõe o valor da propriedade para todos os projetos do utilizador. Para isso, criar um ficheiro settings.xml na pasta .m2 da home do utilizador.

UDDINaming

  1. Obter o código da biblioteca UDDINaming:
  2. Instalar o módulo no repositório Maven local:

Servidor JAX-WS

  1. Construir e executar o servidor:
  2. Confirmar que o servidor está à espera de pedidos,
    consultando o contrato que é gerado automaticamente:

Cliente JAX-WS

  1. Construir o cliente:
  2. Executar o cliente:

Resumindo:
primeiro foi configurado o servidor de nomes jUDDI da RNL.
Depois foi instalada a biblioteca UDDINaming no repositório Maven local, que testa também o funcionamento do servidor jUDDI.
Em seguida, foi construído e iniciado o servidor, que se regista no jUDDI e fica à espera de pedidos no endpoint address.
Finalmente, o cliente obtém o WSDL a partir do servidor e gera o código de invocação que permite depois fazer invocações remotas.

Visão global do exemplo Hello World: UML

 


Exercício

Segunda parte do Projeto

Nesta parte devem surgir múltiplos fornecedores e aparece também o serviço mediator-ws que os vai pesquisar e depois consultar. Assim sendo, o UDDI torna-se útil e necessário.

O ponto de continuação contém novos ficheiros (serão disponibilizados após a primeira entrega). Editar os pom.xml para substituir CXX pelo identificador do grupo.

Pretende-se agora modificar supplier-ws UML para se registar no UDDI.

  1. Adicionar a dependência para a biblioteca UDDINaming:
        ...
        <!-- UDDI Naming -->
        <dependency>
            <groupId>pt.ulisboa.tecnico.sdis</groupId>
            <artifactId>uddi-naming</artifactId>
            <version>1.2</version>
        </dependency>
        ...
    
  2. A SupplierApp deverá receber o endereço do UDDI e o nome do serviço como argumento.
  3. O SupplierEndpointManager deverá ter um novo construtor que recebe o endereço do UDDI e o nome do serviço, e que efetua o registo (e apaga quando o serviço termina).
  4. Feitas as alterações, o servidor deverá iniciar-se, registar-se no UDDI e depois ficar à espera de pedidos.

"Multiplicar" o supplier-ws.

  1. A forma mais simples de permitir múltiplas instâncias do fornecedor é parametrizar as propriedades de configuração com um número de instância.
  2. Adicionar as seguintes definições ao pom.xml (substituir CXX pelo identificador do grupo):
        ...
        <ws.i>1</ws.i>
    
        <ws.host>localhost</ws.host>
        <ws.port>808${ws.i}</ws.port>
        <ws.url>http://${ws.host}:${ws.port}/supplier-ws/endpoint</ws.url>
        
        <ws.name>CXX_Supplier${ws.i}</ws.name>
        ...
    
  3. Para lançar um fornecedor:
  4. Para lançar outro fornecedor:

Pretende-se agora modificar supplier-ws-cli UML para pesquisar no UDDI.

  1. Adicionar a dependência para a biblioteca UDDINaming.
  2. O SupplierClient deverá ter um novo construtor que recebe o endereço do UDDI e o nome do serviço a contactar, e que efetua a pesquisa para localizar o servidor.
  3. A SupplierClientApp deverá receber o endereço do UDDI e o nome do serviço como argumento.

Vamos construir uma operação simples do servidor mediator-ws que contacta os fornecedores.

  1. O mediator-ws vai ser cliente de supplier-ws.
    Em vez de repetir código, vamos usar o objeto SupplierClient, já desenvolvido e testado.

    1. Em primeiro lugar, instalar o módulo do cliente do fornecedor:
      cd supplier-ws-cli
      mvn install
    2. Depois, acrescentar a dependência Maven no mediator-ws/pom.xml (substituir CXX pelo identificador do grupo):
          ...
          <dependency>
              <groupId>org.komparator.CXX</groupId>
              <artifactId>supplier-ws-cli</artifactId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
          ...
      
      O sistema em funcionamento terá três processos:
      • O cliente de testes do mediator;
      • O mediator (que engloba o código dos módulos mediator-ws e supplier-ws-cli);
      • O(s) servidor(es) do(s) fornecedor(es).
      • UML

  2. Concretizar a operação ping do mediador.

Finalmente, usar o mediator-ws-cli para chamar o ping que vai tocar o mediador e todos os fornecedores.

O que falta fazer?

Continuação de bom trabalho!


© Docentes de Sistemas Distribuídos, Dep. Eng. Informática, Técnico Lisboa