RPC, 근데 이제 Json을 곁들인.. (Json-RPC)
- RPC 란 무엇인가?
- Json 이란 무엇인가?
- RPC 가 사용되는 이유
- RPC 동작 방식
- Json-RPC 특징
- 추가: gRPC는?
- HTTP 위에 얹는 Json-RPC 스타일
RPC 란 무엇인가?
Remote Procedure Call (원격 프로시져 호출)
언어나 환경 등에 종속되지 않고 서비스 간 프로시저를 호출하도록 해주는 개념
- 분산컴퓨팅 환경에서 많이 사용됨
- 프로세스 간 통신 (Inter-Process Communication) 의 한 형태
- 클라이언트-서버 관계로 요청-응답 시스템
- 클라이언트에서 서버로 필요한 파라미터를 보내어 프로시저를 동작시킨다.
Json 이란 무엇인가?
JavaScript Object Notation
- 데이터 교환 형식의 포맷
- Key / Value 쌍으로 콜렉션 타입으로 구성됨
- 예시 (below)
{ "widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" } } }
RPC 가 사용되는 이유
- 로컬/리모트 환경에 관계없이 똑같이 코딩 할 수 있음
- 환경에 구애받지 않고 동일 코딩으로 동일 프로시저 동작 시킬 수 있음
- HTTP 는 어플리케이션 레이어 (7계층) 에서 동작하는 것과 다르게, RPC 는 TCP (4계층) 위에서 동작한다.
- 따라서 더 다양한 프로토콜 사용 가능하다 (TCP, Socket, HTTP 등..)
- CRUD 외에 다양한 동작 표현 (동일한 엔드포인트 호출로 메서드와 파라미터만 바꿔서)
RPC 동작방식
- 클라이언트는 클라이언트 Stub 을 호출한다.
- 스택에 매개변수를 푸시하는 로컬 프로시저 콜
- 클라이언트 Stub 은 메시지로 매개변수를 패킹하고 메시지를 전송하는 시스템 호출
- 이 때, 매개변수 패킹하는 것을 마샬링(Marshalling)이라 한다.
- 클라이언트 로컬 OS 는 클라이언트에서 서버로 메시지 보낸다.
- 서버 로컬 OS 는 들어오는 패킷을 서버 Stub 으로 보낸다.
- 서버 Stub 은 메시지에서 매개변수 압축을 언패킹 한다.
- 이 때, 매개변수 압축 푸는 것을 언마샬링(Unmarshalling) 이라 한다.
- 서버 Stub 은 서버 프로시저를 호출한다.
- 응답과 반환패킷은 반대 방향으로 동일한 단계를 거친다.
Json-RPC 특징
- RPC 를 Json 포맷으로 표현한 것
- 2.0부터 Request-Response 뿐만 아니라 응답없는 Notification 지원한다.
- 4계층 TCP 에서 동작하여 Http 프로토콜을 얹을 필요없이, Json 만 전달하여 동작 가능하다.
- 더 가볍고 빠르다.
+ gRPC
- 구글에서 만든 gRPC 를 많이들 쓰는 것으로 보임
- protobuf 통해서 binary 로 마샬링 (더 빠름)
- IDL 통해서 여러 언어로 제너레이팅 가능
- HTTP 2.0 지원
HTTP 위에 얹는 Json-RPC 스타일
- HTTP 프로토콜을 사용하되, 요청을 1개로 통일
- POST 의 Body 등으로 json 을 넘기는데, 이 때 JsonRPC 포맷을 따른다. (id, method, params)
- 이렇게 하면..
- 컨트롤러 1개로 모든 요청을 받고, 메서드를 호출해서 응답을 할 수 있다.
- 간단한 구현은 편해서 좋은점도 있다고 하는데.. 흠?
Reference
'Programming' 카테고리의 다른 글
[LeetCode] 2085. Count common words with one occurrence (코딩테스트, 테스트케이스 포함, 릿코드, tech interview) (0) | 2021.12.04 |
---|---|
Gradle 의존 키워드의 차이점 (compile vs implementation + api, Gradle dependency configurations diff) (0) | 2021.11.28 |
개발자의 글쓰기 - 책정리 (0) | 2021.10.26 |
객체지향의 사실과 오해 (The Essence of Object-Orientation) - 책정리 (0) | 2021.10.11 |
소프트웨어 장인 (프로페셔널리즘, 실용주의, 자부심) 책 정리 (0) | 2021.10.05 |