OSGi 개념을 이해합니다. 퍼즐 접근 방식을 따르십시오

게시 됨: 2013-04-20

OSGi 는 모듈식 접근 방식과 모듈 간의 논리적 경계를 적용하는 기능 덕분에 오늘날 매우 인기를 얻었습니다. 우리가 그것을 처음 발견했을 때 질문은 그것이 어떻게 작동하는지 이해하기 시작하는 곳입니다.

OSGi 개념을 이해하기 위해 우리는 퍼즐 접근 방식을 따르려고 노력할 것입니다. 아이디어는 이 기술의 사소한 부분에서 시작하여 발견된 것과 관련된 다른 부분을 검색하는 것입니다. 그리고 퍼즐을 조립하기 위해 우리는 OSGi 내부 디자인을 감지하는 데 도움이 될 JArchitect의 도움을 받을 것입니다.

좀 더 구체적으로 말하면 OSGi 기술을 사용하는 JArchitect 애플리케이션으로 분석하는데, OSGi 컨테이너 춘분을 사용하는 유명한 Eclipse IDE에 관한 것입니다.

일반적인 OSGi 정의부터 시작하겠습니다.

OSGi는 오늘날의 대규모 분산 시스템과 소형 임베디드 애플리케이션을 위한 모듈식 아키텍처를 제공하여 복잡성을 줄입니다. 사내 및 기성품 모듈로 시스템을 구축하면 복잡성이 크게 줄어들어 개발 및 유지 관리 비용이 절감됩니다. OSGi 프로그래밍 모델은 구성 요소 기반 시스템의 가능성을 실현합니다.

OSGi의 사소한 부분은 모듈화입니다. OSGi 모듈이 무엇인지 알아봅시다.

OSGI 모듈은 번들이라고 하며 모든 애플리케이션은 따라서 최소한 하나의 번들로 구성됩니다.
이러한 번들은 컨테이너 내부에서 실행되며 컨테이너가 모듈을 관리하는 각 모듈식 접근 방식으로 문제는 컨테이너에 통합될 모든 모듈을 구현해야 하는 계약이 무엇입니까?

org.eclipse.equinox.jsp.jasper 번들을 예로 들어 구현된 모든 인터페이스를 검색해 보겠습니다. 이를 위해 다음 CQLinq 요청을 실행할 수 있습니다.

일식 4

OSGi 패키지의 BundleActivator 인터페이스가 구현되었으며 이 인터페이스에는 번들 시작 및 중지를 사용자 정의하는 데 유용한 두 가지 시작 및 중지 메소드가 포함되어 있습니다.

번들의 또 다른 특이성은 매니페스트 파일입니다. 다음은 org.eclipse.equinox.jsp.jasper 매니페스트 파일의 일부입니다.

우리가 관찰할 수 있듯이 이 매니페스트에는 BundleActivator 인터페이스를 구현하는 번들 활성기 클래스를 지정하는 것과 같이 컨테이너에 필요한 일부 메타 정보가 포함되어 있습니다.

번들은 퍼즐의 첫 번째 조각을 나타내며 다음은 번들을 단순화한 것입니다.

일식 7

그리고 Eclipse에서 사용하는 모든 번들에 대한 아이디어를 얻기 위해 BundleActivator 인터페이스를 구현하는 모든 클래스를 검색해 보겠습니다.

일식 2

누가 번들을 관리하고 BundleActivator 메소드를 호출합니까?

BundleActivator.start를 직접 또는 간접적으로 호출하는 메서드를 검색해 보겠습니다.

일식 6

번들은 시작될 때 OSGi 프레임워크에 의해 활성화됩니다. 프레임워크 클래스는 춘분 컨테이너에 의해 시작됩니다. 컨테이너가 시작될 때 어떤 일이 발생하는지 더 잘 이해하기 위해 컨테이너가 시작될 때 실행되는 몇 가지 작업은 다음과 같습니다.

일식 31

컨테이너가 시작되면 OSGi 프레임워크를 초기화하고 프레임워크는 설치된 모든 번들을 가져오고 각 번들에 대해 BundleHost 클래스의 인스턴스를 만들고 찾은 번들을 저장소에 저장합니다.

BundleHost 클래스는 시작, 중지, 제거 및 업데이트와 같은 메서드가 포함된 번들 인터페이스를 구현하며 이러한 메서드는 번들 수명 주기를 관리하는 데 필요합니다.

그래서 우리의 두 번째 퍼즐 조각은 OSGi 컨테이너로, 프레임워크를 초기화하는 Equinoxlauncher에 의해 실행됩니다. 프레임워크 클래스는 번들을 로드하고 활성화하는 역할을 합니다.

번들 및 컨테이너에 대한 몇 가지 기본 개념을 발견한 후 번들 내부로 들어가 내부적으로 어떻게 작동하는지 알아보겠습니다.

org.eclipse.equinox.http.servlet 번들을 예로 들어 Activator 클래스의 start 메소드에 의해 호출된 메소드를 검색해 보겠습니다.

일식 1

이 번들은 서비스를 생성하고 컨테이너에 등록합니다. OSGi의 서비스는 표준 Java 클래스 또는 인터페이스에 의해 정의됩니다. 일반적으로 Java 인터페이스는 서비스 인터페이스를 정의하는 데 사용됩니다. 서비스는 번들이 서로 통신하는 데 사용해야 하는 기본 방법입니다.

