어떻게 python 으로 Zeroc Ice 응용 프로그램 을 개발 합 니까?

9727 단어 pythonZerocIce
Zeroc Ice 소개
  Zeroc ICE(Internet Communications Engine,인터넷 통신 엔진)는 현재 기능 이 비교적 강하 고 완 선 된 RPC 프레임 워 크 로 크로스 플랫폼,크로스 언어 호출 을 지원 합 니 다.TCP,UDP,SSL/TSL 또는 WebSocket 연결 을 통 해 동기 화,비동기 호출,서버 와 클 라 이언 트 간 의 양 방향 연결 을 지원 할 수 있 습 니 다.Zeroc ICE 의 효율 이 매우 높 고 효율 적 인 바 이 너 리 프로 토 콜 을 사용 하여 대역 폭 에 대한 소모 가 비교적 적다.심지어 위성 을 통한 RPC 호출 에 대해 서 는 제로 ICE 가 데이터 흐름 을 더 압축 할 수도 있다.또한 Zeroc ICE 는 패키지 해제 없 이 호출 요청 을 리 트 윗 할 수 있어 일반 리 트 윗 시 패키지 해제,재 압축 시간 을 줄 일 수 있다.
  Zeroc ICE 의 응용 은 icegrid 에 배치 하여 격자 계산 을 실현 할 수 있다.즉,클 라 이언 트 가 호출 할 때 목표 호스트 를 지정 하지 않 아 도 되 고 ICE 가 찾 는 것 을 책임 진다.서버 도 호출 할 때 만 열 수 있 습 니 다.동적 로드;같은 서비스 도 여러 개 를 배치 하여 높 은 가용성 을 실현 할 수 있다.
