Pergunta

Nós temos um aplicativo de servidor Java que roda em um número de computadores, todos conectados à Internet, alguns firewalls. Precisamos atualizar remotamente os arquivos JAR e scripts de inicialização a partir de um local central, sem interrupção perceptível para o aplicativo em si.

O processo tem que ser autônoma e infalível (ou seja, não podemos dar ao luxo de quebrar o aplicativo devido a falhas de internet intempestivas).

No passado, usei uma variedade de scripts externos e utilitários para lidar com tarefas semelhantes, mas porque eles têm suas próprias dependências, o resultado é mais difícil de manter e menos portátil. Antes de fazer algo novo, eu quero obter algumas sugestões da comunidade.

Alguém já encontrou uma boa solução para isso já? Tem alguma idéia ou sugestão?

Só para esclarecer: Este aplicativo é um servidor, mas não para aplicações web (sem recipientes webapp ou WAR arquivos aqui). É apenas um programa Java autônomo.

Foi útil?

Solução

Você não especificou o tipo de aplicativos de servidor - Eu estou indo supor que você não está rodando aplicações web (como a implantação de uma guerra já faz o que você está falando, e você raramente precisa de um aplicativo da web para . fazer atualizações tipo tração Se você está falando de uma aplicação web, a seguinte discussão ainda pode aplicar - você só vai implementar a verificação de atualização e ping-pong para o arquivo WAR em vez de arquivos individuais)

.

Você pode querer dar uma olhada em jnlp - WebStart é baseado neste (esta é uma tecnologia de implantação aplicativo cliente), mas eu tenho certeza de que poderia ser adaptado para realizar atualizações de um aplicativo de tipo de servidor. Independentemente disso, jnlp faz um trabalho bom bonito de fornecimento de descritores que podem ser usados ??para fazer o download versões necessárias de JARs necessários ...

Algumas reflexões gerais sobre este (temos vários aplicativos no mesmo balde, e está considerando um mecanismo de atualização automática):

  1. Considere ter um arquivo bootstrap.jar que é capaz de ler um arquivo jnlp e download necessárias / frascos atualizados antes de lançar a aplicação.

  2. arquivos

    JAR pode ser atualizados mesmo quando um aplicativo está em execução (pelo menos no Windows, e que é o sistema operacional mais provável de fechaduras preensão sobre a execução de arquivos). Você pode ter problemas se você estiver usando carregadores de classe personalizada, ou você tem um monte de JARs que podem ser carregadas ou descarregadas a qualquer momento, mas se você criar mecanismos para evitar isso, então substituindo JARs em seguida, re-lançar o aplicativo deve ser suficiente para a atualização.

  3. Mesmo que seja possível JARs sobrescrever, você pode querer considerar uma abordagem de ping-pong para o seu caminho lib (se você não tiver o app lançador configurado para auto-ler todos os arquivos jar no lib pasta e adicioná-los para o caminho da classe automaticamente, então isso é algo que você realmente quer fazer). Aqui está como funciona o ping-pong:

lançamentos e olhares aplicativo em lib-ping \ version.properties e lib-pong \ version.properties e determina que é mais recente. Digamos que lib-ping tem uma versão posterior. As pesquisas Launcher para lib-ping * .jar e adiciona esses arquivos para o PC durante o lançamento. Quando você faz uma atualização, você baixar arquivos jar em lib-pong (ou copiar arquivos jar de lib-ping se você quiser economizar largura de banda e o JAR não realmente mudar - esta é raramente vale o esforço, embora!). Depois de ter todos os JARs copiados para lib-pong, a última coisa que você faz é criar o arquivo version.properties (que forma uma atualização interrompida que resulta em uma pasta lib parcial pode ser detectado e purgado). Finalmente, você re-iniciar o aplicativo, e picaretas de bootstrap-se que lib-pong é o classpath desejado.

  1. ping-pong, como descrito acima permite um roll-back. Se você projetá-lo corretamente, você pode ter um pedaço de seu aplicativo que você teste os pedaços fora e depois nunca mudar isso verifica se deve roll-back uma determinada versão. Dessa forma, se você fizer asneira e implantar algo que quebra o app, você pode invalidar a versão. Esta parte do aplicativo só tem que excluir o arquivo version.properties do mau pasta lib- *, em seguida, re-lançamento. É importante manter isso simples parte de terra, porque é o seu falha de segurança.

  2. Você pode ter mais de 2 pastas (em vez de pingue / pong, só tem lib-AAAAMMDD e purgar todos, mas o mais novo 5, por exemplo). Isso permite mais avançado (mas mais complicado!) Reversão de JARs.

