PostIT

[RPC]gRPC 적용을 위한 gRPC 분석, gPRC란 무엇인가? 본문

카테고리 없음

[RPC]gRPC 적용을 위한 gRPC 분석, gPRC란 무엇인가?

shun10114 2017. 5. 26. 09:45

# gRPC 적용을 위한 gRPC 분석, gPRC란 무엇인가?



## gRPC란?


gRPC는 Google에서 처음 개발 한 공개 소스 원격 프로 시저 호출 (RPC) 시스템입니다. 전송을 위해 HTTP/2를 사용하고 인터페이스 설명 언어로 프로토콜 버퍼를 사용하며 인증, 양방향 스트리밍 및 흐름 제어, 바인딩 차단 또는 차단 해제 및 취소 및 시간 초과 기능을 제공합니다. 그것은 많은 언어에 대한 크로스 플랫폼 클라이언트 및 서버 바인딩을 생성합니다.





gRPC에서 클라이언트 응용 프로그램을 로컬 객체 인 것처럼 다른 컴퓨터의 서버 응용 프로그램에서 메서드를 직접 호출 할 수 있으므로 분산 응용 프로그램 및 서비스를보다 쉽게 만들 수 있습니다. 많은 RPC 시스템에서처럼 gRPC는 서비스를 정의하고 매개 변수와 리턴 유형을 사용하여 원격으로 호출 할 수있는 메소드를 지정한다는 아이디어를 기반으로합니다. 

서버 측에서는 서버 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트 호출을 처리합니다. 클라이언트 측에서 클라이언트는 서버와 동일한 메소드를 제공하는 스텁(일부 언어에서는 클라이언트라고 함)을 가지고 있습니다.



    #### 주요 사용 시나리오

    마이크로 서비스 스타일 아키텍처에서 다중 언어 서비스를 효율적으로 연결

    백엔드 서비스에 모바일 장치, 브라우저 클라이언트 연결

    효율적인 클라이언트 라이브러리 생성

    


    #### 핵심 기능

  • 10 개 언어로 된 관용적 클라이언트 라이브러리
  • 유선 및 간단한 서비스 정의 프레임 워크로 매우 효율적입니다.
  • http / 2 기반 전송을 통한 양방향 스트리밍
  • 로드 밸런싱(load balancing), 추적(tracing), 상태 확인(health checking) 및 인증(authentication) 플러그인 지원



### Protocol buffers


