Tigase8.0 源代码分析:四、集群配置篇

 Tigase8集群配置是很简单的,本文从实验的角度来了解tigase集群配置及启动。

首先你先能保证在机器上能跑单机版本的代码,如果还没有,先移步看前面的博客吧<IDEA 上 Tigase8.0 源代码编译运行>

1、准备工作:内网中至少两台主机:

我就以我本地实验来做参考:

主机A:[192.168.3.2] 主机名[llooper]

主机B:[192.168.3.5] 主机名[shirley-pc]

2、修改 C:WindowsSystem32driversetchosts 文件,配置名字映射使得A.B主机之间互通

192.168.3.5 Shirley-PC
192.168.3.2 llooper

3、修改Tigase的配置文件

A主机:

'admin = [ 'admin@llooper' ]
'cluster-mode' = true
'cluster-nodes' = [ 'llooper' , 'Shirley-PC' ]
'config-type' = 'default'
'default-virtual-host' = 'llooper'
'debug' = [ 'server', 'cluster','eventbus' ]
'cl-comp' {
    'connect-all' = true
}
dataSource {
  'pool-size' = 1
    default () {
        uri = 'jdbc:mysql://A数据源'
    }
}

B主机:

'admin = [ 'admin@Shirley-PC' ]
'cluster-mode' = true
'cluster-nodes' = [ 'llooper' , 'Shirley-PC' ]
'config-type' = 'default'
'default-virtual-host' = 'Shirley-PC'
'debug' = [ 'server', 'cluster','eventbus' ]
'cl-comp' {
    'connect-all' = true
}
dataSource {
  'pool-size' = 1
    default () {
        uri = 'jdbc:mysql://B数据源'
    }
}

 集群相关的配置也就以下三个属性需要注意下:

'cluster-mode' = true  //开启集群模式
'cluster-nodes' = [ 'llooper' , 'Shirley-PC' ] //集群全部的主机域名
'cl-comp' {
    'connect-all' = true  //动态地将不在集群配置中的节点加入到集群中,默认为false
}

4、注意:目前集群user模块数据库必需使用不同的数据源,如果同用一个数据库,不同域下的注册用户都在同一个user模块表中。通过vhost-manager在users表中,查询出UID,再通过vhosts-lists作为key在tig_pairs表中查询库加载<vhost>,如果都同用一个数据源,那么vhost包含所有域。当eventbus组件发出给另一个域的数据包在MessageRouter中查询vhost发现本地包含该域,所以导致数据包又投回来本机处理,从而出现数据包死循环的问题。

<vhost anon="true" tls-required="false" enabled="true" s2s-secret="15b43189-2b23-46ae-9dc6-ab0acdceafe5" hostname="llooper" max-users="0" register="true" domain-filter="ALL"><comps></comps><other></other></vhost>
<vhost anon="true" tls-required="false" enabled="true" s2s-secret="1434ac98-8ba1-41e2-a57e-6559fb94d921" hostname="shirley-pc" max-users="0" register="true" domain-filter="ALL"><comps></comps><other></other></vhost>

5、分别启动 XMPPServer ,成功运行服务!

6、使用PSI 进行测试:连接不同的域进行注册用户,然后进行互加好友,互发消息:

 

 A域和B域的账号互通消息,证明集群消息能相互转发成功!

7、最后,为了方便用户在调试Tigase代码,附上一件我修改过的配置。配置上,组件的线程数量被我修改为1. 为了串行执行,便于从日志中分析流程。

'admins' = [ 'admin@llooper' ]
'cluster-mode' = true
'cluster-nodes' = [ 'llooper' , 'Shirley-PC' ]
'config-type' = 'default'
'default-virtual-host' = 'llooper'
'debug' = [ 'server', 'cluster','eventbus' ]
'cl-comp' {
    'connect-all' = true
}

logging (class: tigase.conf.LoggingBean) {
    debug = [ 'server', 'cluster', 'eventbus' ]

    rootHandlers = [ 'java.util.logging.ConsoleHandler', 'java.util.logging.FileHandler' ]
    rootLevel = CONFIG
    'shutdown-thread-dump' = true
    handlers {
        'java.util.logging.ConsoleHandler' {
            formatter = 'tigase.util.log.LogFormatter'
             level = ALL
        }
        'java.util.logging.FileHandler' {
            append = true
            count = 1
            formatter = 'tigase.util.log.LogFormatter'
            level = ALL
            limit = 10000000
            pattern = 'logs/tigase.log'
        }
    }
 }

dataSource {
  'pool-size' = 1
    default () {
        uri = 'jdbc:mysql://数据源地址'
    }
}
userRepository {
    default () {}
}
authRepository {
    default () {}
}

'cl-comp' {
    'connect-all' = true
}

