jgroups 초보
9849 단어 jgroups
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 실현 기능
텍스트 만 지원 하 는 채 팅 프로그램 을 쓰 겠 습 니 다.우 리 는 다음 과 같은 기능 을 실현 해 야 한다.
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 부터 감청 을 시작 합 니 다.
두 번 째 SimpleChat 오픈
첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
두 번 째 기계 의 53245 와 첫 번 째 기계 의 53242 연결
세 번 째 Simple Chat 오픈
첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
두 번 째 기계 의
53247 과 세 번 째 기계 의 53246 연결
세 번 째 기계 의 53248 과 첫 번 째 기계 의 53242 가 연결 되 어 있다.
네 번 째 Simple Chat 오픈
첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
두 번 째 기계 의 53247 과 세 번 째 기계 의 53246 연결
세 번 째 기계 의
53250 과 네 번 째 기계 의 53249 연결
네 번 째 기계 의 53251 과 첫 번 째 기계 의 53242 연결
세 번 째 Simple Chat 죽 이기
첫 번 째 기계 의 53244 와 두 번 째 기계 의 53243 연결
두 번 째 기계 의
53252 와 네 번 째 기계 의 53249 연결
네 번 째 기계 의 53251 과 첫 번 째 기계 의 53242 연결
우 리 는 jgroups 가 어떻게 신뢰성 있 는 다 중 방송 을 실현 하 는 지 약간 냄새 를 맡 았 다. 바로 하나의 링 으로 각 노드 를 연결 하 는 것 이다 (TCP 연결).
노드 가 무 너 지면 (Client 3) 이 고 리 는 다시 새로운 고리 로 연 결 됩 니 다.그림 속 의 파란색 선 은 바로 이 고리 가 만 든 새로운 연결 을 고치 기 위해 서 이다.
그림 에서 빨간색 포트 는 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 편