문제

우리는 인터넷에 연결된 여러 컴퓨터, 일부 방화벽 뒤에 실행되는 Java 서버 응용 프로그램이 있습니다. 중앙 사이트에서 JAR 파일 및 시작 스크립트를 원격으로 업데이트해야하며 앱 자체가 눈에 띄게 중단되지 않습니다.

프로세스는 무인 상태로되어 있어야합니다 (즉,시기 적절한 인터넷 중단으로 인해 앱을 끊을 여유가 없습니다).

과거에는 유사한 작업을 처리하기 위해 다양한 외부 스크립트와 유틸리티를 사용했지만 자체 의존성이 있기 때문에 결과는 유지하기가 어렵고 휴대용이 적습니다. 새로운 것을 만들기 전에 커뮤니티로부터 약간의 의견을 얻고 싶습니다.

이미 이것에 대한 좋은 해결책을 찾은 사람이 있습니까? 아이디어 나 제안이 있습니까?

명확히하기 위해 :이 앱은 서버이지만 웹 애플리케이션 (WebApp 컨테이너 나 전쟁 파일은 없음)이 아닙니다. 자율적 인 Java 프로그램 일뿐입니다.

도움이 되었습니까?

해결책

서버 앱의 유형을 지정하지 않았습니다. 웹 앱을 실행하지 않는다고 가정하겠습니다 (전쟁을 배포하면 이미 말하는 것을 수행하고있는 것처럼, 당신은 풀 유형을 수행하기 위해 웹 앱이 거의 필요하지 않습니다. 업데이트. 웹 앱에 대해 이야기하는 경우 다음 토론이 여전히 적용될 수 있습니다. 개별 파일 대신 전쟁 파일의 업데이트 확인 및 Ping -Pong을 구현합니다).

JNLP를 살펴볼 수 있습니다. WebStart는이를 기반으로합니다 (클라이언트 응용 프로그램 배포 기술입니다). 그러나 서버 유형 앱에 대한 업데이트를 수행하는 데 맞게 조정할 수 있다고 확신합니다. 그럼에도 불구하고 JNLP는 필요한 버전의 필요한 버전을 다운로드하는 데 사용할 수있는 디스크립터를 제공하는 데 꽤 좋은 작업을 수행합니다 ...

이것에 대한 몇 가지 일반적인 생각 (우리는 같은 버킷에 여러 앱이 있으며 자동 업데이트 메커니즘을 고려하고 있습니다) :

  1. 응용 프로그램을 시작하기 전에 JNLP 파일을 읽고 필요한/업데이트 된 항아리를 다운로드 할 수있는 bootstrap.jar 파일을 고려하십시오.

  2. 항아리 파일 ~할 수 있다 앱이 실행되는 동안에도 업데이트됩니다 (적어도 Windows에서는 파일 실행에 잠금 장치를 보유 할 가능성이 가장 높습니다). 사용자 정의 클래스 로더를 사용하는 경우 문제가 발생하거나 언제든지로드 또는 언로드 될 수있는 항아리가 많지만이를 방지하는 메커니즘을 만들면 항아리를 덮어 쓰고 앱을 다시 시작해야합니다. 업데이트에 충분합니다.

  3. 항아리를 덮어 쓰는 것이 가능하지만 Lib 경로에 대한 탁구 접근 방식을 고려할 수 있습니다 (Lib 폴더의 모든 JAR 파일을 자동 읽고 추가하도록 구성된 앱 런처가없는 경우에 추가하십시오. 클래스 경로는 자동으로, 그것은 당신이 정말로하고 싶은 일입니다). Ping-Pong의 작동 방식은 다음과 같습니다.

앱은 lib-ping version.properties 및 lib-pong version.properties를 시작하고 살펴보고 무엇을 최신인지 결정합니다. Lib-Ping에는 이후 버전이 있다고 가정 해 봅시다. 런처는 lib-ping*.jar를 검색하고 시작하는 동안 해당 파일을 CP에 추가합니다. 업데이트를 할 때는 JAR 파일을 lib-pong으로 다운로드하거나 대역폭을 저장하려면 Lib-Ping에서 JAR 파일을 복사하고 JAR이 실제로 변경되지 않았습니다. 그러나 이것은 노력의 가치가 거의 없습니다!). 모든 항아리를 lib-pong에 복사 한 후에는 마지막으로하는 마지막 일은 버전을 작성하는 것입니다 .Properties 파일 (예를 들어 부분 LIB 폴더를 감지하고 제거 할 수있는 중단 된 업데이트). 마지막으로, 앱을 다시 시작하고 부트 스트랩은 lib-pong이 원하는 클래스 경로임을 픽업합니다.

  1. 위에서 설명한 Ping-Pong은 롤백을 허용합니다. 올바르게 디자인하면 도대체 테스트하는 앱의 한 조각을 가질 수 있으며 해당 수표를 변경하여 주어진 버전을 롤백 해야하는지 확인하지 마십시오. 이렇게하면 앱을 깨뜨리는 것을 엉망으로 만들고 배포하면 버전을 무효화 할 수 있습니다. 응용 프로그램 의이 부분은 BAD LIB-* 폴더에서 version.Properties 파일을 삭제 한 다음 다시 시작하면됩니다. 이 부분을 안전하게 안전하게 유지하는 것이 중요합니다.

  2. 2 개 이상의 폴더를 가질 수 있습니다. 이것은 항아리의 고급 (그러나 더 복잡한) 롤백을 허용합니다.