프로토콜 버퍼는 구조화 된 데이터를 직렬화하기위한 유연하고 효율적인 자동화 된 메커니즘입니다. XML은 작지만 더 빠르고 단순합니다. 데이터를 한 번 구성하는 방법을 정의한 다음 특수 생성 된 소스 코드를 사용하여 다양한 데이터 스트림간에 구조화 된 데이터를 쉽게 읽고 쓸 수 있으며 다양한 언어를 사용할 수 있습니다. "이전"형식으로 컴파일 된 배포 된 프로그램을 손상시키지 않고 데이터 구조를 업데이트 할 수도 있습니다.



    #### Working with Protocol Buffers


    기본적으로 gRPC는 JSON과 같은 다른 데이터 형식에서도 사용할 수 있지만 구조화 된 데이터를 직렬화하기위한 Google의 성숙한 오픈 소스 메커니즘 인 프로토콜 버퍼를 사용합니다. 

    프로토콜 버퍼로 작업 할 때 첫 번째 단계는, proto 파일에서 직렬화(serialize)하려는 데이터의 구조를 정의하는 것입니다. 이것은 확장자가 .proto 인 일반 텍스트 파일입니다. 프로토콜 버퍼 데이터는 메시지로 구성됩니다. 각 메시지는 필드라는 일련의 이름 - 값 쌍을 포함하는 정보의 작은 논리적 레코드입니다. 다음은 간단한 예입니다.


    message Person {

      string name = 1;

      int32 id = 2;

      bool has_ponycopter = 3;

    }


    그런 다음 데이터 구조를 지정하면 프로토콜 버퍼 컴파일러 protoc를 사용하여 프로토 정의에서 원하는 언어로 데이터 액세스 클래스를 생성합니다. 이것들은 name () 및 set_name ())과 같은 각 필드에 대한 간단한 접근자를 제공하며 원시 바이트로부터 전체 구조를 직렬화/구문 분석하는 메서드를 제공합니다. 예를 들어 선택한 언어가 C++이고 컴파일러를 실행하는 경우 위의 예제는 Person이라는 클래스를 생성합니다. 그런 다음 응용 프로그램에서이 클래스를 사용하여 Person 프로토콜 버퍼 메시지를 채우고 직렬화하고 검색 할 수 있습니다.


    예제에서 더 자세히 살펴보면 gRPC 서비스는 일반 프로토콜 파일에서 RPC 메소드 매개 변수와 프로토콜 버퍼 메시지로 지정된 리턴 유형으로 정의됩니다.


    // The greeter service definition.

    service Greeter {

      // Sends a greeting

      rpc SayHello (HelloRequest) returns (HelloReply) {}

    }


    // The request message containing the user's name.

    message HelloRequest {

      string name = 1;

    }


    // The response message containing the greetings

    message HelloReply {

      string message = 1;

    }


    또한 gRPC는 proto 파일에서 코드를 생성하기 위해 특수 gRPC 플러그인과 함께 protoc를 사용합니다. 그러나 gRPC 플러그인을 사용하면 생성 된 gRPC 클라이언트 및 서버 코드뿐만 아니라 메시지 타입 찾기, 직렬화 및 검색을 위한 일반 프로토콜 버퍼 코드가 생성됩니다.



    #### Using the API surface


    .proto 파일의 서비스 정의에서 시작하여 gRPC는 클라이언트 및 서버 측 코드를 생성하는 프로토콜 버퍼 컴파일러 플러그인을 제공합니다. gRPC 사용자는 일반적으로 클라이언트 측에서 이러한 API를 호출하고 서버 측에서 해당 API를 구현합니다.


    서버 측에서는 서버가 서비스에 의해 선언 된 메소드를 구현하고 클라이언트 호출을 처리하기 위해 gRPC 서버를 실행합니다. gRPC 인프라는 들어오는 요청을 디코딩하고, 서비스 메소드를 실행하며, 서비스 응답을 인코딩합니다.

    클라이언트 측에서는 클라이언트가 스텁 (일부 언어의 경우 선호되는 용어는 클라이언트 임)이라고하는 로컬 객체를 서비스와 동일한 메소드를 구현합니다. 그런 다음 클라이언트는 로컬 객체의 메소드를 호출하여 해당 프로토콜 버퍼 메시지 유형에서 호출 매개 변수를 래핑합니다. gRPC는 요청을 서버로 보내고 서버의 프로토콜 버퍼 응답을 반환 한 후 보입니다.



    #### Synchronous vs. asynchronous(동기 vs 비동기)


    서버에서 응답이 도착할 때까지 차단되는 동기 RPC 호출은 RPC가 바라는 프로 시저 호출의 추상화에 가장 근접합니다. 반면에 네트워크는 본질적으로 비동기식이며 많은 경우에 현재 스레드를 차단하지 않고 RPC를 시작할 수있는 것이 유용합니다. 대부분의 언어에서 gRPC 프로그래밍 표면은 동기식 및 비동기식으로 제공됩니다.



    #### XML이 아닌, Protocol Buffers를 사용하는 이유


    프로토콜 버퍼는 구조화 된 데이터를 직렬화하기 위해 XML보다 많은 장점이 있습니다. 

        더 간단하다

        3 ~ 10 배 작은

        20 ~ 100 배 빨라진다.

        덜 모호하다

        프로그래밍 방식으로 사용하기가 더 쉬운 데이터 액세스 클래스 생성



### Supported Language



gRPC는 모든 환경에서 실행할 수있는 최신 오픈 소스 고성능 RPC 프레임 워크입니다. 로드 밸런싱(load balancing), 추적(tracing), 상태 확인(health checking) 및 인증(authentication)을위한 플러그 가능한 지원을 통해 데이터 센터에서 또는 서비스 전반에 걸쳐 효율적으로 서비스를 연결할 수 있습니다. 또한 장치, 모바일 응용 프로그램 및 브라우저를 백엔드 서비스에 연결하는 분산 컴퓨팅의 마지막 마일에 적용 할 수 있습니다.


