ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Golang] RPC API
    개발언어/Go 2020. 10. 12. 01:00

    간단 설명

     RPC는 Remote Protocol Call의 약자로 원격 장비에 있는 함수나 메서드를 실행하는 방법이다. RPC에는 여러가지 다른 유형의 RPC 기술이 있으며, 인터페이스 기술(SOAP, Thrift, Protocol Buffer)이 필요하다. 일반적으로 인터페이스는 DSL(Domain Specific Language, 도메인 특화 언어)을 사용해 정의되며, 생성 프로그램은 이를 이용해 애플리케이션 클라이언트와 서버를 만든다.

     

     REST API가 HTTP를 전송 계층으로 사용해야 하는 것과는 달리 RPC는 이러한 제약이 없으며, HTTP뿐만 아니라 TCP, UDP 소켓도 사용가능하다.

     

     

    RPC 메시지 프레임워크

     RPC는 RPC 메시지 프레임워크를 사용하여 기능한다.

     

    1. Gob

    Go는 Gob 라고 하는 자체적인 스트림 인코딩을 가지고 있다. 이 패키지는 두 Go 서비스간의 원격 프로시저 호출을 구현하기 위한 net/rpc 패키지에의해 사용되며, 사용이 쉽다. 그러나 최대 단점으로는 go간의 통신만 가능하며, 서로 다른 언어의 통신은 지원하지 않는다.

     

    2. Thrift

     Apache에서 제공하는 Thrift는 다양한 언어를 사용하여 개발한 모듈들이 서로 쉽게 통신하기 위해 개발되었다.

    Thrift 스크립트를 한번 작성해 놓으면 다양한 언어에서 사용될 수 있는 코드를 자동으로 생성할 수 있다.

    .thrift란 파일을 생성하고 Thrift compiler로 이 파일을 컴파일하면 C++이나 Java등 여러 언어에서 사용할 수 있는 인터페이스를 자동으로 생성해 주며, 이 인터페이스를 사용해 RPC(Remote Procedure Call) 통신을 한다.

    Thrift는 아래와 같은 특징을 갖는다.

    • 서블릿 제공(org.apache.thrift.server.TServlet)
    • 멀티쓰레드 지원 (org.apache.thrift.server.ThreadPoolServer : worker thread 지정)
    • Async 지원 (org.apache.thrift.server. TNonblockingServer : single threaded)
    • Multi-thread Half-Sync/Half-Async지원 : org.apache.thrift.server. THsHaServer
    • Exception을 제공 (Google Protocol Buffer에는 없는 기능)
    • Set, Map 지원 (Google Protocol Buffer에는 없는 기능)

    3. Protocol Buffer

      전송하기 위해 저장하려고 하는 데이터 구조를 유연하고 효율적으로 작성하고 파싱할 수 있도록 지원하는 자동화된 솔루션이다. Json이나 XML을 생각하면 이해가 쉬워지는데, 이것들과는 조금 다르다. ProtoBuf는 데이터 구조를 .proto라는 파일로 작성하면, 이를 컴파일해서 C++/C#/Python 등의 언어 코드 형태로 변환이 가능하고, 변환된 언어 형태로 모듈까지 지원해서 데이터 구조를 전송하고 받아 읽을 수 있게 Serialize / Deserialize도 해준다.

     

      C언어로 예를 들어 구조체를 정의하고, 이를 소켓을 통해 전송할 수 있게 Serialize(전송할 수 있도록 변환)하고, 변환된 데이터를 받은 후 Deserialize(파싱해서 다시 구조체의 형태로 저장) 하던 과정이 있다면, 이를 직접 코드로 다 작성해야 한다. 하지만 ProtoBuf는 데이터 구조만 정의하면 이 과정은 전부 지원해준다.

    '개발언어 > Go' 카테고리의 다른 글

    [Golang] Mysql 연결하기  (0) 2020.10.25
    [Golang] 마이크로서비스 공통패턴  (0) 2020.10.14
    [Golang] go에서 RPC 다루기  (0) 2020.10.11
    [Golang] net/http 패키지  (0) 2020.09.30
    [golang] 마샬링(Marshaling)  (0) 2020.09.26
Designed by Tistory.