gRPC

2017년에 Thrift로 실험을 했으나 2021년 현재 gRPC가 완전히 주도권을 잡았다. 사실상 표준 RPC 프로토콜로 활약중이다.

Tutorial

『gRPC 시작에서 운영까지』 내용에 따라 1장1 Go 서버와 Java 클라이언트가 잘 동작한다.

Server: Go(Linux)

Go에서는 go mod init 후에 proto를 복사하고, protoc을 실행한다. protobuf는 $ sudo apt install protobuf-compiler로 설치한다. 또는 우분투에서는 $ sudo snap install protobuf --classic로 설치할 수 있다.

Client: Java

(주제와 다른 이슈) /usr/libexec/java_home -V에 JDK외에 설치가 확인되어 제대로 된 JAVA_HOME을 지정해주지 못하고 있음. /usr/libexec/java_home -v 1.8.0로 처리했다.

(마찬가지로 주제와 다른 이슈) 사내망에서 인증서 오류로 gradle build가 되지 않는다. 외부망에서 빌드한(서버에서 라이브러리를 받아온) 이후에 사내망 빌드가 가능하다.

코드 생성은 gradle build로 가능하다.

Generate code from *.proto

Python

$ python -m grpc_tools.protoc \
    -I. \
    --python_out=. \
    --grpc_python_out=. \
    calculator.proto

or

$ brew install protobuf
$ protoc -I. --python_out=. calculator.proto

현재 디렉토리에 pb가 생성된다.

Go

Go는 다소 복잡하다. 다음은 proto 디렉토리 하위에 pb가 생성된다.

$ brew install protobuf protoc-gen-go
$ protoc -I. \
    --go_out=plugins=grpc:. \
    --go_opt=Mcalculator.proto=proto/ \
    calculator.proto
  • plugins=grpcUnimplementedXXXServer, RegisterXXXServer wrapper 생성을 위해 필요하다.
  • --go_opt=Mcalculator.proto=proto/ 패키지명을 지정한다. 그렇지 않으면 proto 파일에서 option go_package를 지정해야 한다. main.go에서 해당 패키지를 import하여 사용하게 되며, 반드시 하나 이상의 /가 필요하다.
    import pb "XXX.com/pi/proto"
    

grpcurl

proto 파일을 지정하여 다음과 같이 호출할 수 있다.

$ brew install grpcurl
$ grpcurl \
    -proto product_info.proto \
    -d '{"name": "Samsung S10", 
        "description": "Galaxy S10", 
        "price": 700.0}' \
    xxx.a.run.app:443 \
    ecommerce.ProductInfo.addProduct | gnomon

속도 측정을 위해 gnomon을 파이프로 연결했다.

기타

  • Cloud Run Python 가이드2 대로 잘 동작한다.
  • gRPC는 docker의 python:3.8-alpine에서는 pip 설치가 진행되지 않았다. slim으로 가능.
  • Cloud Run에 올릴때는 --plaintext 옵션에 주의한다. 로컬에서는 해당 옵션이 필요하지만 서버에서는 당연히 필요 없기 때문. 게다가 오류도 Failed to dial target host로 나오기 때문에 혼동하기 쉽다.

Last Modified: 2021/06/08 13:03:45

is a collection of Papers I have written.
© 2000 - Sang Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.