CS/운영체제

[운영체제] 소켓 통신, 서버 - 클라이언트 통신, RPC

개발중인 감자 2023. 10. 23. 01:26

📌 소켓 통신 

 

소켓?

- 커뮤니케이션을 하기 위한 통신의 극점 (end point)

- IP 주소 및 Port 번호를 조합하여 식별 

 

[ 서버 - 클라이언트 아키텍처를 사용 ]

-> 서버는 특정 포트를 listen 하면서 클라이언트 요청에 대기

-> 요청을 받으면, 서버는 클라이언트 소켓으로부터 연결 요청을 수락함으로써 연결 완성. 

 

 

📌 MSA?

 

 

마이크로 서비스 아키텍처 

쉽게 말해서 자잘하게 서비스별로 아키텍쳐 구조로 잡고 모여 만든 큰 서비스 아키텍처 

 

문제는 서로 다른 언어들(java, c, python 같은)로 만든 서비스들을 어떻게 한 서비스로 통합(연결) 하지?

-> 소켓 통신한다면 하나하나 규격 맞춰야함 -> 불편함

-> 언어에 구애받지 않고 편하게 하나의 프로시저를 호출하자. 

-> 그 프로시저가 원격 프로시저 콜 호출 방법 (Remote Procedure Call, RPC)

 

 

📌 원격 프로시저 콜 호출 방법? (RPC?)

- 별도의 코드 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간의 통신 기술

- IDL를 사용하여 인터페이스를 명시함. 

*IDL (출처 : openmaru 블로그 )
IDL(Interface Definition Language, 인터페이스 정의 언어)은 소프트웨어 컴포넌트의 인터페이스를 묘사하기 위한 명세 언어.
어느 한 언어에 국한되지 않는 언어 중립적인 방법으로 인터페이스를 묘사함으로써, 같은 언어를 사용하지 않는 소프트웨어 컴포넌트 사이의 통신을 가능하게 해줌. 

 

- RPC를 사용하면 서버나 클라이언트가 어디에 있는 호출하면 연결됨 -> 보안도 향상됨!

 

 

  1. IDL을 통해 호출에 대한 인터페이스를 정의합니다.
  2. 정의된 IDL을 기반으로 rpcgen이라는 rpc 프로토콜 컴파일러를 통해 코드(stub)가 생성됩니다. stub을 통해 Client는 procedure 호출을 위한 참조자가 생겼고, Server는 procedure 이해를 위한 참조가 생기게 됩니다.
  3. Client는 자신의 프로그램에서 함수를 호출하는 것처럼 stub에 정의된 함수를 사용합니다.
  4. Client에서 Stub에 정의된 함수를 사용할 때 Client stub은 RPC 런타임을 통해 함수를 호출합니다.
  5. Server는 수신된 procedure 호출에 대한 처리 후 결과 값을 반환합니다.
  6. 최종적으로 Client 프로그램은 서버의 결과 값을 반환 받습니다.

 

하지만 RPC는 코드를 이해하기 어려울 뿐더러 에러 발생시 디버깅이 어렵다는 단점이 있음. 

요즘은 구글에서 나온 gRPC도 사용하기도 한다. 

 

✔️ gRPC?
구글에서 나온 RPC 프레임워크로, 저용량 메시지와 고성능 RPC를 갖고 있다. 또하 HTTP/2를 사용한다.
저용량 메시지를 가능하게 한 이유로는 프로토콜 버퍼 (Protocol Buffer) 인데, 데이터 구조를 json 이 아닌 바이너리 형태로 주고 받으면서 컴퓨터는 일련의 변환 과정 없이 바이너리 그 자체이기 때문에 빠르게 통신이 가능하다. 또한 용량이 비교적 큰 json에 비해 작아 저용량 메시지 및 고성능 RPC가 가능해진다.