Outras dicas

Você deve definitivamente dar uma olhada em OSGi, foi criado apenas para estes casos (especialmente para produtos embutidos) e é utilizado por um grande número de empresas. Você pode atualizar jar "pacotes", adicionar e removê-los, enquanto o aplicativo está sendo executado. Eu não usei isso mesmo, então eu não sei sobre a qualidade das estruturas de código aberto / servidores, mas aqui é um monte de links úteis para você começar:

http://www.osgi.org/Main/HomePage
http://www.aqute.biz/Code/Bnd
http://blog.springsource.com/2008/02/18 / criar-osgi-pacotes /
http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html

Eu recomendo Capistrano para implantação multi-servidor. Enquanto ele é construído para a implantação Rails apps, eu já vi isso usado com sucesso para implantar aplicativos Java.

Link: Capistrano 2.0 Não apenas para Rails

Jars não pode ser modificado enquanto o JVM está sendo executado em cima dela e irá resultar em erros. Eu tentei tarefas semelhantes e o melhor que eu vim com está fazendo uma cópia do Jar atualizado e transição o script de inicialização para olhar nesse Jar. Depois de ter a Jar atualizado, iniciá-lo e esperar no velho Jar ao fim após dar a ele o sinal para fazê-lo. Infelizmente, isto significa uma perda de GUI etc. por um segundo, mas a serialização a maioria das estruturas em java é fácil ea GUI atual poderia ser transferido para o aplicativo atualizado antes de realmente fechar (algumas coisas podem não ser que serializado!).

É muito difícil fazer a atualização atômica, especialmente se você tiver qualquer actualização da base de dados para fazer.

Mas, se você não fizer isso, o que você pode fazer é primeiro Verifique se o seu aplicativo pode ser executado a partir de um caminho relativo. Ou seja, você pode colocar seu aplicativo em algum diretório e todos os arquivos importantes são encontrados em relação à localização, de modo que se o local de instalação real não é realmente importante.

Em seguida, duplique sua instalação. Agora, você tem a versão "correr" e você tem a versão "nova".

Atualização da versão "nova" usando qualquer tecnologia que você gosta (FTP, rsync, fita de papel, seja qual for o seu barco flutua).

Verifique sua instalação. (Somas de verificação, testes de unidade rápidas, o que você precisa - mesmo iniciá-lo em uma porta de teste se quiser)

Quando você está feliz com a nova instalação, para baixo a instância em execução original, mudar o nome do diretório original (mv aplicação application_old), renomear o diretório NOVO (aplicação mv application_new), e iniciar-lo de volta.

O seu tempo para baixo é reduzido ao servidor desligamento e tempo de arranque (desde renomeação é "livre").

Se, por acaso, você detectar um erro crítico, você tem sua versão original ainda está lá. Pare o novo servidor, renomeá-lo de volta, reinicie o velho. Muito rápido cair para trás.

A outra coisa boa é que a sua infra-estrutura de serviço é estática (como os programas rc, agendador de tarefas, etc.), uma vez que apontam para o diretório "aplicação", e isso não muda.

Ele também pode ser feito com soft links em vez de diretórios renomeação. de qualquer forma é bom.

Mas a técnica é simples, e à prova de bala perto se os seus coopera aplicação.

Agora, se você tem mudanças DB, bem, isso é completamente diferente assunto desagradável. Idealmente, se você pode fazer o seu DB muda "compatível", então espero que a versão do aplicativo de idade pode ser executado no novo esquema, mas que nem sempre é possível.

Eu acredito que você pode arquivos JAR hot-deploy se você usar um servidor de aplicativo baseado em OSGi como SpringSource dm Server. Eu nunca usei isso sozinho, mas sabendo que a qualidade geral do portfólio Spring, eu tenho certeza que vale a pena dar uma olhada.

Nós usamos Eclipse que o sistema de atualização de OSGi, e nossa experiência é muito bom.

Recomendado!

A última versão do Java Web Start permite a injeção de um aplicativo no cache local sem realmente invocando o programa e pode ser marcado como "offline". Desde o cache é o que é usado para invocar o programa, ele será atualizado somente para a próxima corrida. Para que isso funcione você provavelmente irá frascos precisa com números de versão em seu nome (por exemplo, a nossa biblioteca-2009-06-01.jar).

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