`

JGroups 简介、适用场合、配置、程序例子Demo等完全使用指南

阅读更多
2007-05-08 14:38
目前项目中在克服JGroups初期使用的困难之后,已经使用比较稳定了。感觉比较烦琐和容易出错的还是JGroups配置。感觉中文的资源较少,现将自己总结的经验总结如下
Tim http://hi.baidu.com/jabber/blog/item/7e879852a23efd0f0cf3e3ea.html

JGroups 适合使用场合
服务器集群cluster、多服务器通讯、服务器replication(复制)等,分布式cache缓存

JGroups 简介
JGroups是一个基于Java语言的提供可靠多播(组播)的开发工具包。在IP Multicast基础上提供可靠服务,也可以构建在TCP或者WAN上。主要是由Bela Ban开发,属于JBoss.org,在JBoss的网站也有一些相关文档。目前在 SourceForge上还是比较活跃,经常保持更新。

JGroups 配置

PING: 发现初始成员
MERGE2: 将网络层切分的包重新合并。
FD_SOCK: Failure Dectection 错误检测,基于TCP
FD:Failure Dectection 错误检测,基于心跳
VERIFY_SUSPECT: 检查貌似失败的节点
pbcast.NAKACK: 应答,提供可靠传输
UNICAST: 可靠的UNICAST
pbcast.STABLE: 计算广播信息是否稳定
VIEW_SYNC: 定期广播view(成员名单)
pbcast.GMS: Group membership, 处理joins/leaves/crashes等
FC: 流量控制
FRAG2:Fragmentation layer,分包,将大的数据包分拆成适合网络层传输

以上一些是比较重要的配置,基本上不能少。如果要深入研究可以在 org.jgroups.protocols 里面查看源代码

JGroups使用例子, JGroups demo, Tim的hello world例子
Timreceiver.java
import org.jgroups.tests.perf.Receiver;
import org.jgroups.tests.perf.Transport;
import org.jgroups.util.Util;

public class TimReceiver implements Receiver {
      private Transport transport = null;
      
      public static void main(String[] args) {
            TimReceiver t = new TimReceiver();
            try {
                  int sendMsgCount = 5000;
                  int msgSize = 1000;
                  t.start();

                  t.sendMessages(sendMsgCount, msgSize);
                  System.out.println("########## Begin to recv...");
                  Thread.currentThread().join();
            } catch (Exception e) {
                  e.printStackTrace();
            } finally {
                  if (t != null) {
                        t.stop();
                  }
            }
      }
      
      public void start()
                  throws Exception {
            transport = (Transport) new TimTransport();
            transport.create(null);
            transport.setReceiver(this);
            transport.start();
      }

      public void stop() {
            if (transport != null) {
                  transport.stop();
                  transport.destroy();
            }
      }

      private int count = 0;
      public void receive(Object sender, byte[] data) {
            System.out.print(".");
            if (++count == 5000) {
                  System.out.println("\r\nRECV DONE.");
                  System.exit(0);
            }
            
      }

      private void sendMessages(int count, int msgSize)
                  throws Exception {
            byte[] buf = new byte[msgSize];
            for (int k = 0; k < msgSize; k++)
                  buf[k] = 'T';

            System.out.println("-- sending " + count + " " + Util.printBytes(msgSize) + " messages");

            for (int i = 0; i < count; i++) {
                  transport.send(null, buf);
            }
            
            System.out.println("######### send complete");
      }
}

TimTransport.java

import java.util.Map;
import java.util.Properties;

import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
import org.jgroups.tests.perf.Receiver;
import org.jgroups.tests.perf.Transport;

public class TimTransport extends ReceiverAdapter implements Transport{
      private JChannel channel = null;
      private String groupName = "TimDemo";
      private Receiver receiver = null;
      
      String PROTOCOL_STACK_UDP1 = "UDP(bind_addr=192.168.100.59";  
      String PROTOCOL_STACK_UDP2 = ";mcast_port=8888";
      String PROTOCOL_STACK_UDP3 = ";mcast_addr=225.1.1.1";
      String PROTOCOL_STACK_UDP4 = ";tos=8;loopback=false;max_bundle_size=64000;" +
                  "use_incoming_packet_handler=true;use_outgoing_packet_handler=false;ip_ttl=2;enable_bundling=true):"
           + "PING:MERGE2:FD_SOCK:FD:VERIFY_SUSPECT:"
             +"pbcast.NAKACK(gc_lag=50;max_xmit_size=50000;use_mcast_xmit=false;" +
                         "retransmit_timeout=300,600,1200,2400,4800;discard_delivered_msgs=true):"
             +"UNICAST:pbcast.STABLE:VIEW_SYNC:"
             +"pbcast.GMS(print_local_addr=false;join_timeout=3000;" +
                         "join_retry_timeout=2000;" +
                         "shun=true;view_bundling=true):"
             +"FC(max_credits=2000000;min_threshold=0.10):FRAG2(frag_size=50000)";

            
      public Object getLocalAddress() {
            return channel != null ? channel.getLocalAddress() : null;
      }

      public void start() throws Exception {
            channel.connect(groupName);            
      }

      public void stop() {
            if (channel != null) {
                  channel.shutdown();
            }
      }

      public void destroy() {
            if (channel != null) {
                  channel.close();
                  channel = null;
            }
      }

      public void setReceiver(Receiver r) {
            this.receiver = r;
      }

      public Map dumpStats() {
            return channel != null ? channel.dumpStats() : null;
      }

      public void send(Object destination, byte[] payload) throws Exception {
            byte[] tmp = new byte[payload.length];
            System.arraycopy(payload, 0, tmp, 0, payload.length);
            Message msg = null;
            msg = new Message((Address) destination, null, tmp);
            if (channel != null) {
                  channel.send(msg);
            }
      }

      public void receive(Message msg) {
            Address sender = msg.getSrc();
            byte[] payload = msg.getBuffer();
            if (receiver != null) {
                  try {
                        receiver.receive(sender, payload);
                  } catch (Throwable tt) {
                        tt.printStackTrace();
                  }
            }
      }

      public void create(Properties config) throws Exception {
            String PROTOCOL_STACK = PROTOCOL_STACK_UDP1 + PROTOCOL_STACK_UDP2 + PROTOCOL_STACK_UDP3 + PROTOCOL_STACK_UDP4;
            channel = new JChannel(PROTOCOL_STACK);
            channel.setReceiver(this);            
      }

      public void send(Object destination, byte[] payload, boolean oob) throws Exception {
            send(destination, payload);
      }
}

JGroups 下载 download
http://www.jgroups.org/

 

分享到:
评论

相关推荐

    Jgroups 教程

    - `jgroups-all.jar`:核心JGroups功能库,包括demo和junit应用程序。如果需要更小的JAR包,可以下载源代码并执行“jar”目标,生成大约1MB大小的`jgroups-core.jar`。 - `log4j.jar`(可选):日志库,JGroups也...

    Ehcache通过Jgroups做集群

    Ehcache是一款高效、流行的Java缓存库,它允许应用程序快速访问经常使用的数据,从而提高性能和响应速度。在分布式环境中,为了实现数据共享和高可用性,Ehcache提供了集群功能。而Jgroups则是Java中一个强大的集群...

    jgroups

    ### 关于JGroups 2.5教程:安装与开发简易应用程序 #### 安装与配置JGroups **JGroups**是一款高性能、可扩展且高度可靠的群集通信库,旨在为分布式系统提供消息传递功能。本教程将深入探讨如何安装配置JGroups,...

    jgroups-3.0.2

    JGroups使用灵活的协议栈,这也是JGroups最强大(the most powerful)的功能,它允许开发人员配置协议栈来适用于他们自己的应用需求和网络特征。这样做的好处在于,开发人员只需要关注他们使用到的协议。通过组合和...

    JGroups实现聊天小程序

    总结来说,这个 JGroups 聊天小程序示例展示了如何使用 JGroups 建立分布式通信,包括节点之间的消息传递、视图管理和状态同步。通过这种方式,开发者可以构建出一个健壮的、容错的聊天系统,支持多个节点之间的实时...

    JavaEE源代码 jgroups-2.2.8

    JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 ...

    JGroups_集群.pdf

    JGroups的协议栈可以根据不同的需求进行定制,例如,如果选择使用IP Multicast作为传输协议,可以在协议栈中添加NAKACK协议以防止报文丢失和重复,添加TOTAL协议以保证报文的顺序,添加Group Membership Service ...

    jgroups-2.2.7.jar

    jgroups-2.2.7.jar jgroups-2.2.7.jar

    jgroups.part1

    jgroups.part1

    JGroups-2.6.2.bin.zip

    介绍部分摘自XMPP Jabber即时通讯开发实践 http://hi.baidu.com/jabber/blog/item/7e879852a23efd0f0cf3e3ea.html&lt;br&gt;JGroups 适合使用场合 服务器集群cluster、多服务器通讯、服务器replication(复制)等,...

    jgroups官方帮助文档html格式打包2.X版本

    JGroups提供了丰富的API供开发者使用,如Channel接口用于创建和配置通信通道,View接口表示组成员的视图,Message类用于发送和接收消息。apidoc目录下的文档详细介绍了这些API的使用方法和示例。 七、HTML格式的...

    jgroups源代码

    《深入解析JGroups开源框架:基于belaban-JGroups-19d7183源代码》 JGroups是一个用于构建高可用性集群的Java框架,它提供了可靠的消息传递、组成员管理和故障检测等功能,广泛应用于分布式系统中。本文将基于bela...

    JGroups的Raft实现jgroups-raft.zip

    jgroups-raft 项目是 JGroups 框架对 Raft 的实现。Maven:&lt;groupId&gt;org.jgroups &lt;artifactId&gt;jgroups-raft &lt;version&gt;0.2&lt;/version&gt;Raft 是一个容易理解的共识算法。在容错和性能方面它相当于 Paxos(Google 的一致...

    JGroups-jdk.zip_jgroups

    JGroups是一个用Java编程语言编写的开源库,专注于实现基于IP组播的高效、可配置的组通信协议栈。它为分布式系统提供了一种健壮且灵活的方式来实现节点间的通信,是构建大规模分布式应用的基础组件。在本文中,我们...

    jgroups-3.2

    其是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。其工作模式基于IP多播,但可以在可靠性和群组成员管理上进行扩展。其结构上设计灵活,提供了一种...

    Java多播通讯框架 JGroups

    JGroups完全用Java编写,因此可以无缝集成到任何Java应用中,无论是在企业级应用服务器、分布式数据库还是微服务架构中。 总的来说,JGroups是Java开发人员构建分布式系统时的强大工具,它简化了集群通信的复杂性,...

    Jgroups-all.jar

    JGroup是当前被广泛使用的可靠组间通信的工具之一...但是JGroup在UDP方式的基础上,增加了协议栈的配置,通过配置上层的协议,可以保证消息的重发,大包体的分解(同时保证消息包体顺序),组内机器的状态检测等功能。

    Jgroups中的UNICAST3协议中文翻译

    Jgroups 中的 UNICAST3 协议详解 Jgroups 是一种基于 IP 多播的可靠的组播中间件,UNICAST3 协议是 Jgroups 中的一种单播协议,旨在保持单播和 UNICAST2 的正面特征,而修正负面特征。 UNICAST3 协议的主要特点是...

Global site tag (gtag.js) - Google Analytics