JGroups系列之介绍和体会

     JGroups系列之介绍和体会 java

         很早就想作这个JGroups系列,由于在分布式的系统中,各个部分常常须要相互通讯。这些通讯包括:信息须要同时发给集群中的某些或所有的worker;或者一个worker启动、中止须要通知其余的worker;等等。 web

         对于这些问题的解决,咱们一般有各类各样的方法。好比,信息须要同时发给集群中的某些或所有的worker,这个问题,咱们可能会采用MQ来解决;而对于后者,咱们可能会经过维护心跳的方式来解决。 服务器

         可能咱们本身也知道,上述的方法要么过重,如MQ,咱们须要维护一个MQ服务器;要么解决起来比较麻烦,如心跳方式。 session

         曾经有一段时间,我在为上面的问题烦心,一直想寻找一个好的解决方案。 分布式

         直到我发现了JGroups,才发现JGroups已经为咱们提供了很好的解决方法。 ide

         下面进入JGroups的简要介绍阶段。 工具

         JGroups是一个可靠的组播通讯工具。 网站

所谓可靠,指的是,你不用为你发出去的消息是否会丢掉而担忧,工具为你解决了这个问题。 编码

         所谓“组播”,其实JGroups实现了“单播(对点)”、“组播(对组)”和“广播(对全部)”的三种通讯方式。 spa

         经过上面的介绍,咱们就能够知道,JGroups能够帮咱们解决“信息须要同时发给集群中的某些或所有的worker”的问题。

         同时,当一个JGroups客户端链接到群里,或者跟群断开,群里全部的客户端都会获得通知。这也就解决了第二个问题。

         固然,做为组播工具,JGroups的功能远远比我介绍的要强大得多。

         这个系列将要介绍的主要包括如下的三个方面的应用:

1、组播功能

这是咱们使用JGroups的最基本功能。前面咱们说过,MQ也能实现这个功能。但MQ的问题是过重,咱们须要维护一个MQ服务器,而MQ更为强大的功能,咱们在这里又用不到。

JGroups就为咱们提供了一个更好的解决方案,不那么重,咱们不须要维护额外的服务器;消息也是可靠的、不会丢失(比咱们本身写一个UDPTCP容易得多)。

 

2、发现功能

做为一个集群,咱们常常须要知道集群里各个worker的运行,即某个worker是否在运行。

JGroups为咱们提供了这样一个通知或发现的功能,咱们能够很轻松的知道集群里的某个worker是否在运行。

这比心跳程序要简单得多。

 

3、状态传递

状态传递也是集群中常常要用到的。举个例来讲,一个web服务器集群系统,session是须要传递的。即,当一个web服务器宕掉之后,它上面的session须要转移到别的web服务器上去,以便别的web服务器可以继续给拥有该session的用户提供服务。

JGroups拥有状态传递的功能,这是分布式系统至关有用的一个功能。

 

 

除此以外,还会有一些在JGroups工做过程当中遇到的问题给出,在你们遇到这类问题时,能够知道如何解决。

上面说了那么多,咱们仍是来看看如何从一个简单的例子入门吧。

JGroups的编码很简单,咱们只须要编写一个发送端和一个接收端便可,发送端用来发送消息,接收端用来接收消息。

下面是发送端的示例代码:

 

public class Client {

   private static JChannel channel = null;

   //不论是发送端,仍是接收端,都是从JChannel开始的。

   public static void start()

   {

      String groupName = "pushserver2";

      //群组名,一个JGroups群的惟一标示符。

      try {

        if(channel == null)

        {

           //建立一个通道

           channel = new JChannel();

        }

        //加入一个群

        channel.connect(groupName);

       

      } catch (Exception e) {

        close();

        channel = null;

      }

       

   }

  

   //发送方法

   public static void send(byte[] message)

   {

      if(channel == null) start();

     

      System.out.println("addr:"+channel.getAddressAsString());

     

      Message msg=new Message(null, channel.getAddress(), message);

//第一个参数是接收方的地址,若是是null的话,表示是广//播,即群里全部接收方都会收到消息。

//第二个参数是发送方地址。

//这个类之后还会详细说到。

      try {

        channel.send(msg);

       

        logger.debug("the notify server has already send themessage to the Transfer service.\nthe message is "+message);

      } catch (Exception e) {

        logger.error("send message: "+message+"failed!", e);

      }

   }

  

   public static void close()

   {

      if(channel != null)

      {

        channel.close();

      }

   }

  

   public static void main(String[] args) {

     

      String str = "Hello,JGroups!";

     

      Client2.send(str.getBytes());

     

   }

}

 

 

 

如下是接收方代码:

 

public class Receiver extendsReceiverAdapter{

        

         privatestatic JChannel channel = null;

        

         publicstatic void start()

         {

        

                   StringgroupName = "pushserver2";

                  

                   try{

                            if(channel== null)

                            {

                                     //建立一个通道

                                     channel= new JChannel();

                                    

                            }

                           

                            ReceiverAdapterreceiver = new Receiver();

                            //建立一个接收器

                            channel.setReceiver(receiver);

                            //加入一个群

                            channel.connect(groupName);

                           

                   }catch (Exception e) {

                            channel= null;

                   }

       

         }

        

         @Override

          public void receive(Message msg)

          {

                  

                   byte[]mgs = msg.getBuffer();

                  

 

                   System.out.println(".......................................");

                   System.out.println("transmitserver received size: "+mgs.length);

                   System.out.println(newString(mgs));

                   System.out.println(".......................................");

                  

          }

        

         publicstatic void main(String[] args) {

                  

                   start();

                  

                  

         }

 

}

 

要编译上面的代码,咱们须要JGroupsjar包,能够到下面的网站下载:

http://sourceforge.net/projects/javagroups/files/

而后把代码所须要的类引入进来,能够编译了。

同时,咱们也鼓励你们访问JGroups官网:

http://www.jgroups.org/

在上面,咱们能够查看详细的文档,也能够查看源码。

 

下面,咱们来看看上述代码的运行结果。

对于上述代码,咱们先运行接收方代码,再运行发送方代码。

在发送方,咱们获得以下的输出:

addr:WIN-HR4AJRNL7RQ-36341

 

在接收方,咱们获得了以下的输出:

.......................................

transmit server received size: 14

Hello,JGroups!

.......................................

 

能够看到,JGroups的代码实现的确很简单。

有了这个简单的例子,咱们的JGroups之行算是走了第一步。

相关文章
相关标签/搜索