amp () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
}
bosh () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
    seeOtherHost {}
}
c2s () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
    seeOtherHost {}
}
http (class: tigase.http.HttpMessageReceiver) {}
'message-router' () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
}
s2s () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
}
'sess-man' () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1

       amp (class: tigase.xmpp.impl.MessageAmp) {
            threadsNo = 1
            message (class: tigase.xmpp.impl.Message) {
                threadsNo = 1
            }
            msgoffline (class: tigase.xmpp.impl.OfflineMessages) {
                threadsNo = 1
            }
        }
      'default-handler' () {
            threadsNo = 1
        }
        disco () {
            threadsNo = 1
        }
        'domain-filter' (class: tigase.xmpp.impl.DomainFilter) {
            threadsNo = 1
        }


        'http://jabber.org/protocol/commands' (class: tigase.xmpp.impl.JabberIqCommand) {
            threadsNo = 1
        }
        'http://jabber.org/protocol/jingle' (class: tigase.xmpp.impl.Jingle,
            active: false) {
            threadsNo = 1
        }
        'http://jabber.org/protocol/offline' (class: tigase.xmpp.impl.FlexibleOfflineMessageRetrieval,
            active: false) {
            threadsNo = 1
        }
        'http://jabber.org/protocol/stats' (class: tigase.xmpp.impl.JabberIqStats) {
            threadsNo = 1
        }
        'invisible-command' (class: tigase.xmpp.impl.InvisibleCommand,
            active: false) {
            threadsNo = 1
        }
        'jabber:iq:auth' (class: tigase.xmpp.impl.JabberIqAuth) {
            threadsNo = 1
        }
        'jabber:iq:iq' (class: tigase.xmpp.impl.JabberIqIq,
            active: false) {
            threadsNo = 1
        }
        'jabber:iq:last-marker' (class: tigase.xmpp.impl.LastActivityMarker,
            active: false) {

            threadsNo = 1
        }
        'jabber:iq:privacy' (class: tigase.xmpp.impl.JabberIqPrivacy) {
            threadsNo = 1
        }
        'jabber:iq:private' (class: tigase.xmpp.impl.JabberIqPrivate) {
            threadsNo = 1
        }
        'jabber:iq:register' (class: tigase.xmpp.impl.JabberIqRegister) {
            threadsNo = 1
        }
        'jabber:iq:roster' (class: tigase.xmpp.impl.JabberIqRoster) {
            threadsNo = 1
        }
        'jabber:iq:version' (class: tigase.xmpp.impl.JabberIqVersion) {
            threadsNo = 1
        }
        message (class: tigase.xmpp.impl.Message,
            active: false) {
            threadsNo = 1
        }
        'message-all' (class: tigase.xmpp.impl.MessageAll,
            active: false) {
            threadsNo = 1
        }
        'message-carbons' (class: tigase.xmpp.impl.MessageCarbons) {
            threadsNo = 1
        }
        'message-vhost-forward' (class: tigase.xmpp.impl.MessageForwarding,
            active: false) {
            threadsNo = 1
        }
        mobile_v1 (class: tigase.xmpp.impl.MobileV1,
            active: false) {
            threadsNo = 1
        }
        mobile_v2 (class: tigase.xmpp.impl.MobileV2,
            active: false) {
            threadsNo = 1
        }
        mobile_v3 (class: tigase.xmpp.impl.MobileV3,
            active: false) {
            threadsNo = 1
        }
        motd (class: tigase.xmpp.impl.MotdProcessor,
            active: false) {
            threadsNo = 1
        }

        msgoffline (class: tigase.xmpp.impl.OfflineMessages,
            active: false) {
            threadsNo = 1
        }
        'pep-simple' (class: tigase.xmpp.impl.PepPlugin,
            active: false) {
            threadsNo = 1
        }
        'presence-offline' (class: tigase.xmpp.impl.PresenceOffline,
            active: false) {
            threadsNo = 1
        }
        'presence-state' (class: tigase.xmpp.impl.PresenceState) {

            threadsNo = 1
        }
        'presence-subscription' (class: tigase.xmpp.impl.PresenceSubscription) {
            threadsNo = 1
        }
        'remote-roster-management' (class: tigase.xmpp.impl.RemoteRosterManagement,
            active: false) {
            threadsNo = 1
        }

        scriptCommandProcessor (class: tigase.component.ComponenScriptCommandProcessor) {}
        'session-close' (class: tigase.server.xmppsession.SessionManager$SessionCloseProc) {
            threadsNo = 1
        }
        'session-open' (class: tigase.server.xmppsession.SessionManager$SessionOpenProc) {
            threadsNo = 1
        }
        starttls (class: tigase.xmpp.impl.StartTLS) {
            threadsNo = 1
        }
        'urn:ietf:params:xml:ns:xmpp-bind' (class: tigase.xmpp.impl.BindResource) {
            threadsNo = 1
        }
        'urn:ietf:params:xml:ns:xmpp-sasl' (class: tigase.xmpp.impl.SaslAuth) {
            threadsNo = 1
        }
        'urn:ietf:params:xml:ns:xmpp-session' (class: tigase.xmpp.impl.SessionBind) {
            threadsNo = 1
        }
        'urn:xmpp:blocking' (class: tigase.xmpp.impl.BlockingCommand) {
            threadsNo = 1
        }
        'urn:xmpp:csi:0' (class: tigase.xmpp.impl.ClientStateIndication) {
            threadsNo = 1
            logic (class: tigase.xmpp.impl.MobileV2) {
                threadsNo = 1
            }
        }
        'urn:xmpp:extdisco:2' (class: tigase.server.extdisco.ExternalServiceDiscoveryProcessor,
            active: false) {
            threadsNo = 1
        }
        'urn:xmpp:ping' (class: tigase.xmpp.impl.UrnXmppPing) {
            threadsNo = 1
        }
        'urn:xmpp:time' (class: tigase.xmpp.impl.EntityTime) {
            queueSize = null
            threadsNo = 1
        }
        'vcard-temp' (class: tigase.xmpp.impl.VCardTemp) {
            threadsNo = 1
        }
        'vcard-xep-0292' (class: tigase.xmpp.impl.VCard4) {
            threadsNo = 1
        }
        writer (class: tigase.server.xmppsession.SessionManager$SMPacketWriter) {}
        zlib (class: tigase.xmpp.impl.StartZLib) {
            threadsNo = 1
        }

}
ws2s () {
    'processing-in-threads' = 1
    'processing-out-threads' = 1
    seeOtherHost {}
}

  

原文地址:https://www.cnblogs.com/eyecool/p/12633939.html