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之行算是走了第一步。

相關文章
相關標籤/搜索