Pergunta

Eu sou novo para ambos Web Services e RMI e eu me pergunto qual é a melhor maneira de fazer comunicação remota entre diferentes aplicações web, quando estas aplicações são todos escritos em Java, que é quando diferentes linguagens de programação não importa (o que seria a vantagem de WS).

Enquanto por um lado eu acho que há uma sobrecarga de desempenho ao utilizar serviços web (alguém tem alguns números para provar que?), Por outro lado, parece-me que os serviços web são muito mais fracamente acoplada e lata ser usado para implementar uma arquitetura mais orientada a serviços (SOA) (que não é possível com RMI, certo?).

Embora esta é uma questão geral, qual é a sua opinião?

Graças

Foi útil?

Solução

Os serviços web permitem uma arquitetura de baixo acoplamento. Com RMI, você tem que se certificar de que as definições de classe permanecer em sincronia em todas as instâncias de aplicações, o que significa que você sempre tem que implementar todos eles ao mesmo tempo, mesmo que apenas um deles é alterado (não necessariamente, mas é necessário, muitas vezes por causa de UUIDs de série e outros enfeites)

Além disso, não é muito escalável, que pode ser um problema se você quiser ter balanceadores de carga.

Em minha mente RMI funciona melhor para aplicações locais menores, que não estão relacionadas com a internet, mas ainda precisam ser dissociado. Eu usei-o a ter uma aplicação java que lida com comunicações electrónicas e eu estava bastante satisfeito com os resultados. Para outras aplicações que exigem implantação mais complexa e trabalho em toda a internet, eu prefiro usar serviços da web.

Outras dicas

Se você usa Web Services ou uma abordagem mais "nativo" depende do ambiente também. Se você tem que passar por um proxy ou algum firewall corporativo (s), Web Services são mais propensos ao trabalho, uma vez que estão confiando apenas em HTTP. RMI requer que você abrir outra porta para a sua aplicação que pode ser difícil (não tecnicamente, embora) em alguns ambientes ...

Se você sabe que esta questão não é um problema, você deve considerar o uso de RMI. O SOA não dependem da tecnologia tanto como em um bom design de serviço. Se você tem um container EJB, você pode chamar beans de sessão via RMI e, adicionalmente, expô-los como serviços web, se você realmente precisa, pelo caminho.

O desempenho depende dos dados que você está planejando para troca. Se você quiser enviar redes de objetos complexos a partir de uma aplicação para outra, é provavelmente mais rápido com RMI, uma vez que é transferido em um formato binário (geralmente). Se você tem algum tipo de texto / XML de qualquer forma de conteúdo, serviços web pode ser equivalente ou mesmo mais rápido, desde então você não precisa converter qualquer coisa em tudo (para comunicação).

HTH,
Martin

Uma coisa que favores WS sobre RMI é que WS funciona sobre HTTP porta 80/443 que normalmente não são bloqueados pelo firewalls, pode trabalhar por trás NAT etc. RMI tem um complexo protocolo de rede subjacente tanto que exige que você abrir portas RMI, e também pode não funcionar se o cliente é NATTED. Em segundo lugar, com RMI você está limitando o seu slef à comunicação JAVA-JAVA, enquanto que com Webservies não existe tal limitação. É muito mais fácil de depurar Webservices sobre o fio como os dados são SOAP / HTTP, que pode ser facilmente capturado via sniffing ferramentas para depuração. Eu não sei de uma maneira fácil de fazer isso ao longo do RMI. Além RMI é realmente muito antiga e não tem recebido muita atenção para últimos anos. Era grande volta nos dias quando CORBA era grande, e ambos RMI CORBA são realmente antiquadas tecnologias. A melhor opção é Webservices estilo REST.

A minha experiência com RMI e Web Serviços espelhos seus palpites acima. Em geral, o desempenho da RMI excede em muito os serviços web, mas a especificação de interface é declarado explicitamente para Web Services.

Note que nenhum desses protocolos requer que as aplicações em ambos os lados ser Java. Eu tenderia a usar Web Services quando eu tinha um ou mais parceiros externos que estavam implementando a interface, mas RMI se eu estava no controle de ambas as extremidades da conexão.

RMI pode ser a melhor direção, se você precisa para manter o estado complexo.

@ Martin Klinke

"O desempenho depende dos dados que você está planejando para troca. Se você quiser enviar redes de objetos complexos a partir de uma aplicação para outra, é provavelmente mais rápido com RMI, uma vez que é transferido em um formato binário (geralmente). Se você têm algum tipo de texto / XML de qualquer forma de conteúdo, serviços web pode ser equivalente ou mesmo mais rápido, desde então você não precisa converter qualquer coisa em tudo (para comunicação). "

Tanto quanto eu sei o problema de desempenho faz diferença durante a serialização-desserialização em outras palavras process.I triagem-demarshalling não estou certo de ambos estes termos são os mesmos btw Na programação distribuída, eu não estou falando sobre o processo que acontece na mesma JVM, é sobre como você copiar data.It é ou passar por valor ou passar por corresponde formato reference.Binary para passar por valor que significa copiar um objeto para remoto servidor em binaries.If você tem alguma dúvida até agora eu gostaria de ouvir

qual é a diferença entre o envio em formato binário e textual / xml conteúdo em termos de mobilizar-demarshalling ou serialização-desserialização?

Eu sou apenas guessin.It não depende de que tipo de dados que você send.Whatever tipo de dados que enviá-lo vai ser parte do processo de demarshalling de triagem e no final será enviado em binários certo?

aplausos Hakki

O que sobre Spring Remoting. Ele combina REST como protocolo HTTP com formato binário de RMI. Funciona perfeitamente para mim.

Como uma Primavera fanático e um expoente da SOA por muitos anos eu aconselho Primavera remoting. Este sabor de exportador serviço irá fazer o truque para RMI.

org.springframework.remoting.rmi.RmiServiceExporter

Outros transportes são naturalmente disponíveis. A coisa serialização é bastante manejável se você versão suas interfaces (end-points) e DTOs de forma sensata e gerenciar UUIDs de serialização corretamente. Nós postfix 'Alpha', 'Bravo' para nossas interfaces e objetos e incremento, decremento e reinventar onde e quando necessário. Nós também corrigir os nossos UUIDs de serialização a 1 e garantir mudanças são apenas addative, caso contrário, nós nos movemos de dizer, 'Bravo' para 'Charlie'. Todos managable em uma configuração de Empresa.

Para a Primavera Remoting (eu imaginei que você quer dizer HTTP Invoker), ambos os lados devem usar Spring, se for o caso, pode ser discutido.

Para uma aplicação Java para Java RMI é uma boa solutionö, JAX-RPC ou JAX-WS para comunicação Java para Java deve ser evitado se os clientes não estão sob seu controle ou pode mudar para outra plataforma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top