실험 안내
  Zeroc ICE 는 C++,C\#,Java,JavaScript,Python,Objective-C,Ruby,PHP,VB 등 크로스 언어 RPC 호출 을 지원 합 니 다.이번 실험 은 Python(Pyhon 2.7 이상 또는 Python 3 모두 가능)을 채택 했다.실험의 내용 은 icegrid 에 간단 한 서버 를 배치 하고 클 라 이언 트 가 호출 될 때 지정 한 내용 을 출력 하고 문자열 을 되 돌려 주 는 것 입 니 다.실험 절 차 는 다음 과 같다.
  • Zeroc ICE 설치
  • 서버 와 클 라 이언 트 프로그램 개발
  • icegrid
  • 에 배치
  • 클 라 이언 트 호출
  • 환경 준비
      이번 실험 에 적 용 된 운영 체 제 는 우 분투 14.04 다.다른 운영 체 제 를 사용 하면Zeroc ICE문서 에 따라 조정 할 수 있다.
    제로 아 이 스 설치
      시스템 에 Zeroc ICE 가 설치 되 어 있 지 않 고 ubuntu 의 소프트웨어 소스 에 도 zeroc ice 가 없 으 면 아래 절차 에 따라 설치 할 수 있 습 니 다.
    
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 5E6DA83306132997
    sudo apt-add-repository "deb http://zeroc.com/download/apt/ubuntu$(lsb_release -rs) stable main"
    sudo apt-get update
    sudo apt-get install zeroc-ice-all-runtime zeroc-ice-all-dev
      설치 후 시스템 에 slice2cpp,slice2java 등 Sliece(Zeroc ICE 가 정의 하 는 인터페이스 설명 언어,IDL)파일 을 해당 언어 로 변환 하 는 프로그램 과 icegrid,iceregistry,icegridadmin 등 프로그램 이 있 습 니 다.대상 언어 도구(예 를 들 어 slice2py)나 개발 패키지 가 없 으 면 특별 설치 가 필요 합 니 다.
    Zeroc ICE 를 설치 한 python 개발 패키지
      물론 이 단계 전에 python 과 pip(python 의존 관리 도구)를 먼저 설치 해 야 합 니 다.Zeroc ICE 의 python 개발 패키지(또는 모듈)는 zeroc-ice 라 고 하 며 pip 로 설치 할 수 있 습 니 다.
    
    sudo -H pip install zeroc-ice
      설치 과정 에서 일부 C/C++헤더 파일 이 부족 한 문제 가 발생 할 수 있 습 니 다.예 를 들 어 python.h,openssl/ssl.h,bzlib.h 가 부족 한 것 은 해당 하 는 개발 패 키 지 를 설치 하지 않 았 기 때 문 입 니 다.다음 명령 을 통 해 해결 할 수 있 습 니 다.
    
    sudo apt-get install python-dev
    sudo apt-get install libssl-dev
    sudo apt-get install libbz2-dev
    서버 와 클 라 이언 트 개발
    『8195』다음은 진정한 서버 와 클 라 이언 트 개발 입 니 다.개발 과정 은 보통:
  • Slice 언어 로 언어 와 무관 한 인터페이스 파일 정의
  • 지 정 된 언어의 인터페이스 파일 로 변환
  • 인터페이스 파일 에 따라 서버 와 클 라 이언 트 프로그램 개발
  • 서버 와 클 라 이언 트 의 프로필 작성
  • slice 언어 정의 인터페이스 사용
    
    // Printer.ice
    module Demo {
      interface Printer {
         string printString(string s);
      };
    };
    지정 한 언어의 인터페이스 파일 생 성
      이번 개발 에 사 용 된 언어 는 python 이기 때문에 사용 합 니 다.
    slice2py Printer.ice
    예 를 들 어 slice2java,slice2cpp.
      명령 이 성공 적 으로 실행 되 었 습 니 다.대상 디 렉 터 리 에 Printer 가 생 성 되 었 음 을 볼 수 있 습 니 다.ice.py 파일 과 데모 디 렉 터 리 입 니 다.Demo 는 slice 인터페이스 파일 에서 정 의 된 module 이름 입 니 다.
    컴 파일 서버
    
    import sys, traceback, Ice 
    import Demo
    
    # PrinterI      ,Demo.Printer slice2py     
    class PrinterI(Demo.Printer):
      def printString(self, s, current=None):
        print(s)
        return "Server Printed: " + s 
    
    status = 0 
    ic = None
    
    try:
      #    zeroc ice  
      ic = Ice.initialize(sys.argv)
      #     SimplePrinterAdapter      ,        tcp,    10000
      adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000")
      #          ,       SimplePrinter         
      object = PrinterI()
      adapter.add(object, ic.stringToIdentity("SimplePrinter"))
      #        
      adapter.activate()
      #                ,  ice    ,      
      ic.waitForShutdown()
    except:
      traceback.print_exc()
      status = 1 
    
    if ic: 
      # Clean up
      try:
        ic.destroy()
      except:
        traceback.print_exc()
        status = 1 
    
    sys.exit(status)
      server.cfg 내용 은 다음 과 같 습 니 다.
    
    PrinterAdapter.AdapterId=PrinterAdapter
    PrinterAdapter.Endpoints=tcp
      그 중에서 tcp 의 뜻 은 tcp 프로 토 콜 을 통 해 호출 되 고 서버 는 tcp 프로 토 콜 의 연결 요청 을 감청 합 니 다.
    클 라 이언 트 작성
    
    import sys, traceback, Ice 
    import Demo
    
    status = 0 
    ic = None
    
    try:
      ic = Ice.initialize(sys.argv)
      #     SimplePrinter    ,   tcp  ,       10000  
      base = ic.stringToProxy("SimplePrinter:default -p 10000")
      #             
      printer = Demo.PrinterPrx.checkedCast(base)
      if not printer:
        raise RuntimeError("Invalid proxy")
      #       printString  ,       
      rs = printer.printString("Hello World, I'm talking to you through RPC")
      print(rs)
    
    except:
      traceback.print_exc()
      status = 1 
    
    if ic: 
      # Clean up
      try:
        ic.destroy()
      except:
        traceback.print_exc()
        status = 1 
    
    sys.exit(status)
    클 라 이언 트 의 설정 파일 은 다음 과 같 습 니 다.
    
    Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061
    클 라 이언 트 직렬 서버
      상기 프로그램 개발 이 끝 난 후에 icegrid 에 배치 하지 않 아 도 바로 실행 할 수 있 습 니 다.설정 파일 은 icegrid 에서 위치 추적 과 연결 서 비 스 를 사용 합 니 다.이 때 는 서버 를 실행 하면 서 클 라 이언 트 를 실행 하고 기능 을 검사 할 수 있 습 니 다.
    python Server.py
    프로 세 스 가 끝나 지 않 고 연결 을 기다 리 고 있 는 것 을 볼 수 있 습 니 다.그리고 다른 터미널 을 만들어 클 라 이언 트 프로그램 을 실행 합 니 다.
    python Client.py
    『8195』실행 후 서버 와 클 라 이언 트 창의 출력 을 볼 수 있 습 니 다.
    icegrid 에 배치
      icegrid 는 Zeroc ICE 의 클 라 우 드 컴 퓨 팅 솔 루 션 입 니 다.이 는 각종 서비스 단 을 여러 대의 기계 에 배치 하고 클 라 이언 트 호출 에 서비스 포 지 셔 닝,서비스 활성화,부하 균형,고장 이전 등 서 비 스 를 제공 할 수 있다.클 라 이언 트 는 지정 한 서비스 등록 센터 에 연결 하면 서비스 이름(여 기 는 Simple Printer)과 연결 프로 토 콜(Endpoints,여 기 는 tcp)에 따라 해당 하 는 서 비 스 를 찾 을 수 있 습 니 다.서 비 스 는 등록 할 때 도 실행 상태 에 있 을 필요 가 없 으 며,icegrid 에서 호출 요청 에 따라 자동 으로 시작 할 수 있 습 니 다.

    등록 센터 설정
    registry.cfg(서비스 등록 센터 설정 파일)
    
    IceGrid.InstanceName=SzcIceGrid 
    #              
    IceGrid.Registry.Client.Endpoints=tcp  -p 4061
    IceGrid.Registry.Server.Endpoints=tcp
    IceGrid.Registry.Internal.Endpoints=tcp
    IceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
    IceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
    #          ,         
    IceGrid.Registry.Data=/home/rocway/test/zerocice/registry
    IceGrid.Registry.DynamicRegistration=1
    Ice.Admin.InstanceName=AdminInstance
    Ice.Admin.ServerId=Admin
    메모:파일 의 경 로 를 수 동 으로 만 듭 니 다.
    노드 설정
    노드 는 서비스 가 있 는 기계 이다.실제 생산 환경 에서 서비스 등록 센터 도 그 중의 특정한 노드 에서 운행 할 수 있다.
    node 1.cfg(서비스 가 있 는 노드 의 프로필)
    
    #        
    Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061 
    #node  
    IceGrid.Node.Name=node1 
    IceGrid.Node.Endpoints=tcp 
    #node     
    IceGrid.Node.Data=/home/rocway/test/zerocice/nodes/node1
    IceGrid.Node.Output=/home/rocway/test/zerocice/nodes/node1
    IceGrid.Node.CollocateRegistry=0
    메모:위 파일 에서 언급 한 경 로 를 수 동 으로 만 듭 니 다.이 중 서버 프로그램의 출력 은 Ouput 가 가리 키 는 경로 의*.out 파일 에 저 장 됩 니 다.
    응용 설명 파일
    『8195』응용 설명 파일 은 서버 프로그램 이 icegrid 에서 의 배치 상황 을 설명 하 는 데 사 용 됩 니 다.응용 이름,서비스 프로그램의 경로,실행 매개 변수 등 을 포함한다.
    app.xml
    
    <icegrid>
      <application name="PrinterApplication">
        <node name="node1">
          <server id="PrinterServer" exe="python" activation="on-demand">
            <adapter name="PrinterAdapter" endpoints="tcp -h 127.0.0.1">
              <object identity="SimplePrinter" type="::Demo::Printer" property="Identity"/>
            </adapter>
            <option>/home/rocway/test/zerocice/Server.py</option>  
            <property name="Ice.Trace.Network" value="1"/>
            <properties> 
              <property name="Ice.ThreadPool.Server.SizeMax" value="1" /> 
            </properties> 
                <property name="IceMX.Metrics.Debug.GroupBy" value="id"/>
                <property name="IceMX.Metrics.Debug.Disabled" value="1"/>
                <property name="IceMX.Metrics.ByParent.GroupBy" value="parent"/>
                <property name="IceMX.Metrics.ByParent.Disabled" value="1"/>   
          </server>
        </node>
      </application>
    </icegrid>
    icegrid 시작
    1.icegrid 등록 센터 시작icegridregistry --Ice.Config=registry.cfg2.노드 시작icegridnode --Ice.Config=node1.cfg3.노드 에 있 는 응용 프로그램 을 시작 하고 응용 프로그램 을 추가 합 니 다.icegridadmin --Ice.Config=node1.cfg application add app.xml4.추 가 된 앱 보기application describe PrinterApplication5.각 노드 의 응용 서비스 시작icegridgui6.클 라 이언 트 프로그램 실행python Client.py실험 총화
      이번 실험 은 icegrid 에 서비스 프로그램 을 배치 하고 클 라 이언 트 가 icegrid 의 서비스 등록 센터 를 통 해 이 서 비 스 를 호출 하 는 것 을 실현 했다.실험 에서 서버 와 클 라 이언 트 는 모두 Python 을 사 용 했 고 관심 이 있 는 학생 들 도 서로 다른 언어 로 서버 와 클 라 이언 트 를 개발 하여 Zeroc ICE 의 크로스 언어 RPC 호출 을 시도 할 수 있 습 니 다.
      이번 실험 은 여기까지 입 니 다.Zeroc ICE 에 관 한 다른 내용 은 후속 과정 에 주목 하 시기 바 랍 니 다.
    이상 은 python 으로 Zeroc Ice 애플 리 케 이 션 을 개발 하 는 방법 에 대한 상세 한 내용 입 니 다.python 이 Zeroc Ice 애플 리 케 이 션 을 개발 하 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기