b'\n_START_ARTICLE_\nRMI\n_START_PARAGRAPH_\nO RMI (Remote Method Invocation) \xc3\xa9 uma interface de programa\xc3\xa7\xc3\xa3o que permite a execu\xc3\xa7\xc3\xa3o de chamadas remotas no estilo RPC em aplica\xc3\xa7\xc3\xb5es desenvolvidas em Java. \xc3\x89 uma das abordagens da plataforma Java para prover as funcionalidades de uma plataforma de objetos distribu\xc3\xaddos._NEWLINE_Esse sistema de objetos distribu\xc3\xaddos faz parte do n\xc3\xbacleo b\xc3\xa1sico de Java desde a vers\xc3\xa3o JDK 1.1, com sua API sendo especificada atrav\xc3\xa9s do pacote java.rmi e seus subpacotes._NEWLINE_Atrav\xc3\xa9s da utiliza\xc3\xa7\xc3\xa3o da arquitetura RMI, \xc3\xa9 poss\xc3\xadvel que um objeto ativo em uma m\xc3\xa1quina virtual Java possa interagir com objetos de outras m\xc3\xa1quinas virtuais Java, independentemente da localiza\xc3\xa7\xc3\xa3o dessas m\xc3\xa1quinas virtuais._NEWLINE_A API RMI fornece ferramentas para que seja poss\xc3\xadvel ao programador desenvolver uma aplica\xc3\xa7\xc3\xa3o sem se preocupar com detalhes de comunica\xc3\xa7\xc3\xa3o entre os diversos poss\xc3\xadveis elementos (hosts) de um sistema.\n_START_SECTION_\nVantagens do RMI\n_START_PARAGRAPH_\nUma das principais vantagens do RMI \xc3\xa9 sua capacidade de baixar o c\xc3\xb3digo de um objeto, caso a classe desse objeto n\xc3\xa3o seja definida m\xc3\xa1quina virtual do receptor. Os tipos e o comportamento de um objeto, previamente dispon\xc3\xadveis apenas em uma m\xc3\xa1quina virtual, agora podem ser transmitidos para outra m\xc3\xa1quina virtual, possivelmente remota. Essa funcionalidade do RMI permite que o c\xc3\xb3digo da aplica\xc3\xa7\xc3\xa3o seja atualizado dinamicamente, sem a necessidade de recompilar o c\xc3\xb3digo.\n_START_SECTION_\nNomeando Objetos Remotos\n_START_PARAGRAPH_\nOs clientes acham os servi\xc3\xa7os remotos usando o servi\xc3\xa7o de nomea\xc3\xa7\xc3\xa3o ou diret\xc3\xb3rio (naming or directory). Isso parece um pouco redundante, mas o servi\xc3\xa7o de nomea\xc3\xa7\xc3\xa3o ou diret\xc3\xb3rio roda como um endere\xc3\xa7o bem formado (host:port). O RMI pode usar diferentes tipos de servi\xc3\xa7os de diret\xc3\xb3rio, incluindo o JNDI. O pr\xc3\xb3prio RMI inclui um simples servi\xc3\xa7o, chamado de RMI Registry. O RMI Registry roda em cada maquina que hospeda o servi\xc3\xa7o remoto, por defini\xc3\xa7\xc3\xa3o na porta 1099. Numa m\xc3\xa1quina host, um programa servidor cria um servi\xc3\xa7o remoto, primeiramente criando o objeto que implemente aquele servi\xc3\xa7o. Em seguida ele exporta aquele objeto para o RMI. Quando o objeto \xc3\xa9 exportado o RMI cria um servi\xc3\xa7o que aguarda as conex\xc3\xb5es do cliente. O servidor registra o objeto no RMI Registry, com um nome p\xc3\xbablico. No lado do cliente o RMI Registry \xc3\xa9 acessado atrav\xc3\xa9s da classe est\xc3\xa1tica Naming. Ela prov\xc3\xa9m o m\xc3\xa9todo lookup( ), que o cliente usa para requisitar o registro. Esse m\xc3\xa9todo aceita a URL que especifica o nome do servidor e o nome do servi\xc3\xa7o desejado. O m\xc3\xa9todo retorna uma refer\xc3\xaancia remota para o objeto do servi\xc3\xa7o. A URL \xc3\xa9 formada como seguinte:_NEWLINE_ rmi://[host_name]:[port_number]/[service_name]\n_START_SECTION_\nSerializa\xc3\xa7\xc3\xa3o\n_START_PARAGRAPH_\nA capacidade de armazenar e recuperar objetos em JAVA \xc3\xa9 essencial quando se fala de RMI. A maneira encontrada para armazenar esses objetos em uma forma serializada sem ocupar muita mem\xc3\xb3ria foi representar os estados do objeto suficientes para reconstru\xc3\xad-lo._NEWLINE_Objetos serializados em Java devem ser capazes de identificar e verificar a classe Java da qual eles derivam e recuperar seu conte\xc3\xbado para criar uma nova inst\xc3\xa2ncia._NEWLINE_Freq\xc3\xbcentemente, objetos armazenados fazem refer\xc3\xaancia a outros objetos. Esses outros objetos tamb\xc3\xa9m devem ser armazenados e na recupera\xc3\xa7\xc3\xa3o, todos devem ser desarmazenados ao mesmo tempo, para que as rela\xc3\xa7\xc3\xb5es entre ele n\xc3\xa3o se percam.\n_START_SECTION_\nCamadas de Software do Sistema RMI\n_START_PARAGRAPH_\nA implementa\xc3\xa7\xc3\xa3o do RMI \xc3\xa9 essencialmente feita de tr\xc3\xaas camadas de abstra\xc3\xa7\xc3\xa3o. A camada Stub e Skeleton est\xc3\xa1 abaixo dos olhos do desenvolvedor. Esta camada intercepta as chamadas de m\xc3\xa9todos feitas pelo cliente para que a vari\xc3\xa1vel de refer\xc3\xaancia da interface redirecione essas chamadas para o servi\xc3\xa7o RMI remoto._NEWLINE_A pr\xc3\xb3xima camada \xc3\xa9 a Remote Reference Layer. Esta camada sabe como interpretar e gerenciar refer\xc3\xaancias feitas dos clientes para os objetos do servi\xc3\xa7o remoto. A conex\xc3\xa3o do cliente ao servidor \xc3\xa9 Unicast (uma-para-um)._NEWLINE_A camada de transporte \xc3\xa9 baseada nas conex\xc3\xb5es TCP/IP entre as maquinas em uma rede. Usando essa arquitetura de camadas, cada uma das camadas poderia ser facilmente melhorada ou substitu\xc3\xadda sem afetar o resto do sistema. Por exemplo, a camada de transporte poderia ser substitu\xc3\xadda por uma camada que implemente conex\xc3\xb5es UDP/IP, sem afetar as camadas superiores.\n_START_SECTION_\nCamada de Refer\xc3\xaancias Remotas\n_START_PARAGRAPH_\nEsta camada mant\xc3\xa9m as refer\xc3\xaancia entre os clientes e os objectos remotos e estabelece a sem\xc3\xa2ntica da liga\xc3\xa7\xc3\xa3o RMI. As refer\xc3\xaancias mantidas referem-se a liga\xc3\xa7\xc3\xa3o unicast, ou seja um proxy para um objecto remoto (i.e. um Stub para um Skeleton). Esta camada funciona como um router entre o cliente e os (eventuais) v\xc3\xa1rios objectos remotos._NEWLINE_Por enquanto, o RMI n\xc3\xa3o suporta directamente outras sem\xc3\xa2nticas de comunica\xc3\xa7\xc3\xa3o como por exemplo multi-cast. Numa situa\xc3\xa7\xc3\xa3o de multi-cast, um \xc3\xbanico proxy poderia chamar em simult\xc3\xa2neo v\xc3\xa1rias inst\xc3\xa2ncias de objectos remotos (localizadas eventualmente em diferentes computadores) e esperar pela primeira resposta retornada.\n_START_SECTION_\nCamada de Transporte\n_START_PARAGRAPH_\nEsta camada lida diretamente com a comunica\xc3\xa7\xc3\xa3o entre as v\xc3\xa1rias JVM\'s, usando TCP/IP. \xc3\x89 importante referir que mesmo que as JVM\'s sejam executadas no mesmo computador, o RMI recorre sempre \xc3\xa0 comunica\xc3\xa7\xc3\xa3o TCP/IP. Isto significa que \xc3\xa9 sempre \xc3\xa9 necess\xc3\xa1rio possuir uma interface de rede funcional para se poder utilizar RMI (mesmo tendo a aplica\xc3\xa7\xc3\xa3o cliente e a aplica\xc3\xa7\xc3\xa3o servidora a executar no mesmo computador)._NEWLINE_Sobre a pilha TCP/IP o RMI possui um protocolo denominado JRMP, Java Remote Method Protocol e que permite ultrapassar alguns obst\xc3\xa1culos que podem surgir na comunica\xc3\xa7\xc3\xa3o de rede via TCP/IP. Por exemplo, o JRMP permite multiplexar v\xc3\xa1rias liga\xc3\xa7\xc3\xb5es TCP/IP numa \xc3\xbanica liga\xc3\xa7\xc3\xa3o TCP/IP ultrapassando imposi\xc3\xa7\xc3\xb5es de utiliza\xc3\xa7\xc3\xa3o de apenas uma liga\xc3\xa7\xc3\xa3o em alguns ambientes (ex.: certos browsers a correr Applets RMI)\n_START_SECTION_\nSeguran\xc3\xa7a\n_START_PARAGRAPH_\nEm rela\xc3\xa7\xc3\xa3o a seguran\xc3\xa7a, o RMI fornece o "RMISecurityManager", sem o qual objetos locais se tornam incapazes de baixar c\xc3\xb3digo ou utilizar m\xc3\xa9todos remotos. O RMISecurityManager Segue o modelo de seguran\xc3\xa7a do JDK 1.6._NEWLINE_No modelo de seguran\xc3\xa7a do JDK 1.6, o c\xc3\xb3digo, independentemente se \xc3\xa9 local ou remoto, \xc3\xa9 sempre executado sob uma pol\xc3\xadtica de seguran\xc3\xa7a. A pol\xc3\xadtica de seguran\xc3\xa7a define um conjunto de permiss\xc3\xb5es dispon\xc3\xadveis para o c\xc3\xb3digo. Cada permiss\xc3\xa3o define um acesso a um recurso em particular, como por exemplo, permiss\xc3\xa3o de leitura ou escrita a um diret\xc3\xb3rio espec\xc3\xadfico ou permiss\xc3\xa3o de conex\xc3\xa3o para um host e porta._NEWLINE_O sistema de execu\xc3\xa7\xc3\xa3o organiza o c\xc3\xb3digo em dom\xc3\xadnios individuais, cada dom\xc3\xadnio possui seu conjunto de classes, sendo que as inst\xc3\xa2ncias dessas classes possuem o mesmo conjunto de permiss\xc3\xb5es. Um dom\xc3\xadnio pode ser configurado de forma que applets rodem em um ambiente restrito, de acordo com o administrador da rede. As aplica\xc3\xa7\xc3\xb5es "stand alone" rodam sem nenhuma restri\xc3\xa7\xc3\xa3o, por\xc3\xa9m elas podem ser submetidas a uma pol\xc3\xadtica de seguran\xc3\xa7a. No caso do RMI, os objetos remotos s\xc3\xa3o obrigados a implementar uma pol\xc3\xadtica de seguran\xc3\xa7a.\n_START_SECTION_\nSSL em RMI\n_START_PARAGRAPH_\nO RMI permite ao programador usar "sockets" personalizados, ou seja, com RMI, \xc3\xa9 poss\xc3\xadvel que cada objeto use um tipo diferente de "socket" para sua conex\xc3\xb5es RMI. Caso o programador queira adicionar mais seguran\xc3\xa7a ao seu sistema, ele pode usar SSL como protocolo de comunica\xc3\xa7\xc3\xa3o abaixo do RMI, ou caso n\xc3\xa3o esteja interessado, pode usar simplesmente TCP com os mecanismos de seguran\xc3\xa7a providos pelo pr\xc3\xb3prio RMI.'