Java RMI (Remote Method Invocation)

 

1. RMI의 정의

- RMI란 원격 메서드 호출로 네트워크상에서 떨어져 있는 객체의 메서드를 투명하게 호출하는 것을 말한다.

 

2. RMI 의 개발 목적

① 안정된 원격 호출의 제공

② 서버에서 애플랫으로의 콜백 제공

③ 분산모델을 자바환경으로의 통합

④ 분산 객체와 비분산 객체의 명확한 구분

⑤ 안정된 분산 애플리케이션을 간편하게 만들수 있는 환경제공

⑥ 자바 런타임환경에의해 제공되는 안전성 유지

 

3. RMI 의 Interface 와 Class

- java.rmi 안에 정의 되어 있는 인터페이스들과 클래스들은 RMI System 의 상태(behavior)들을 기술하고 있다. 밑의 그림은 인터페이스들과 클래스들간의 관계를 나타낸 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

4. RMI 시스템의 구조

- RMI 시스템은 stub/skeleton 래이어, remote reference 래이어, transport 래이어로 구성되어 있으며 각 래이어의 경계는 특별한 인터페이스와 프로토콜에 의해 정의되진다. 또한 각 래이어는 서로 독립적이며 따라서 다른 래이어에 영향을 주지 않고 한 래이어의 성질을 바꿀수 있다. 예들들어 설명하자면, 현재 transport 구현은 TCP를 바탕으로 하고 있으나 다른 래이어에 영향을 주지 않고 UDP 를 바탕으로한 transport 로의 교체가 가능한 것이다.

 

- 또 다른 테크닉으로 Dynamic stub loading 이 있다. 이는 remote interface를 구현하는 client-side stub 를 지원하기 위해 쓰인다. 예들들면 정확한 형의 stub 가 클라이언트에서 유효하지 않을경우 클라이언트가 자바에 내장된 연산자를 캐스팅과 타입채킹에 사용하도록 허용한다.

① stub/skeleton

- 클라이언트가 remote server의 객체를 호출할때 실재로 호출되는 부분으로 stub는 원 격 인터페이스의 구현으로 호출 요청을 remote reference layer를 통해 서버 객체로 보내는 역할을 담당한다. skeleton 은 그 반대로 생각하면 된다.

② remote reference layer

- 호출 정보를 분석해서 server 가 단일 객체인지 아니면 여러 사이트에 흩어져 있는 복수개의 객체인지를 판별후 호출을 실행한다. 또한 그 서버가 항상 실행상태인지 아니면 호출시에만 실행이되는지에 따른 참조방법을 추상화 한다. 따라서 상위 래이어에서는 이러한 차이점이 보이지 않게 된다.

③ transport layer

- 연결 setup, 연결 관리, 그리고 연결 감시등을 책임지는 래이어다. 각 래이어의 경계는 특별한 인터페이스와 프로토콜에 의해 정의되지며 각 래이어는 서로 독립적이며 따라서 다른 래이어에 영향을 주지 않고 한 래이어의 성질을 바꿀수 있다. 예들들어 설명하자면, 현재 transport 구현은 TCP를 바탕으로 하고 있으나 다른 래이어에 영향을 주지 않고 UDP 를 바탕으로한 transport 로의 교체가 가능한 것이다.

 5. RMI의 원리


 














6. RMI 순서

① 로컬 객체는 원격 객체의 메서드를 호출

② 스텁은 해당 메서드를 호출할 때 넘겨받은 인자들을 전달하기 위해, 원격지의 스켈레톤과 네트워크에서 통신하여, 해당 메서드를 호출

③ 원격지의 스켈레톤은 로켈 객체의 스텁으로부터 네트워크를 통하여 메서드 이름과 인자를 넘겨받는다.

④ 원격 객체에서 메서드가 실행되고 결과는 스켈레톤으로 넘겨진다.

⑤ 넘겨받은 스켈레톤이 결과를 로컬 컴퓨터의 스텁으로 넘겨준다.

⑥ 스텁은 스켈레톤에게 넘겨받은 결과를 원래의 로컬 객체에게 반환값으로 넘겨주게 된다.

 

7. RMI 프로그래밍 방법

 

















8. RMI 프로그래밍의 흐림

① 원격 인터페이스를 정의

