第十课:Openfire内部组件和外部组件初步介绍

阅读:3947

1、学习什么是内部组件

2、学习什么是外部组件

2、学习外部组件的应用场景

1、什么是openfire内部组件

Openfire内部组件其实就是openfire的插件,因为它必须和openfire所在的进程一起运行,被openfire动态加载,所以叫做openfire插件,如下图就是openfire的插件:

Openfire的内部组件截获数据包,对数据包进行处理,其实前面我们已经讲过,这里就不详细讲解了。不明白的同学看一下插件相关的文章或者视频。

2、什么是openfire外部组件

Openfire外部组件,就是与openfire所在的进程没有关系,甚至可以不与openfire在同一台机器上运行的组件,一般是一个可运行的jar包,我们叫做外部组件。

Openfire的外部组件使用tcp连接与openfire之间进行通信,有的小白可能为问,为什么使用tcp连接,使用http连接不可以吗?我想说的是,tcp连接是长连接,速度最快。因为外部组件也会处理大量的openfire消息,准备的说是处理一些服务器需要处理的逻辑,所以当然越快越好。

3、配置openfire使其支持外部组件

外部组件既然使用了tcp连接,那么肯定有一个端口号,所以,我们需要在openfire的控制管理台设置“外部组件”,依次点击[服务器]->[服务器设置]->[外部组件],如下图:

我们来逐步分析一下上面的图:

1、外部组件连接openfire需要端口和密码,如下图的设置:

密码一定设置复杂一点,别用test,小蟑螂都可以猜出来这个密码。

2、子域的概念

上图有一个概念叫做子域:

什么叫做子域呢。我们把服务器的域名设置为 myopenfire.com ,那么例如x.myopenfire.com就是子域。我们可以写一个组件X,将JID中域名为x.myopenfire.com的消息,iq、presence都发送到组件X中。

总结一下,外部组件一般是用来处理发送到某个子域的packet包。如果不太明白,没有关系,我们后面会解释。

3、组件防火墙

Openfire也是有情操的,对于内部插件,只要符合openfire的插件编写规范,那么插件想插入openfire,就插入openfire,根本不需要openfire的同意。“妈的,又开始写色情小说”,有同学说。

但是对于外部组件,openfire就不那么大方了,首先必须在正确的端口提供正确的密码,其次openfire可以限定只有哪些子域可以连接openfire,哪些子域不能连接openfire,同时,也可以给不同子域设置不同的密码,如下图,我认为下图,你应该一看就明白了,就不解释了,记住你要读图中的文字:

4、外部组件的应用一

在讲怎么编写外部组件之前,我一定要给您讲清楚外部组件有什么用处,很多使用了openfire几年的架构师,程序员,都很有可能没有使用过外部组件,究其原因,是因为,他们太忙了,根本没有时间停下来,学习一下,外部组件是什么?

大家都知道微信服务号吧,不知道的同学你就out了。假设有10万个人订阅了微信服务号,每当服务号要发送一条消息给所有用户的时候,我们可以通过一个“服务号外部组件”来完成。

我们首先看一下,简单的架构图:

从架构图中可以看到,

1、当用户操作网站后台要群发信息时,首先会发送一条消息给openfire,如图中的连线1。这条message消息类似下面的语句:

<message to="x.myopenfire.com">
	服务号的内容</message>


Openfire收到这条消息,发现了一个二级域名x.myopenfire.com,它会在外部组件中寻找谁会处理这个域名的消息,发现了该外部组件,会将这条消息通过连线2转发给外部组件。

2、外部组件接受到这条消息,会查询数据库,发现有10w人需要转发这条服务号消息,如连线3。

3、然后,“外部组件”会构造一个10万消息体,类似下面的消息:

<message to="userx@myopenfire.com" from="x.myopenfire.com">
	服务号的内容</message>


其中to就是要发送的用户,10万个用户,每个用户的jid都是不一样的。这个过程如上图的连线4。

“外部组件”会间断性的将这10万条消息发送给openfire,由openfire发送到用户那里。注意一般为了性能,“外部组件”需要每发送一些信息,就休息一下,以免对openfire造成太大的性能影响。这就是很多服务号信息会延时一段时间到达所有用户的原因。

Ok,群发消息的问题通过外部组件解决了。其实我们仔细想一想,在外部组件中,找到这个10W个用户,其实是一个比较耗时的操作,由外部组件来解决,其实就减少了openfire的负担,从而让openfire的效率更高效了。

又如,一些敏感词汇的过滤,例如fuck,想要一夜情,请加“1233455”之类的群发消息,也能提前在外部组件中过滤掉。这样也减少了openfire的业务逻辑,所以外部组件对实现即时通讯服务器功能和性能上的扩展是很有帮助的。

5、外部组件应用二

Ok,我们来谈谈第二个功能,就是某个用户怎么向微信公众号发送消息。

假如某个用户要向微信公众号发送消息,那么可以发送如下的消息。

<message from="userx@myopenfire.com" to="x.myopenfire.com">
	能不能不要天天发广告了</message>


注意,这里的to指向的是子域x.myopenfire.com ,这个子域被“微信服务号外部组件”给负责了。Openfire会将发送到x.myopenfire.com的数据给“外部组件”处理,外部组件可以通过消息携带的信息,放入网站的数据库,让管理员可以通过网站来查看到。

6、小结

Ok,你理解什么是外部组件了吗?我想说的是,外部组件的功能肯定可以通过内部组件(即插件)来解决,但是内部插件和openfire成为一体了,把特殊的业务逻辑加入openfire,并不是一件好事,如果更改业务逻辑,就需要更改openfire插件,并重启,也不是一件好事。

同时,复杂的业务逻辑还会增加openfire的负担,所以很多同学写的openfire服务器,并不能支持30w以上的并发用户,也就是这个原因了。

好了,明白了外部组件的强大功能,那么我们需要来写一下外部组件了,因为外部组件的编写比较复杂,文字描述大家不一定会懂,所以,我们录制了《openfire外部组件》的视频,大家有兴趣,有机会可以看一下。

最后,希望我们多年的经验写出的本文(本文免费),能够让大家在攀登openfire的大山时,如履平地。

7、再接再厉

最后感谢大家一路走来,学习了我们的初级课程,学习是一个长期的过程,还不能只仅仅通过初级教程就把即时通讯的原理给搞明白。后面的中级课程,我们将采用视频的方式来讲解,希望大家能够喜欢。为了给大家更好的服务,我们后面的课程将收取一定的费用,详情请看 myopenfire.com/paytip,感谢大家对初级课程的支持,我们中级课程再见。

提问或评论

登陆后才可留言或提问哦:) 登陆 | 注册 登陆后请返回本课提问
用户名
密   码
验证码
付老师疑难问答