다음은 서비스를 사용하는 몇 가지 유용한 시나리오입니다.

  • 번들에서 다른 번들로 기능을 내보냅니다.
  • 다른 번들에서 기능을 가져옵니다.
  • 다른 번들의 이벤트에 대한 리스너를 등록합니다.

이전 종속성 그래프의 또 다른 설명은 서비스 팩토리를 사용하여 서비스 인스턴스를 생성한다는 것입니다.

퍼즐의 세 번째 조각은 OSGi 서비스 계층입니다. 각 번들은 일부 서비스를 사용하거나 선언할 수 있으며, 이는 구성 요소 디자인 접근 방식을 적용합니다. 여기에 OSGi 번들의 새로운 표현이 있습니다.

일식 8

번들이 서비스를 사용하여 다른 번들과 통신하는 경우 다른 jar와 어떻게 통신합니까?

번들을 개발하고 다른 jar의 클래스를 사용하려고 하면 예상대로 작동하지 않는다는 사실에 놀랄 수 있습니다. 그 이유는 ClassLoader가 OSGi 컨테이너에 연결되어 있어 java를 호출하는 메소드를 검색해 봅시다. lang.Thread.setContextClassLoader.

일식 9

EquinoxLauncher를 포함하여 많은 메소드가 이를 호출합니다. 따라서 번들이 클래스 인스턴스를 생성하려고 할 때마다 OSGi 컨테이너는 코드가 이 작업을 수행하도록 허용되었는지 여부를 확인하고 여기에 매니페스트 파일에서 가져오고 내보낸 패키지의 역할이 나옵니다.

번들은 명시적으로 내보낸 패키지와 가져온 패키지를 선언하고 이를 확인하기 위해 org.eclipse.equinox.http.servlet 번들에서 사용하는 패키지를 검색하여 가져온 패키지만 사용하는지 확인합니다.

일식 10

사용된 모든 패키지가 매니페스트 파일의 가져오기 패키지 섹션에 지정되어 있음을 알 수 있습니다.
그러나 내보낸 패키지는 다른 번들에서 사용할 수 있는 패키지를 나타냅니다. ExportedPackage 인터페이스로 표시되며 이 인터페이스를 사용하여 컨테이너 클래스를 검색할 수 있습니다.

일식 12

이 새로운 기능의 흥미로운 점은 번들이 잘 정의된 경계를 가지며 사용하는 것과 서비스로 노출하는 것이 매우 잘 지정된다는 것입니다.

다른 도구를 사용하여 가져온 패키지 사용에 대한 검사를 시행할 수 있습니다. 예를 들어 CQLinq를 사용하면 프로젝트에서 지정된 패키지 이외의 패키지를 사용할 때마다 일부 규칙 경고를 작성할 수 있지만 실행 환경에서 이 검사를 수행하는 것이 더 좋으므로 개발자가 이 규칙을 어길 수 없습니다.

가져오기 및 내보내기 패키지를 처리하는 이 기능은 OSGi 모듈 계층에서 관리하며 퍼즐의 네 번째 조각이었습니다.

OSGi 컨테이너로 돌아가서 어떤 서비스를 제공하는지 알아봅시다.

컨테이너 서비스

컨테이너가 EquinoxLauncher 클래스에 의해 실행되고 프레임워크 클래스가 번들을 초기화 및 실행하기 전에 발견한 바와 같이 제공되는 서비스를 감지하기 위해 프레임워크 초기화 메소드에 사용된 모든 클래스를 검색해 보겠습니다.

일식 11

BundleRepository,BundleHost,PackageAdminImpl 및 ServiceRegistry와 같은 일부 클래스는 이전에 이미 발견되었습니다.

다른 수업은 어떻습니까?

  • 시작 레벨 관리자:
    각 OSGi 번들은 서버가 번들의 상대적 시작 및 중지 순서를 제어할 수 있도록 하는 시작 레벨과 연관됩니다. 시작 레벨이 서버 프레임워크의 활성 시작 레벨보다 작거나 같은 번들만 활성 상태여야 합니다. 일반적으로 시작 수준이 더 작은 번들은 더 일찍 시작되는 경향이 있습니다.
  • 보안관리자:
    보안 계층은 번들 기능을 사전 정의된 기능으로 제한하여 보안 측면을 처리합니다.
  • 이벤트 매니저:
    이벤트 관리 서비스는 이벤트 처리를 위한 게시-구독 모델을 제공합니다. OSGi 이벤트 관리 서비스 사양에 따라 구현됩니다. 이벤트 관리 서비스는 이벤트 채널을 삽입하여 이벤트 게시자와 이벤트 구독자(이벤트 핸들러) 간에 이벤트를 전달합니다. 게시자는 채널에 이벤트를 게시하고 이벤트 채널은 알림을 받아야 하는 핸들러를 정의합니다. 따라서 게시자와 핸들러는 서로에 대한 직접적인 지식이 없으므로 이벤트 관리가 간소화됩니다.

OSGi 전체 그림

앞에서 설명한 모든 퍼즐 조각을 조립하고 다음과 같은 OSGi 그림을 갖게 됩니다.
레이어링 osgi

이 아키텍처에는 다음과 같은 흥미로운 이점이 있습니다.

  • 단순한.
  • 복잡성 감소.
  • 쉬운 배포.
  • 안전한.

그것을 매우 매력적이고 우회할 가치가 있는 이유는 무엇이며 깊이 연구하면 시간을 낭비하지 않을 것입니다.