Language
Platform
Compiler
C/C++
Linux
  • GCC 4.4
  • GCC 4.6
  • GCC 5.3
  • Clang 3.5
  • Clang 3.6
  • Clang 3.7
C/C++
Windows 7+
Visual Studio 2013+
C#
  • Windows 7+
  • Linux
  • Mac
  • .NET Core, .NET 4.5+
  • .NET Core, Mono 4+
  • .NET Core, Mono 4+
Node.js
Windows/Linux/Mac
Node v4+
PHP *
Linux/Mac
PHP 5.5+ and PHP 7.0+
Ruby
Windows/Linux/Mac
Python
Windows/Linux/Mac
Python 2.7 and Python 3.4+
Go
Windows/Linux/Mac
Go 1.5+
Java
Windows/Linux/Mac
JDK 8 recommended. Gingerbread+ for Android
* still in beta




### Bi-directional streaming and integrated auth




양방향 스트리밍 및 http/2 기반 전송을 통한 완벽하게 통합 된 인증 플러그 기능 지원


    gRPC는 다양한 인증 메커니즘과 함께 작동하도록 설계되었으므로 gRPC를 사용하여 안전하게 다른 시스템과 통신 할 수 있습니다. 지원되는 메커니즘 (Google 토큰 기반 인증을 사용하거나 사용하지 않는 SSL/TLS)을 사용하거나 제공된 코드를 확장하여 자체 인증 시스템을 플러그인 할 수 있습니다. 또한 gRPC는 채널을 만들거나 전화를 걸 때 필요한 모든 인증 정보를 자격 증명으로 제공 할 수있는 간단한 인증 API를 제공합니다.


    #### 지원되는 인증 메커니즘


    - 다음 인증 메커니즘이 gRPC에 내장되어 있습니다.


    SSL/TLS : gRPC는 SSL/TLS 통합을 지원하며 SSL / TLS를 사용하여 서버를 인증하고 클라이언트와 서버간에 교환되는 모든 데이터를 암호화합니다. 클라이언트가 상호 인증을위한 인증서를 제공 할 수있는 선택적 메커니즘을 사용할 수 있습니다.

    Google과의 토큰 기반 인증 : gRPC는 메타 데이터 기반 자격 증명을 요청 및 응답에 첨부하는 일반 메커니즘 (아래에서 설명 함)을 제공합니다. gRPC를 통해 Google API에 액세스하는 동안 액세스 토큰(일반적으로 OAuth2 토큰)을 얻는 추가 지원은 특정 인증 흐름에 대해 제공됩니다. 아래의 코드 예제에서 이것이 어떻게 작동하는지 확인할 수 있습니다. 일반적으로이 메커니즘은 채널의 SSL/TLS와 함께 사용해야합니다. Google은 SSL/TLS없이 연결을 허용하지 않으며 대부분의 gRPC 언어 구현으로 암호화되지 않은 채널에서 자격 증명을 보낼 수 없습니다.

    [경고 : Google 자격 증명은 Google 서비스에 연결하는 데에만 사용해야합니다. Google에서 발행 한 OAuth2 토큰을 Google 이외의 서비스로 보내면이 토큰이 도난 당해서 클라이언트를 Google 서비스로 가장하는 데 사용될 수 있습니다.]


    #### 다른 인증 메커니즘을 지원하도록 gRPC 확장


    - Credentials plugin API를 통해 개발자는 자신의 유형의 자격 증명을 연결할 수 있습니다. 이것은 다음으로 구성됩니다.


    개발자가 만든 하위 클래스에서 구현해야하는 순수 가상 GetMetadata 메서드가 들어있는 MetadataCredentialsPlugin 추상 클래스입니다.

    MetadataCredentialsFromPlugin 함수로, MetadataCredentialsFromPlugin 함수는 MetadataCredentialsPlugin에서 CallCredentials를 만듭니다.


    



## 참고

http://www.grpc.io/ 

https://en.wikipedia.org/wiki/GRPC
















Comments