② 원격객체를 프로그래밍

③ 원격객체의 클래스를 얻는다.

④ rmic 컴파일러로 스텁과 스켈레톤을 생성

⑤ 로컬객체를 프로그램화

⑥ 로컬객체를 컴파일

⑦ 자바보안정책 파일을 수정

⑧ RMI 레지스트리 서버를 실행

⑨ 원격 객체 클래스를 실행

⑩ 로컬 객체를 실행하여 RMI 기능을 이용


RPC(Remote prodecure call)

 

1. RPC의 정의

- 다른 네트워크의 컴퓨터에 있는 함수를 호출할 수 있도록 해주는 저 수준의 프로세스간 통신 방법

- 네트워크 프로그래밍을 함수 호출 레벨 수준으로 작성할 수 있게 해주는 API

- OSF DEC(Open Software Foundation Distributed Computing Environment)

① Microsoft SQL과 같은 RPC 활용 클라이언트/서버 모델 지원

② 클라이언트의 LPC가 네트워크 메시지로 변환되는 RPC 모델 지원

③ Lotus Notes에서 사용되는 것과 같은 형태의 데이터 공유 모델 지원

 

2. RPC의 유용성

① 서버의 CPU까지 공유할 수 있는 기능 제공

② 네트워크에서 이용 가능한 가장 강력한 CPU를 사용할 수 있도록 해준다

③ 네트워크에 연결된 컴퓨터들이 CPU를 편중되지 않게 고루 사용할 수 있다

④ Remote의 함수를 Local 함수와 동일하게 호출할 수 있다

⑤ 네트워크 transport나 protocol의 종류에 영향을 받지 않고 사용할 수 있다

 

3. RPC 메터니즘

- 서브/클라이언트 모델을 따르기 때문에, 데이터 통신을 위한 메커니즘은 단순하다고 할 수 있다. 클라이언트에서 서비스를 요청하면 서버에서 프로시져를 호출해서 처리하고 리턴값을 되돌려주는 방식이다.

 

4. RPC 데이터 흐름

① Client 데이터는 XDR 필터를 통과해서 인코딩된 후 전달된다.

② XDR 인코딩된 데이터는 네트워크를 가로질러서 원격지 호스트로 전달된다.

③ 데이터를 받은 서버는 XDR 필터를 통해서 디코딩한다.

④ 디코딩된 데이터를 처리하고 결과 데이터를 XDR 필터를 통해서 인코딩한다.

⑤ 인코딩된 XDR 데이터가 네트워크를 가로질러서 클라이언트에 전달된다.

⑥ 클라이언트는 XDR 디코딩을하고 결과를 처리한다.

 

5.RPC의 처리 과정

1) 작동순서

① 클라이언트의 작업 요청

② 입력 인수를 NDR(표준 네트워크 포맷)로 전환

③ 작업 요청 내용을 서버로 전송

④ 클라이언트의 작업 요청 내용 수신

⑤ NDR을 서버 함수가 이용할 수 있도록 전환

⑥ 서버 함수 호출

⑦ 작업 결과 반환

⑧ 출력 인수를 NDR로 전환

⑨ 작업 결과를 클라이언트로 전송

⑩ 서버로부터 전송된 작업 결과 수신

⑪ NDR의 작업 결과를 전환

⑫ 작업 결과를 받고, 하던 작업을 계속 수행

2) stub의 역할

- 주소공간에서 필요한 인수를 가져옴

- 인수들을 네트워크에 전송할 수 있는 형태(network transmission format)로 전환

- 작업을 요청 또는 반환하기 위해 RPC 라이브러리 호출

RMI와 RPC의 비교

- 프로그래머를 네트워크로부터 어느 정도 격리시켜준다는 공통점을 가지고 잇다. 그래서 RMI와 RPC 프로그래밍 모두 프로그래머가 네트워크에 대해 많은 신경을 쓰지 않고도 프로그램을 개발할 수 있도록 해준다. RMI와 RPC의 차이점은 RMI는 메소드 호출이 가능한 방식을 말하며, RPC는 단순히 다른 컴퓨터에 존재하는 프로그램의 프로시져 수행을 위한 것이다. RPC에 객체 지향이라는 옷을 입힌 것이 RMI라 볼 수 있다.

Posted by 마블(이환문)