gRPC python으로 실행하기

zammanssi·2023년 8월 3일
0

gRPC

목록 보기
1/1
post-thumbnail

gRPC

  • 구글에서 개발한 통신 프레임워크
  • 원격에 있는 애플리케이션의 메소드를 로컬 메소드처럼 직접 호출할 수 있다.
  • 클라이언트에서 서버로 바로 요청을 보낼 수 있다.
  • 분산 애플리케이션을 보다 쉽게 만들 수 있다.

gRPC 등장 배경

  • 마이크로 서비스 아키텍쳐, 클라우드 네이티브 아키텍쳐의 출현
    - 마이크로 서비스 : 애플리케이션이 소규모의 독립적인 구성 요소로 구축되는 아키텍쳐 스타일 중 하나.
    - 마이크로서비스 기반으로 구축되는 시스템은 프로세스 간 통신 기술을 사용해 네트워크를 통해 연결해야 한다.

  • 마이크로서비스 아키텍쳐 기반 구축 시스템, 분산 소프트웨어 구현 등의 증가로 기존의 RESTful 서비스의 단점을 보안하기 위해 gRPC 등장

gRPC의 구조 및 실행방법

구조

  • 서비스 인터페이스(.proto)
    gRPC 사용시 가장 먼저 작성해야 할 코드
    메소드 종류, 파라미터, 메시지 형식 등을 작성

  • gRPC Stub
    클라이언트 측 코드

  • gRPC Server
    서버 측 코드

실행방법

  1. ProductInfo.proto를 실행시키면 서버 스켈레톤과 클라이언트 스텁(총 2개)가 생성된다.

  2. 생성된 2개의 코드를 import하여 서버, 클라이언트 실행 코드를 작성한다.

  3. 서버측 코드를 실행시킨다.

  4. 클라이언트 측 코드를 실행시킨다.

gRPC를 실행해보자

간단하게 인사를 출력하는 예제를 따라 작성했다.
1. gRPC를 설치해준다. 다음 명령어를 차례로 터미널에 입력한다.

python -m pip install --upgrade pip
python -m pip install grpcio
python -m pip install grpcio-tools
  1. 프로토콜 버퍼(.proto 파일)를 작성한다.
syntax = "proto3";
package ecommerce;

service ProductInfo {
  rpc sayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
  1. 프로토콜 버퍼 파일을 실행한다.
    다음 명령어 실행
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./hello.proto

나는 파일명이 hello.proto였고,

  • hello_pb2_grpc.py : server 코드
  • hello_pb2.py : client코드
    이렇게 2개의 파일이 생성되었다.
  1. 서버 측, 클라이언트 측 실행코드를 작성한다.
  • hello_server.py
from concurrent import futures
import logging
import grpc

import hello_pb2
import hello_pb2_grpc

class HelloInfoServicer(hello_pb2_grpc.HelloInfoServicer):
    
    def sayHello(self, request, context):
        return hello_pb2.HelloReply(message='Hello, %s!' % request.name)
    

def serve():
    port = '50052'
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_HelloInfoServicer_to_server(HelloInfoServicer(), server)
    server.add_insecure_port('[::]:' + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()


if __name__ == '__main__':
    logging.basicConfig()
    serve()
  • hello_client.py
from __future__ import print_function

import logging

import grpc
import product_pb2
import product_pb2_grpc


def run():
    print("Will try to greet world ...")
    with grpc.insecure_channel('localhost:50052') as channel:
        stub = product_pb2_grpc.ProductInfoStub(channel)
        response = stub.sayHello(product_pb2.HelloRequest(name='azamman'))
    print("Greeter client received: " + response.message)


if __name__ == '__main__':
    logging.basicConfig()
    run()
  1. 작성한 서버, 클라이언트 파일 각각 다른 터미널에서 실행
    서버 -> 클라이언트 순서로 실행
python hello_server.py
python hello_client.py
  • 실행결과

profile
아잠만 - 벨로그에 물주기

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기