Zeroc Ice grid 연구 학습

12318 단어

개념


slice: ice는 자신의 인터페이스 정의 언어를 제공합니다.rpc의 인터페이스와 대상을 정의하는 데 사용됩니다.
ice.object: rpc에서 호출된 인터페이스는 ice에서 계승해야 합니다.Object
servant:ice.Object의 실례화 대상은 servant라고 하는데 rpc가 호출하는 것이 바로 servant 대상이기 때문에 servant는 라인 보안이 필요합니다.
endpoints: 클라이언트 rpc 호출 서버 주소
icebox:servant 용기
icenode:icebox 용기
registry: 등록 센터, icenode의 등록을 관리하고 발표를 책임집니다.

2. 배치


단계:
  • registry
  • 시작
  • node를 시작하고registry
  • 에 등록
  • 코드를 노드 서버에 배치
  • 응용 설명 파일을registry에 적용하고 node는 자동으로 응용 프로그램을 시작합니다
  • 셋째, 프로필


    registry 프로필 하나:registry.cfg
    node 프로필 n개:node1.cfg, node2.cfg
    설명 파일 app 적용.xml
    프로필 상세 정보:
    registry.cfg
    # grid 
    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=/data/shizc/Desktop/ice/registry
    IceGrid.Registry.DynamicRegistration=1
    Ice.Admin.InstanceName=AdminInstance
    Ice.Admin.ServerId=Admin

    node1.cfg
    #  
    Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061
    #node 
    IceGrid.Node.Name=node1
    IceGrid.Node.Endpoints=tcp
    #node 
    IceGrid.Node.Data=/data/shizc/Desktop/ice/nodes/node1
    IceGrid.Node.Output=/data/shizc/Desktop/ice/nodes/node1
    IceGrid.Node.CollocateRegistry=0
    #IceGrid.Node.Trace.Replica=2
    #IceGrid.Node.Trace.Activator=3
    #IceGrid.Node.Trace.Adapter=3
    #IceGrid.Node.Trace.Server=3

    node2.cfg
    #  
    Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061
    
    IceGrid.Node.Name=node2
    IceGrid.Node.Endpoints=tcp
    IceGrid.Node.Data=/data/shizc/Desktop/ice/nodes/node2
    IceGrid.Node.Output=/data/shizc/Desktop/ice/nodes/node2
    IceGrid.Node.CollocateRegistry=0
    #IceGrid.Node.Trace.Replica=2
    #IceGrid.Node.Trace.Activator=3
    #IceGrid.Node.Trace.Adapter=3
    #IceGrid.Node.Trace.Server=3

    app.xml
    <icegrid>
      <application name="FileSystemApp">
        <properties id="MultiThreaded" >
          <property name="Ice.PrintStackTraces" value="1" ></property>
          <property name="IceSSL.Trace.Security" value="2" ></property>
          <property name="Ice.ThreadPool.Client.Size" value="2" ></property>
          <property name="Ice.ThreadPool.Client.SizeMax" value="50" ></property>
          <property name="Ice.ThreadPool.Server.Size" value="10" ></property>
          <property name="Ice.ThreadPool.Server.SizeMax" value="100" ></property>
          <property name="IceBox.InheritProperties" value="1" ></property>
          <property name="Ice.Override.ConnectTimeout" value="5000" ></property>
          <property name="Ice.Override.Timeout" value="10000" ></property>
          <property name="IceBox.Trace.ServiceObserver" value="1" ></property>
          <property name="Ice.Default.LocatorCacheTimeout" value="300" ></property>
          <property name="Ice.BackgroundLocatorCacheUpdates" value="1" ></property>
        </properties>
        <!--   -->
        <server-template id="FileSystemServerIceBoxTemplate">
            <parameter name="index" default="0"></parameter>
            <!-- exe java  -->
            <icebox id="FileSystemServerIceBox${index}" exe="java" activation="on-demand" >
              <properties>
                <properties refid="MultiThreaded" />
              </properties>
              <option>-Xmx512M</option>
              <!-- icebox main  -->
              <option>IceBox.Server</option>
              <!--   -->
              <env>CLASSPATH=.:/usr/share/java/*:/data/shizc/Desktop/ice/bin</env>
              <!-- entry icebox service, replica-group endpoints  -->
              <service name="FilesystemService" entry="service.FilesystemService">
                <adapter name="FilesystemService" id="FilesystemService${index}" endpoints="default" replica-group="FilesystemServiceRep" ></adapter>
              </service>
            </icebox>
        </server-template>
        
        <replica-group id="FilesystemServiceRep">
          <load-balancing type="round-robin" n-replicas="0" />
          <!--  servant  -->
          <object identity="RootDir" type="::filesystem::Directory"></object>
          <object identity="iamfile" type="::filesystem::File"></object>
        </replica-group>
        <!--  node 2 icebox -->
        <node name="node1">
          <server-instance template="FileSystemServerIceBoxTemplate" index="11"></server-instance>
          <server-instance template="FileSystemServerIceBoxTemplate" index="12"></server-instance>
        </node>
        <node name="node2">
          <server-instance template="FileSystemServerIceBoxTemplate" index="21"></server-instance>
          <server-instance template="FileSystemServerIceBoxTemplate" index="22"></server-instance>
        </node>
      </application>
    </icegrid>

    4. 시동

  • icegridregistry --Ice.Config=registry.cfg
  • icegridnode --Ice.Config=node1.cfg
  • icegridnode --Ice.Config=node2.cfg
  • icegridadmin --Ice.Config=node1.cfg 로그인 후 application add app.xml

  • 5. 코드


    슬라이스 정의:
    [["java:package:com.asto"]]
    module filesystem{
    	interface Node{
    		string name();
    	};
    	
    	exception GenericError{
    		string reason;
    	};
    	
    	sequence<string> Lines;
    	
    	interface File extends Node{
    		Lines read();
    		void write(Lines text) throws GenericError;
    	};
    	
    	sequence<Node*> NodeSeq;
    	
    	interface Directory extends Node{
    		NodeSeq list();
    	};
    	
    	interface FileSys{
    		Directory* getRoot();
    	};
    	
    };

    eclipse 플러그인이나 명령을 통해 slice2java를 자바 클래스로 변환하기
    Directory 및 File 인터페이스 구현
    package servant;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    import com.asto.filesystem.NodePrx;
    import com.asto.filesystem.NodePrxHelper;
    import com.asto.filesystem._DirectoryDisp;
    
    import Ice.Current;
    
    public class DirectoryI extends _DirectoryDisp {
    
    	public static Ice.ObjectAdapter _adapter;
    	public String _name;
    	public DirectoryI _parent;
    	public List<NodePrx> _content = new ArrayList<NodePrx>();
    
    	public DirectoryI(String _name, DirectoryI _parent) {
    		super();
    		this._name = _name;
    		this._parent = _parent;
    		Ice.Identity theId = Ice.Util.stringToIdentity(_parent == null ? "RootDir" : UUID.randomUUID().toString());
    		_adapter.add(this, theId);
    		//  
    		NodePrx theNode = NodePrxHelper.uncheckedCast(_adapter.createProxy(theId));
    		//  
    		if (_parent != null) {
    			_parent.addChild(theNode);
    		}
    	}
    
    	@Override
    	public NodePrx[] list(Current __current) {
    		System.out.println("[DirectoryI]invoke list @" + Thread.currentThread().getName());
    		NodePrx[] retList = new NodePrx[_content.size()];
    		retList = _content.toArray(retList);
    		return retList;
    	}
    
    	@Override
    	public String name(Current __current) {
    		System.out.println("[DirectoryI]invoke name @"+ Thread.currentThread().getName());
    		return _name;
    	}
    
    	void addChild(NodePrx child) {
    		System.out.println("[DirectoryI]invoke addChild @"+ Thread.currentThread().getName());
    		_content.add(child);
    	}
    
    }
    package servant;
    
    import java.util.UUID;
    
    import com.asto.filesystem.GenericError;
    import com.asto.filesystem.NodePrx;
    import com.asto.filesystem.NodePrxHelper;
    import com.asto.filesystem._FileDisp;
    
    import Ice.Current;
    
    public class FileI extends _FileDisp {
    	public static Ice.ObjectAdapter _adapter;
    	public String _name;
    	public DirectoryI _parent;
    	public String[] _lines;
    
    	public FileI(String _name, DirectoryI _parent) {
    		super();
    		this._name = _name;
    		this._parent = _parent;
    		assert(_parent != null);
    		String identiyName = UUID.randomUUID().toString();
    		if("README".equalsIgnoreCase(_name)){
    			identiyName = "iamfile";
    		}
    		System.out.println("FileI'identiy:"+identiyName);
    		Ice.Identity theId = Ice.Util.stringToIdentity(identiyName);
    		_adapter.add(this, theId);
    		NodePrx theNode = NodePrxHelper.uncheckedCast(_adapter.createProxy(theId));
    		_parent.addChild(theNode);
    	}
    
    	@Override
    	public String[] read(Current __current) {
    		System.out.println("[FileI]invoke read @"+ Thread.currentThread().getName());
    		return _lines;
    	}
    
    	@Override
    	public void write(String[] text, Current __current) throws GenericError {
    		System.out.println("[FileI]invoke write @"+ Thread.currentThread().getName());
    		_lines = text;
    	}
    
    	@Override
    	public String name(Current __current) {
    		System.out.println("[FileI]invoke name @"+ Thread.currentThread().getName());
    		return _name;
    	}
    
    }

    이 두 인터페이스의 실현 클래스에는 Ice가 포함되어 있습니다.ObjectAdapter, servant는 adapter를 통해 대외적으로 서비스를 제공해야 합니다.
    구조 방법에서adapter에 자신의 실례(servant)를 추가합니다.
    Icebox의 서비스 인터페이스를 구현합니다.
    package service;
    
    import com.asto.filesystem.GenericError;
    
    import Ice.Communicator;
    import IceBox.Service;
    import servant.DirectoryI;
    import servant.FileI;
    
    public class FilesystemService implements Service {
    	private Ice.ObjectAdapter _adapter;
    	@Override
    	public void start(String name, Communicator communicator, String[] args) {
    		_adapter = communicator.createObjectAdapter(name);
    		DirectoryI._adapter = _adapter;
    		FileI._adapter = _adapter;
    		DirectoryI root = new DirectoryI("/", null);
    		FileI file = new FileI("README", root);
    		String[] text = new String[] { "This file system contain a collection of poetry." };
    		try {
    			file.write(text);
    		} catch (GenericError e) {
    			System.err.println(e.reason);
    		}
    
    		DirectoryI coleridge = new DirectoryI("Coleridge", root);
    		file = new FileI("Kubla_Khan", coleridge);
    		text = new String[] { "In Xanadu did Kubla Khan", "A stately pleasure-dome decree:", "Where Alph, the sacred river, ran", "Through caverns measureless to man", "Down to a sunless sea." };
    		try {
    			file.write(text);
    		} catch (GenericError e) {
    			System.err.println(e.reason);
    		}
    
    		_adapter.activate();
    		System.out.println("FileSystemServer adapter activate @" + Thread.currentThread().getName());
    	}
    
    	@Override
    	public void stop() {
    		System.out.println(getClass().getName() + " _adapter destroy @" + Thread.currentThread().getName());
    		if(_adapter != null){
    			_adapter.destroy();
    		}
    	}
    
    }

    FileSystemService는 app에 있습니다.xml에서 Icebox로 설정합니다.
    client 호출:
    public static void main(String[] args){
    		Ice.Communicator ic  = null;
    		try{
    			ic = Ice.Util.initialize(args);
    //			Ice.ObjectPrx basePrx = ic.stringToProxy("iamfile");
    //			FilePrx detailPrx = FilePrxHelper.checkedCast(basePrx);
    			Ice.ObjectPrx basePrx = ic.stringToProxy("RootDir");
    			DirectoryPrx detailPrx = DirectoryPrxHelper.checkedCast(basePrx);
    			if(detailPrx == null){
    				System.err.println("filePrx is null");
    				System.exit(1);
    			}
    			String name = detailPrx.name();
    			System.out.println("fileName is :" + name);
    			
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			if(ic != null){
    				ic.shutdown();
    				ic.waitForShutdown();
    				ic.destroy();
    			}
    		}
    		
    		
    	}

    client 실행은registry 주소를 지정하는 설정 파일을 추가해야 합니다
    client.cfg
    Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 192.168.7.7 -p 4061

    client를 실행할 때 설정 파일을 지정합니다
    java com.client.Client --Ice.Config=client.cfg

    인용


    'Zeroc Ice 권위 가이드'와http://blog.csdn.net/lihuayong/article/details/9901417

    좋은 웹페이지 즐겨찾기