다른 팁

OSGI를 분명히 살펴 봐야합니다. 이러한 경우 (특히 임베디드 제품의 경우)를 위해 만들어졌으며 많은 회사가 사용합니다. 앱이 실행중인 동안 Jar "번들"을 업데이트하고 추가 및 제거 할 수 있습니다. 나는 그것을 직접 사용하지 않았으므로 오픈 소스 프레임 워크/서버의 품질에 대해 잘 모르겠지만 여기에 당신을 시작할 수있는 유용한 링크가 많이 있습니다.

http://www.osgi.org/main/homepage
http://www.aqute.biz/code/bnd
http://blog.springsource.com/2008/02/18/creating-osgi-bundles/
http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html

멀티 서버 배포를 위해 Capistrano를 추천합니다. Rails 앱을 배포하기 위해 구축되었지만 Java 응용 프로그램을 배포하는 데 성공적으로 사용되는 것을 보았습니다.

링크:Capistrano 2.0은 레일뿐만 아니라

JVM이 그 위에 실행중인 경우 항아리를 수정할 수 없으며 오류가 발생합니다. 나는 비슷한 작업을 시도했으며 내가 생각해 낸 최선은 업데이트 된 JAR의 사본을 만들고 시작 스크립트를 전환하여 해당 항아리를 보는 것입니다. 업데이트 된 항아리가 있으면 시작하여 기존 항아리를 기다렸다가 신호를 제공 한 후 끝날 때까지 기다리십시오. 불행히도 이것은 GUI 등의 손실을 의미하지만 SEC의 경우, Java의 대부분의 구조물을 직렬화하는 것은 쉽고 현재 GUI는 실제로 닫기 전에 업데이트 된 응용 프로그램으로 전송 될 수 있습니다 (일부는 일련화 할 수 없을 수도 있습니다!).

특히 데이터베이스 업데이트가있는 경우 업데이트 원자를 만들기가 매우 어렵습니다.

그러나 그렇지 않은 경우 먼저 응용 프로그램이 상대 경로에서 실행될 수 있는지 확인하는 것입니다. 즉, 앱을 일부 디렉토리에 넣을 수 있으며 모든 중요한 파일은 해당 위치와 관련하여 발견되어 실제 설치 위치가 실제로 중요하지 않도록합니다.

다음으로 설치를 복제하십시오. 이제 "실행"버전이 있고 "새로운"버전이 있습니다.

원하는 기술을 사용하여 "새로운"버전을 업데이트하십시오 (FTP, RSYNC, 종이 테이프, 보트를 떠 다니는 것이 무엇이든).

설치 (체크섬, 빠른 단위 테스트, 필요한 것이 무엇이든간에 테스트 포트에서 시작하십시오)를 확인하십시오.

새 설치에 만족하면 원래 실행중인 인스턴스를 아래로 내려가 원래 디렉토리 (MV Application Application_old)의 이름을 바꾸고 새 디렉토리 (MV Application_New 응용 프로그램)의 이름을 바꾸고 다시 시작하십시오.

다운 타임이 서버 종료로 줄어들고 시간이 시작됩니다 (이름 바꾸기가 "무료"이므로).

우연히 중요한 오류를 감지하면 원래 버전이 여전히 있습니다. 새 서버를 중지하고 다시 이름을 바꾸고 기존을 다시 시작하십시오. 매우 빠른 속도로 돌아갑니다.

또 다른 좋은 점은 서비스 인프라가 정적 (RC 스크립트, CRON 작업 등)이 "응용 프로그램"디렉토리를 가리키기 때문에 정적이며 변경되지 않는다는 것입니다.

디렉토리 이름 변경 대신 소프트 링크로 수행 할 수도 있습니다. 어느 쪽이든 괜찮습니다.

그러나이 기술은 간단하고 응용 프로그램이 협력하는 경우 거의 방탄 증명입니다.

이제 DB 변경이 있다면 완전히 다른 불쾌한 문제입니다. 이상적으로 DB를 "뒤로 호환"할 수 있다면 이전 응용 프로그램 버전이 새 스키마에서 실행될 수 있기를 바랍니다. 그러나 항상 가능하지는 않습니다.

OSGI 기반 앱 서버를 사용하면 JAR 파일을 뜨거운 배포 할 수 있다고 생각합니다. Springsource DM 서버. 나는 그것을 직접 사용한 적이 없지만, 스프링 포트폴리오의 일반적인 품질을 아는 것은 그만한 가치가 있다고 확신합니다.

우리는 OSGI의 업데이트 시스템이 이클립스를 사용하며 우리의 경험은 매우 좋습니다.

추천!

최신 버전의 Java Web Start를 사용하면 실제로 프로그램을 호출하지 않고 로컬 캐시에 응용 프로그램을 주입 할 수 있으며 "오프라인"으로 표시 될 수 있습니다. 캐시는 프로그램을 호출하는 데 사용되는 것이므로 다음 실행에 대해서만 업데이트됩니다. 이것이 작동하기 위해서는 이름으로 버전 번호가있는 항아리가 필요할 것입니다 (예 : 우리의 라이브러리 -2009-06-01.jar).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top