gRPC 소개
구글에서 개발한 RPC(Remote Procedure Call) 시스템
client - server 두 소프트웨어 사이에서 통신하고 데이터 교환 가능
HTTP 기반 통신
HTTP 요청 - 응답 메커니즘을 통해 데이터를 전달한다. 이 매커니즘이 REST API에 비해 잘 보이지 않는다.
비동기식 통신 및 stateless 설계 지원.
gRPC 를 이용하면 클라이언트가 하나 또는 여러 개의 API 요청을 서버에 보낼 수 있다.
따라서 서버에서 하나 또는 여러 개의 응답이 발생할 수 있음
데이터 연결은 단방향, 서버 스티리밍, 클라이언트 스트리밍 또는 양방향 스트리밍일 수 있음
-> HTTP 2를 기반으로 하기 때문
gRPC 클라이언트는 애플리케이션 내에서 내부에서 함수를 직접적으로 호출하는 것처럼 이러한 함수를 간접적으로 호출한다.
서비스 지향 설계
데이터 교환 형식
기본적으로 protocol Buffer 형식을 사용하지만 기본 JSON 지원도 제공
gRPC는 구조를 바이너리 형식으로 직렬화한 다음 지정된 프로그래밍 언어로 역직렬화 한다.
전송중에 압축되지 않는 JSON을 사용하는 것보다 더 빠름
클라이언트와 서버에서 동일한 proto 파일에 엑세스할 수 있어야 함
파일을 업데이트하려면 서버와 클라이언트 모두에서 업데이트가 필요함
python gRPC connection 단방향 예제
//.proto file
syntax = "proto3";
package test;
service aasConnection{
rpc connection (testRequest) returns (testResponse) {}
}
message testRequest { // 메시지에 포함할 각 데이터에 하나씩 필드를 지정
string aas_data = 1;
}
message testResponse{
string status = 1;
}
* message 자료형 *
double, float, int32, int64, uint32, uint64
sint32, sint64 (s: singed, 음수 연산에 더 효율적)
fixed32, fixed64 (고정길이 인코딩)
sfixed32, sfixed64
bool
string
bytes
enums
기본 값은 언어에 의존적임
* RPC 서비스 *
원격 프로시저 서비스를 정의.
PRC 서비스는 클라이언트와 서버 간의 상호작용을 정의하는 인터페이스
서버에서는 각 RPC 메서드 구현을 제공하고, 클라이언트에서는 해당 서비스를 호출하여 서버와 상호작용
# server.py
from concurrent import futures
import grpc
import test_pb2 # proto 파일 컴파일 하고 나온 파일
import test_pb2_grpc # proto 파일 컴파일 하고 나온 파일
class GetAAS(test_pb2_grpc.aasConnectionServicer): # 서비스 구현체
def connection(self, request, context):
try:
print("connected - - -")
return test_pb2.testResponse(status ="200점 만점 잘 들어갔답니다~")
except Exception as e:
print(e)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 서버에 gRPC 서비스의 구현 추가
test_pb2_grpc.add_aasConnectionServicer_to_server(GetAAS(), server=server)
# gRPC 서버가 50051 포트에서 클라이언트의 연결 수락 [::] -> IPv6 주소. 보든 인터페이스에서 클라이언트 연결 수락.
server.add_insecure_port("[::]:50051")
# gRPC 서버 시작
server.start()
print("gRPC server start")
# 서버가 종료될 때까지 대기
server.wait_for_termination()
if __name__=="__main__":
serve()
# client.py
from __future__ import print_function
import logging
import grpc
import test_pb2
import test_pb2_grpc
def run():
# gRPC 클라이언트 생성, 50051포트에 대한 비보안 (insecure) 연결을 사용하여 서버 연결
with grpc.insecure_channel("localhost:50051") as channel:
# gPRC 클라이언트 스텁을 생성 -> gRPC 서비스의 클라이언트 측 인터페이스 제공
stub = test_pb2_grpc.aasConnectionStub(channel)
# 클라이언트 스텁을 사용하여 gRPC 서버에 요청을 보냄
res = stub.connection(test_pb2.testRequest(aas_data="대충AAS파일지나갑니다~~~호호홍"))
print("Hello client received : " + res.status)
if __name__ == "__main__":
logging.basicConfig()
run()
Result
- server
- client