Python 으로 간단 한 gRPC 서 비 스 를 작성 하 는 상세 한 과정

6870 단어 PythongRPC 서비스
gRPC 는 어떠한 환경 에서 도 작 동 할 수 있 는 현대 오픈 소스 고성능 RPC 프레임 워 크 입 니 다.이 는 삽입 가능 한 지원 을 통 해 데이터 센터 내 와 데이터 센터 를 뛰 어 넘 는 서 비 스 를 효과적으로 연결 하여 부하 균형,추적,운행 상황 검사 와 인증 을 실현 할 수 있다.장치,모 바 일 애플 리 케 이 션,브 라 우 저 를 백 엔 드 서비스 에 연결 하기 위해 분포 식 컴 퓨 팅 의 마지막 마일 에 도 적용 된다.
Python 으로 간단 한 gRPC 서 비 스 를 작성 합 니 다.
grpc 홈 페이지 python 참조:https://www.grpc.io/docs/languages/python/quickstart/
http://grpc.github.io/grpc/python/grpc.html
  • Python 3.5 or higher
  • pip version 9.0.1 or higher
  • gRPC 관련 라 이브 러 리 설치
    grpcio-tools 는 주로 우리 의 protocol buffer 정의 에 따라 Python 코드 를 생 성 합 니 다.공식 적 으로 는 Protobuf code generator for gRPC 라 고 설명 합 니 다.
    
    #apt install python3-pip
    pip install grpcio
    pip install protobuf
    pip install grpcio_tools
    proto 파일 작성
    proto 는 프로 토 콜 파일 입 니 다.클 라 이언 트 와 서버 의 통신 인 터 페 이 스 는 바로 proto 파일 협정 을 통 해 서로 다른 언어 에 따라 대응 하 는 코드 파일 을 생 성 할 수 있 습 니 다.
    heartbeat.proto 파일:
    
    syntax = "proto3";
    
    message HeartbeatRequest{
    	string Host      = 1;
    	int32  Mem       = 2;
    	int32  Disk      = 3;
    	int32  Cpu       = 4;
    	int64  Timestamp = 5;
    	int64  Seq       = 6;
    
    }
    
    message HeartbeatResponse{
    	int32  ErrCode   = 1;
    	string ErrMsg    = 2;
    }
    heartbeat_service.proto
    
    syntax = "proto3";
    
    import "heartbeat.proto";
    
    // HeartBeatService
    service HeartBeatService{
        rpc HeartBeat(HeartbeatRequest) returns(HeartbeatResponse){}
    }
    핵심 은 데이터 형식 이 필요 한 파일 을 만 드 는 데 사용 되 는 것 입 니 다.하 나 는 호출 방법 을 만 드 는 데 사용 되 는 클래스 입 니 다.정의 데이터 형식
    proto 를 통 해.py 파일 생 성
    proto 파일 은 protoc 를 통 해 대응 하 는.py 파일 을 생 성 해 야 합 니 다.protoc 의 아래로 딩 주소.압축 해제 디 렉 터 리 를 path 환경 변수 에 추가 합 니 다.
    
    pip install grpcio
    install grpcio-tools
    #pip  install --upgrade protobuf
    메모:[아래 명령 은 proto 파일 이 있 는 디 렉 터 리 에서 실 행 됩 니 다.-I 는 proto 디 렉 터 리 를 지정 하 는 데 사 용 됩 니 다.]
    
    python -m grpc_tools.protoc -I=. --python_out=.. heartbeat.proto
    python -m grpc_tools.protoc -I=. --grpc_python_out=.. heartbeat_service.proto
  • -I proto 가 있 는 디 렉 터 리 를 지정 합 니 다
  • -m protoc 를 통 해 py 파일 생 성 지정
  • Cpython_out 에서 py 파일 을 만 드 는 출력 경로
  • heartbeat.proto、heartbeat_service.proto 가 입력 한 proto 파일
  • 생 성 된 파일 이름 중 xxxpb2.py 는 바로 우리 가 방금 데이터 구조 파일 을 만 들 었 는데 그 안에 함수 매개 변수 와 데이터 구 조 를 정의 합 니 다.xxx_pb2_grpc.py 는 우리 가 정의 하 는 함수 로 우리 고객 센터 rpc 의 미래 호출 방법 을 정의 합 니 다.
  • 클 라 이언 트 와 서버 코드 컴 파일
    서버
    
    #!/usr/bin/env python
    # coding=utf-8
    import sys
    from concurrent import futures
    import time
    
    import grpc
    from google.protobuf.json_format import MessageToJson
    
    import heartbeat_service_pb2_grpc
    import heartbeat_pb2
    from lib.core.log import LOGGER
    
    
    class HeartBeatSrv(heartbeat_service_pb2_grpc.HeartBeatServiceServicer):
        def HeartBeat(self, msg, context):
            try:
                # LOGGER.info(MessageToJson(msg, preserving_proto_field_name=True))
                body = MessageToJson(msg, preserving_proto_field_name=True)
                LOGGER.info("Get Heartbeat Request: %s", body)
    
                response = heartbeat_pb2.HeartbeatResponse()
                response.ErrCode = 0000
                response.ErrMsg = "success"
    
                return response
            except Exception as e:
                print("exception in heartbeat")
                LOGGER.error("RPC Service exception: %s", e)
                response = heartbeat_pb2.HeartbeatResponse()
                response.ErrCode = 500
                response.ErrMsg = "rpc error: %s" % e
                return response
    
    
    def server(host, rpc_port):
        #     thread pool     server   
        #              ,concurrent.futures      ,         
        grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=100))
        #    SSL
        grpc_server.add_insecure_port('[::]' + ':' + str(rpc_port))
        # This method is only safe to call before the server is started.
        #       HeartBeatSrv(         )
        heartbeat_service_pb2_grpc.add_HeartBeatServiceServicer_to_server(HeartBeatSrv(), grpc_server)
        #          , start()     
        #      
        grpc_server.start()
        LOGGER.info("server start...")
        while 1:
            time.sleep(10)
        #grpc_server.wait_for_termination()
    
    
    def main():
        try:
            LOGGER.info("begin start server")
    
            rpc_port = 8090
            host = "::"
            server(host, rpc_port)
    
        except Exception as e:
            LOGGER.error("server start error: %s", e)
            time.sleep(5)
    
    
    if __name__ == '__main__':
        LOGGER.info(sys.path)
        main()
    클 라 이언 트
    
    from time import sleep
    
    import grpc
    
    import heartbeat_pb2
    import heartbeat_service_pb2_grpc
    from lib.core.log import LOGGER
    
    
    def run(seq):
        option = [('grpc.keepalive_timeout_ms', 10000)]
        #
        with grpc.insecure_channel(target='127.0.0.1:8090', options=option) as channel:
            #      
            stub = heartbeat_service_pb2_grpc.HeartBeatServiceStub(channel)
            # stub       
            response = stub.HeartBeat(heartbeat_pb2.HeartbeatRequest(Host='hello grpc', Seq=seq), timeout=10)
            LOGGER.info("response ErrCode:%s", response.ErrCode)
    
    
    if __name__ == '__main__':
    
        for i in range(1, 10000):
            LOGGER.info("i: %s", i)
            sleep(3)
            run(i)
    레 퍼 런 스
    Python 을 사용 하여 gRPC 통신 실현
    참조 URL:https://zhuanlan.zhihu.com/p/363810793
    python grpc 구성 서비스
    https://www.jianshu.com/p/10d9ca034567
    python grpc 서버 와 클 라 이언 트 호출 demo
    참조 URL:https://blog.csdn.net/qq_42363032/article/details/115282405
    파 이 썬 으로 간단 한 gRPC 서 비 스 를 작성 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 gRPC 서비스 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기