Labs SD >

Web Services II: UDDI

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 torna o registo e pesquisa de serviços mais sucinto. O código fonte está disponível para consulta e modificação.

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.
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. Para confirmar que o servidor está a funcionar e à espera de pedidos, consultar 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

Continuação do Projeto

Station

Nesta parte devem surgir múltiplas estações e aparece também o serviço binas-ws que vai comunicar com elas. Assim sendo, o UDDI torna-se útil e necessário.

Pretende-se agora modificar station-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 StationApp deverá receber o endereço do UDDI e o nome do serviço como argumento.
  3. O StationEndpointManager 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.

Lançar mais do que uma instância do station-ws.

  1. A forma mais simples de permitir múltiplas instâncias da estação é parametrizar as propriedades de configuração com um número de instância.
  2. No pom.xml é possível ver as seguintes definições (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}/station-ws/endpoint</ws.url>
    
        <ws.name>CXX_Station${ws.i}</ws.name>
        ...
    
  3. Para lançar uma station:
  4. Para lançar outra station:

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

  1. Adicionar a dependência para a biblioteca UDDINaming.
  2. O StationClient 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 StationClientApp deverá receber o endereço do UDDI e o nome do serviço como argumento.

Binas

Antes de continuar é necessário completar o esqueleto do web service Binas que faz parte do ponto de partida para o projeto.
No laboratório da semana passada criamos o esqueleto da estação, vamos aproveitar o mesmo guia.
O objectivo é ter uma implementação do Binas com todos os métodos vazios e um cliente que chame os métodos remotos.

Guia do laboratório anterior.

Vamos agora implementar uma operação simples do servidor binas-ws que contacta as estações através de um PING.

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

    1. Em primeiro lugar, instalar o módulo do cliente da station:
      cd station-ws-cli
      mvn install
    2. Depois, acrescentar a dependência Maven no binas-ws/pom.xml (substituir CXX pelo identificador do grupo):
          ...
          <dependency>
              <groupId>org.binas.CXX</groupId>
              <artifactId>station-ws-cli</artifactId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
          ...
      
      O sistema em funcionamento terá três processos:

  2. Concretizar a operação test_ping do binas.

Finalmente, usar o binas-ws-cli para chamar o ping que vai fazer ping ao próprio binas e todos as stations.

O que falta fazer?

Continuação de bom trabalho!


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