어떻게 Python 으로 gRPC 서 비 스 를 구축 합 니까?

6055 단어 PythongRPC
개술
gRPC 서비스의 대체 구성 도 는 다음 과 같다.

그림 1 에 따 르 면 grpc 의 서 비 스 는 언어 를 뛰 어 넘 지만 같은 프로 토 콜(proto)을 따라 야 한다.REST 서비스 에 비해 gPRC 의 뚜렷 한 장점 은 바 이 너 리 인 코딩 을 사 용 했 기 때문에 JSON/HTTP 보다 빠 르 고 뚜렷 한 인터페이스 규범 과 스 트림 전송 을 지원 하 는 것 이다.그러나 그의 실현 은 rest 서비스 에 비해 약간 복잡 하 다.다음은 gRPC 서 비 스 를 구축 하 는 절 차 를 간단하게 소개 한다.
2.python 설치 에 필요 한 라 이브 러 리
pip install grpcio
pip install grpcio-tools  
pip install protobuf
3.gRPC 의 인 터 페 이 스 를 정의 합 니 다.
gRPC 서 비 스 를 만 드 는 첫 번 째 단 계 는.proto 파일 에서 인 터 페 이 스 를 정의 하 는 것 입 니 다.proto 는 프로 토 콜 파일 입 니 다.클 라 이언 트 와 서버 의 통신 인 터 페 이 스 는 바로 proto 파일 협정 을 통 해 서로 다른 언어 에 따라 대응 하 는 코드 파일 을 생 성 할 수 있 습 니 다.이 프로 토 콜 파일 은 주로 서비스(service)인터페이스 와 요청 매개 변수 와 해당 하 는 결과 의 데이터 구 조 를 정의 하 는 것 입 니 다.다음은 간단 한 예 입 니 다.

syntax = "proto3";
​
option cc_generic_services = true;
​
//      
service GrpcService {
    rpc hello (HelloRequest) returns (HelloResponse) {}  //             ,         
}
​
//     
message HelloRequest {
    string data = 1;   //  1,2        ,        
    Skill skill = 2;  //          ,    
};
​
//     
message HelloResponse {
    string result = 1;
    map<string, int32> map_result = 2; //  map    ,  dict
};
​
message Skill {
    string name = 1;
};
4.protoc 와 해당 하 는 플러그 인 컴 파일 을 사용 하여 해당 하 는 언어 코드 를 생 성 합 니 다.
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=. ./hello.proto
컴 파일 도 구 를 이용 하여 proto 파일 을 py 파일 로 바 꾸 고 현재 파일 디 렉 터 리 에서 상기 코드 를 직접 실행 하면 됩 니 다.
1.-I proto 가 있 는 디 렉 터 리 를 지정 합 니 다.
2.m protoc 를 통 해 py 파일 생 성 지정
3.--python_out py 파일 을 만 드 는 출력 경 로 를 지정 합 니 다.
4.hello.proto 가 입력 한 proto 파일
위 명령 을 실행 하면 hello 생 성pb2.py 와 hellopb2_grpc.py 이 두 파일.
5.grpc 서버 코드 작성

#! /usr/bin/env python
# coding=utf8
​
import time
from concurrent import futures
​
import grpc
​
from gRPC_example import hello_pb2_grpc, hello_pb2
​
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
​
​
class TestService(hello_pb2_grpc.GrpcServiceServicer):
    '''
      GrpcServiceServicer,  hello  
    '''
    def __init__(self):
        pass
​
    def hello(self, request, context):
        '''
            hello   ,   pb       HelloResponse  
        :param request:
        :param context:
        :return:
        '''
        result = request.data + request.skill.name + " this is gprc test service"
        list_result = {"12": 1232}
        return hello_pb2.HelloResponse(result=str(result),
                                       map_result=list_result)
​
def run():
    '''
          
    :return:
    '''
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_GrpcServiceServicer_to_server(TestService(),server)
    server.add_insecure_port('[::]:50052')
    server.start()
    print("start service...")
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)
​
​
if __name__ == '__main__':
    run()
서버 측 에 서 는 proto 파일 의 GrpcService 인터페이스 수 요 를 충족 시 키 기 위해 hello 방법 이 필요 합 니 다.hello 방법의 입력 매개 변 수 는 proto 파일 에서 정 의 된 HelloRequest 입 니 다.context 는 필드 를 유지 하고 상관 하지 않 습 니 다.반환 매개 변 수 는 proto 에서 정 의 된 HelloResponse 입 니 다.서비스 시작 코드 는 표준 입 니 다.수요 에 따라 서 비 스 를 제공 하 는 ip 주소 와 포트 번 호 를 수정 할 수 있 습 니 다.
6.gRPC 클 라 이언 트 의 코드 작성

#! /usr/bin/env python
# coding=utf8
​
import grpc
​
from gRPC_example import #! /usr/bin/env python
# coding=utf8
​
import grpc
​
from gRPC_example import hello_pb2_grpc, hello_pb2
​
​
def run():
    '''
              
    :return:
    '''
    conn=grpc.insecure_channel('localhost:50052')
    client = hello_pb2_grpc.GrpcServiceStub(channel=conn)
    skill = hello_pb2.Skill(name="engineer")
    request = hello_pb2.HelloRequest(data="xiao gang", skill=skill)
    respnse = client.hello(request)
    print("received:",respnse.result)
​
​
if __name__ == '__main__':
    run()
​
​
def run():
    '''
              
    :return:
    '''
    conn=grpc.insecure_channel('localhost:50052')
    client = hello_pb2_grpc.GrpcServiceStub(channel=conn)
    skill = hello_pb2.Skill(name="engineer")
    request = hello_pb2.HelloRequest(data="xiao gang", skill=skill)
    response = client.hello(request)
    print("received:",response.result)
​
​
if __name__ == '__main__':
    run()
클 라 이언 트 사 이 드 코드 의 실현 은 비교적 간단 합 니 다.먼저 ip 과 포트 번 호 를 정의 한 다음 에 HelloRequest 데이터 구 조 를 정의 하고 hello 를 원 격 으로 호출 하면 됩 니 다.강조해 야 할 것 은 클 라 이언 트 와 서버 는 반드시 import 와 같은 proto 파일 을 컴 파일 하여 생 성 된 hellopb2_grpc, hello_pb2 모듈 은 서버 와 클 라 이언 트 가 사용 하 는 언어 가 다 르 더 라 도 grpc 인터페이스 규범 이 일치 하 는 표현 입 니 다.
7.호출 테스트
서버 를 실행 하 는 코드 를 먼저 시작 하고 클 라 이언 트 를 실행 하 는 코드 를 시작 하면 됩 니 다.
8.gRPC 의 사용 총화
인터페이스 문 서 를 정의 하 다.
도구 생 성 서버/클 라 이언 트 코드
서버 보충 업무 코드
클 라 이언 트 가 gRPC 연결 을 구축 한 후 자동 으로 생 성 된 코드 호출 함 수 를 사용 합 니 다컴 파일,운영
이상 은 Python 으로 gRPC 서 비 스 를 어떻게 구축 하 는 지 에 대한 상세 한 내용 입 니 다.Python 으로 gRPC 서 비 스 를 구축 하 는 것 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기