jgroups 초보

9849 단어 jgroups
1. 공식 튜 토리 얼 은 이미 좋 습 니 다. 먼저 읽 어야 합 니 다.
http://www.jgroups.org/ug.html
본문 은 사실 공식 tutorial 의 노트 로 그 중 대부분 문 자 를 옮 겨 실 었 다.http://whitesock.iteye.com/blog/199229
2. 기본 개요
JGroups 에 서 는 JChannel 클래스 가 클 러 스 터 (cluster), 메시지 전송 및 수신 (Message), listeners 등록 등에 사용 되 는 주요 API 를 제공 합 니 다.
Message 는 메시지 헤더 (주소 등 정보 저장) 와 바이트 배열 (전송 하고 자 하 는 데이터 저장) 을 포함 합 니 다.org. jgroups. Address 인터페이스 와 그 실현 클래스 는 주소 정 보 를 봉인 합 니 다. 보통 IP 주소 와 포트 번 호 를 포함 합 니 다.
클 러 스 터 에 연 결 된 모든 인 스 턴 스 (intance) 를 보기 (org. jgroups. View) 라 고 합 니 다.View. getMembers () 를 통 해 모든 실례 의 주 소 를 얻 을 수 있 습 니 다.
인 스 턴 스 는 클 러 스 터 에 연 결 된 후에 만 메 시 지 를 보 내 고 받 을 수 있 습 니 다.
같은 name 으로 JChannel. connect (String name) 방법 을 호출 하 는 모든 인 스 턴 스 가 같은 클 러 스 터 에 연 결 됩 니 다.
인 스 턴 스 가 클 러 스 터 를 떠 나 려 고 할 때 JChannel. disconnect () 방법 을 사용 할 수 있 습 니 다.점유 한 자원 을 방출 하려 면 JChannel. close () 방법 을 사용 할 수 있 습 니 다.JChannel. close () 방법 내부 에서 JChannel. disconnect () 방법 을 호출 합 니 다.
JChannel. setReceiver () 방법 을 호출 하면 메 시 지 를 받 고 View 가 변 경 된 알림 을 받 을 수 있 습 니 다.인 스 턴 스 가 가입 하거나 클 러 스 터 를 떠 날 때마다 view Accepted (View view) 방법 이 호출 됩 니 다.
View. toString () 방법 은 View 의 모든 인 스 턴 스 주소 와 View ID 를 출력 합 니 다.
주의해 야 할 것 은 view Accepted (View view) 방법 이 호출 될 때마다 view 매개 변수 가 다 르 고 View ID 도 증가 합 니 다.
이름 이 없 으 면 이름 은 기계 명 + 난수, 뒤 따 르 기 |, 그리고 늘 어 난 View ID 입 니 다.
View 의 첫 번 째 인 스 턴 스 는 coordinator 라 고 합 니 다.
Receiver 인터페이스의 getState (), setState () 방법 은 인 스 턴 스 간 전달 상태 에 사 용 됩 니 다.
새로운 인 스 턴 스 는 setState () 방법 을 통 해 상 태 를 얻 을 수 있 으 며, 이 상 태 는 클 러 스 터 의 다른 인 스 턴 스 의 getState () 를 호출 하여 얻 을 수 있 습 니 다.
3. Chat 예
3.1 실현 기능
텍스트 만 지원 하 는 채 팅 프로그램 을 쓰 겠 습 니 다.우 리 는 다음 과 같은 기능 을 실현 해 야 한다.
  • 모든 Simple Chat 인 스 턴 스 는 서로 찾 아 하나의 클 러 스 터 를 구성 할 수 있 습 니 다.
  • 센터 의 Chat Server 를 만 들 필요 가 없습니다. 그러면 약간의 고장 이 없 을 것 입 니 다.
  • 채 팅 메 시 지 는 클 러 스 터 의 모든 인 스 턴 스 로 전 송 됩 니 다.
  • 인 스 턴 스 가 가입 하거나 종료 (또는 붕괴) 할 때 다른 인 스 턴 스 는 모두 통 지 를 받 을 것 입 니 다.
  • 우 리 는 단체 내의 채 팅 기록 state 를 유지 합 니 다.새로 가입 한 인 스 턴 스 는 채 팅 기록 을 조회 할 수 있 습 니 다.

  • 3.2 코드
    코드 는 바로 공식 적 인 예 입 니 다. 저 는 상세 한 주석 을 넣 었 습 니 다.
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.util.LinkedList;
    import java.util.List;
    
    import org.jgroups.JChannel;
    import org.jgroups.Message;
    import org.jgroups.ReceiverAdapter;
    import org.jgroups.View;
    import org.jgroups.util.Util;
    
    public class SimpleChat extends ReceiverAdapter {
    	JChannel channel;
    	String user_name = "ABC";
    	private List<String> state = new LinkedList<String>();
    
    	private void start() throws Exception {
    		channel = new JChannel(); //      udp.xml
    		channel.setReceiver(this); //  Receiver        View     
    		channel.connect("ChatCluster"); //     
    		
    		//      ,    getState()        
    		//getState()             ,   null       (coordinator)
    		//             ,    10 。      ,State     ,    。    0       
    		channel.getState(null, 10000);
    		eventLoop();
    		channel.close();
    	}
    
    	private void eventLoop() {
    		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    		while (true) {
    			try {
    				System.out.print("> ");
    				System.out.flush();
    				String line = in.readLine().toLowerCase();
    				if (line.startsWith("quit") || line.startsWith("exit")) {
    					break;
    				}
    				line = "[" + user_name + "] " + line;
    
    				//Message                 ,   null               
    				//          , null  ,       
    				//     line      byte[]    ,           java      
    				Message msg = new Message(null, null, line);
    				channel.send(msg); //      
    
    			} catch (Exception e) {
    			}
    		}
    	}
    	
    	@Override
    	//             (   )   ,viewAccepted      
    	public void viewAccepted(View new_view) {
    	     System.out.println("** view: " + new_view); 
    	}
    
    	@Override
    	//    ,byte[]       Message  ,    Message.getBuffer  byte[]        。
    	public void receive(Message msg) {
    		String line = msg.getSrc() + ": " + msg.getObject();
    	    System.out.println(line);
    	    //       
    	    synchronized (state) {
    	    	state.add(line);
    	    }
    	}
    	
    	@Override
    	public void getState(OutputStream output) throws Exception {
    		// JChannel.getState()    ,             getState             state
    		//Util.objectToStream   state    output     
    	    synchronized (state) {
    	        Util.objectToStream(state, new DataOutputStream(output)); 
    	    }
    	}
    	
    	@Override
    	public void setState(InputStream input) throws Exception {
    		//        state    ,         setState        
    		List<String> list = (List<String>) Util.objectFromStream(new DataInputStream(input));
    		synchronized (state) {
    			state.clear();
    			state.addAll(list);
    		}
    
    		System.out.println(list.size() + " messages in chat history):");
    		for (String str : list) {
    			System.out.println(str);
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
    		new SimpleChat().start();
    	}
    
    }
    

    3.3 기능 테스트
    1. 이 코드 를 세 번 실행 하고 세 개의 인 스 턴 스 를 열 었 습 니 다. 콘 솔 을 관찰 하면 하나의 인 스 턴 스 가 클 러 스 터 에 가입 할 때마다 다른 클 라 이언 트 가 알림 을 받 을 수 있 습 니 다 (view Accepted 호출).
    2. 어느 클 라 이언 트 가 메 시 지 를 보 내 든 다른 클 라 이언 트 는 이 메 시 지 를 받 을 수 있 습 니 다.
    3. 그 중의 한 클 라 이언 트 가 exit 를 입력 하면 다른 클 라 이언 트 는 모두 통 지 를 받 을 수 있 습 니 다.
    4. 충돌 을 모 의 하면 클 라 이언 트 프로 세 스 를 죽 일 수 있 고 다른 클 라 이언 트 가 알림 을 받 을 수 있 습 니 다.
    5. 새로 가입 한 클 라 이언 트 는 채 팅 기록 을 볼 수 있 습 니 다.
    3.4 모니터링 테스트
    jgroups 의 내 적 메커니즘 을 탐색 하기 위해 서 우 리 는 Process Explorer 로 다른 테스트 를 한다.
    첫 번 째 SimpleChat 먼저 시작
    첫 번 째 기 계 를 본 53242 부터 감청 을 시작 합 니 다.
    jgroups初步_第1张图片
    두 번 째 SimpleChat 오픈
    첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
    두 번 째 기계 의 53245 와 첫 번 째 기계 의 53242 연결
    jgroups初步_第2张图片
    세 번 째 Simple Chat 오픈
    첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
    두 번 째 기계 의
    53247 과 세 번 째 기계 의 53246 연결
    세 번 째 기계 의 53248 과 첫 번 째 기계 의 53242 가 연결 되 어 있다.
    jgroups初步_第3张图片
    네 번 째 Simple Chat 오픈
    첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
    두 번 째 기계 의 53247 과 세 번 째 기계 의 53246 연결
    세 번 째 기계 의
    53250 과 네 번 째 기계 의 53249 연결
    네 번 째 기계 의 53251 과 첫 번 째 기계 의 53242 연결
    jgroups初步_第4张图片
    세 번 째 Simple Chat 죽 이기
    첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
    두 번 째 기계 의
    53252 와 네 번 째 기계 의 53249 연결
    네 번 째 기계 의 53251 과 첫 번 째 기계 의 53242 연결
    jgroups初步_第5张图片
    우 리 는 jgroups 가 어떻게 신뢰성 있 는 다 중 방송 을 실현 하 는 지 약간 냄새 를 맡 았 다. 바로 하나의 링 으로 각 노드 를 연결 하 는 것 이다 (TCP 연결).
    jgroups初步_第6张图片
    노드 가 무 너 지면 (Client 3) 이 고 리 는 다시 새로운 고리 로 연 결 됩 니 다.그림 속 의 파란색 선 은 바로 이 고리 가 만 든 새로운 연결 을 고치 기 위해 서 이다.
    jgroups初步_第7张图片
    그림 에서 빨간색 포트 는 UDP 라 는 뜻 입 니 다. 이 포트 는 멀티캐스트 통신 을 담당 합 니 다. 그림 에서 45588 포트 를 볼 수 있 습 니 다. jgroups. jar 패키지 의 기본 udp. xml 은 이 점 을 증명 합 니 다.
    
        <UDP
             mcast_port="${jgroups.udp.mcast_port:45588}" />
    

    4. jgroups 의 응용
    위의 예 프로그램 을 볼 수 있 습 니 다. jgroups 는 state replication 을 할 수 있 습 니 다.
    아래 항목 장면 은 모두 jgroups 를 사용 하 였 습 니 다.
    JBoss Application Server Clustering
    OSCache Clustering
    Jetty HTTP session replication
    Tomcat HTTP session replication
    5. 참고 자료
    공식 문서 부분 중국어 번역
    https://community.jboss.org/wiki/BelaBansJGroupsManualTranslationSerialI-  총 4 편

    좋은 웹페이지 즐겨찾기