gRPC란

  • RPC 란
    • Remote Procedure Call의 약자로 간편하게 다른 서비스의 함수 프로시저등을 호출할 수 있는 프로토콜이다. 다양한 언어를 지원하므로 언어가 다르거나 한 다른 서비스에 있는 함수나 프로시저를 호출하여 사용할 수 있다. 다양한 언어를 사용하는 MSA 구조에서 더욱 좋을 것 같다.
  • gRPC
    • gRPC는 구글에서 만든 RPC로 TCP/IP 와 HTTP/2를 프로토콜을 사용한다.
    • gRPC는 IDL(Interface Definition Language)로 protocol buffer를 사용하는데 .proto 파일에 직렬화할 데이터를 정의한다.

gRPC proto 파일

syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// Message Definition
message HelloRequest {
  string name = 1;
  int32 num = 2;
  bool has_boolean = 3;
}

message HelloReply {
  string message = 1;
  int32 id = 2;
  bool has_boolean = 3;
}

파일을 작성 후

$ python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto

명령어를 입력하면

hello_pb2.py
hello_pb2_grpc.py

파일이 생성된다.
해당 파일은 python gRPC server와 client에 import 하여 사용된다.


python gRPC

server

from concurrent import futures
import time

import grpc

import hello_pb2
import hello_pb2_grpc

class Greeter(hello_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return hello_pb2.HelloReply(message=f'Hello, {request.name}!, {request.num}!, {request.has_boolean}!')


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('localhost:50051')
    server.start()
    try:
        while True:
            time.sleep(60)
    except KeyboardInterrupt:
        server.stop(0)


if __name__ == '__main__':
    serve()
    

client

from __future__ import print_function

import grpc

import hello_pb2
import hello_pb2_grpc


def run():
    channel = grpc.insecure_channel('localhost:50051')
    stub = hello_pb2_grpc.GreeterStub(channel)
    response = stub.SayHello(hello_pb2.HelloRequest(name='python', num=1, has_boolean=True))
    print("Greeter client received: " + response.message)


if __name__ == '__main__':
    run()

파일을 작성 후 run 해보면 다음과 같이 결과값을 확인할 수 있다.

Greeter client received: Hello, python!, 1!, True!