本发明涉及通信技术领域,更具体地说,涉及到一种分布式实时消息推送方法。
背景技术:
随着业务量的增长,现阶段单台服务器无法满足高并发的场景,我们需要多台机器提供消息推送服务,同时主要考虑到扩展的伸缩性,即加即用,支持无限扩展。
本
技术实现要素:
为了克服现有技术的不足,本发明提供一种分布式实时消息推送方法用来解决不支持无限水平扩展服务器,负载不均衡的技术问题。
本发明解决其技术问题所采用的技术方案是:提供一种分布式实时消息推送方法,包括以下步骤:
s1:客户端通过netty的nio方式连接服务器;
s2:alloc服务器查询服务器连接数最少的服务器地址和端口信息;
s3:客户端通过ip地址和端口与若干服务器建立长连接;
s4:alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端。
优选地,在客户端通过netty的nio方式连接服务器之前,所述步骤还包括:
生成客户端和服务器密钥对、证书仓库以及自签名证书;
服务器的自签名证书导入至客户端证书库中;
客户端的自签名证书导入至服务器证书库中。
优选地,在客户端的自签名证书导入至服务器证书库中之后,所述步骤还包括:
对客户端以及服务器的自签名证书进行加载和校验。
具体地,alloc服务器查询服务器连接数最少的服务器地址和端口信息,所述步骤包括:
客户端基于nginx通过负载均衡访问alloc服务器;
alloc服务器获取负载最少的服务器地址和端口信息。
优选地,客户端通过ip地址和端口与若干服务器建立长连接之后,alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端之前,所述步骤还包括:
alloc服务器监听zookeeper的临时目录;
alloc服务器获取长连接服务器的状态与连接数量。
优选地,alloc服务器获取长连接服务器的状态与连接数量之后,所述步骤还包括:
当提供长连接业务的服务器出现宕机或者其他问题时,alloc服务器通过zkclient监听到服务器对应节点的删除事件;
alloc服务器将对应的节点信息从payload服务器列表中删除;
当节点信息从payload服务器列表中删除时,客户端重新连接离线的服务器。
优选地,当节点信息从payload服务器列表中删除时,客户端重新连接离线的服务器之后,所述步骤还包括:
长连接业务的服务器启动之后,在zookeeper对应的根节点下生成服务器对应的节点以及更新节点连接数;
当服务器对应的节点数扩展时,alloc服务器自动发现新增的服务器。
优选地,当服务器对应的节点数扩展时,alloc服务器自动发现新增的服务器之后,所述步骤还包括:
alloc服务器监听zkclient的节点增加事件,重新刷新提供服务的机器信息;
将刷新之后提供服务的机器信息存入至redis。
优选地,将刷新之后提供服务的机器信息存入至redis之后,所述步骤好包括:
alloc服务器与各个长连接业务服务器之间建立心跳;
优选地,alloc服务器与各个长连接业务服务器之间建立心跳之后,所述步骤还包括:
alloc服务器定期向定期各个长连接业务服务器发送报文,当连续三次没有回应,则将没有回应的服务器从服务器列表中删除。
本发明的有益效果是:s1:客户端通过netty的nio方式连接服务器;s2:alloc服务器查询服务器连接数最少的服务器地址和端口信息;s3:客户端通过ip地址和端口与若干服务器建立长连接;s4:alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端;从而支持无限水平扩展服务器,进而促使客户端连接的服务器均衡。
附图说明
图1是一种分布式实时消息推送方法的流程示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
以下结合具体实施例对本发明的具体实现进行详细描述:
实施例一:
图1示出了本发明实施例一提供的一种分布式实时消息推送方法的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤s101中,客户端通过netty的nio方式连接服务器;
在本申请实施例中,客户端通过netty的nio方式连接服务器,该nio方式只需要单线程就可以处理高并发连接,外部请求进来之后,当有消息需要推送,selector找到对应标识进行通知,提高了消息推送的效率。
优选地,在客户端通过netty的nio方式连接服务器之前,所述步骤还包括:
生成客户端和服务器密钥对、证书仓库以及自签名证书;
服务器的自签名证书导入至客户端证书库中;
客户端的自签名证书导入至服务器证书库中。
优选地,在客户端的自签名证书导入至服务器证书库中之后,所述步骤还包括:
对客户端以及服务器的自签名证书进行加载和校验。
在步骤s102中,alloc服务器查询服务器连接数最少的服务器地址和端口信息;
在本申请实施例中,alloc服务器查询服务器连接数最少的服务器地址和端口信息,以便支持无限水平扩展服务器,进而促使客户端连接的服务器均衡。
具体地,alloc服务器查询服务器连接数最少的服务器地址和端口信息,所述步骤包括:
客户端基于nginx通过负载均衡访问alloc服务器;
alloc服务器获取负载最少的服务器地址和端口信息。
在步骤s103中,客户端通过ip地址和端口与若干服务器建立长连接;
在本申请实施例中,为了将消息实时地推送至客户端,客户端通过ip地址和端口与若干服务器建立长连接。
优选地,客户端通过ip地址和端口与若干服务器建立长连接之后,alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端之前,所述步骤还包括:
alloc服务器监听zookeeper的临时目录;
alloc服务器获取长连接服务器的状态与连接数量。
优选地,alloc服务器获取长连接服务器的状态与连接数量之后,所述步骤还包括:
当提供长连接业务的服务器出现宕机或者其他问题时,alloc服务器通过zkclient监听到服务器对应节点的删除事件;
alloc服务器将对应的节点信息从payload服务器列表中删除;
当节点信息从payload服务器列表中删除时,客户端重新连接离线的服务器。
优选地,当节点信息从payload服务器列表中删除时,客户端重新连接离线的服务器之后,所述步骤还包括:
长连接业务的服务器启动之后,在zookeeper对应的根节点下生成服务器对应的节点以及更新节点连接数;
当服务器对应的节点数扩展时,alloc服务器自动发现新增的服务器。
优选地,当服务器对应的节点数扩展时,alloc服务器自动发现新增的服务器之后,所述步骤还包括:
alloc服务器监听zkclient的节点增加事件,重新刷新提供服务的机器信息;
将刷新之后提供服务的机器信息存入至redis。
优选地,将刷新之后提供服务的机器信息存入至redis之后,所述步骤好包括:
alloc服务器与各个长连接业务服务器之间建立心跳;
优选地,alloc服务器与各个长连接业务服务器之间建立心跳之后,所述步骤还包括:
alloc服务器定期向定期各个长连接业务服务器发送报文,当连续三次没有回应,则将没有回应的服务器从服务器列表中删除。
在步骤s104中,alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端。
在本申请实施例中,客户端首先访问alloc服务器,alloc服务器根据查询缓存,获取目前连接数最少的业务服务器,然后再将连接数最少的业务服务器的ip地址返回给客户端,客户端再和该业务服务器建立起长连接。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如rom/ram、磁盘、光盘等。
实施例二:
s201:生成客户端和服务器密钥对与证书仓库以及自签名证书;
s202:服务器的自签名证书导入至客户端证书库中;
s203:客户端的自签名证书导入至服务器证书库中;
s204:对客户端以及服务器的自签名证书进行加载和校验;
s204:客户端通过netty的nio方式连接服务器;
s205:alloc服务器查询服务器连接数最少的服务器地址和端口信息;
具体地,客户端基于nginx通过负载均衡访问alloc服务器;
alloc服务器获取负载最少的服务器地址和端口信息;
s206:客户端通过ip地址和端口与对应的服务器建立长连接;
当客户端通过ip地址和端口与对应的服务器建立的长连接关闭时,则重新进行长连接;
s207:alloc服务器监听zookeeper的临时目录;
s208:alloc服务器获取长连接服务器的状态与连接数量;
s209:当提供长连接业务的服务器出现宕机或者其他问题时,alloc服务器通过zkclient监听到服务器对应节点的删除事件;
s210:alloc服务器将对应的节点信息从payload服务器列表中删除;
s211:当节点信息从payload服务器列表中删除时,客户端重新连接离线的服务器;
s212:长连接业务的服务器启动之后,在zookeeper对应的根节点下生成服务器对应的节点以及更新节点连接数;
s213:当服务器对应的节点数扩展时,alloc服务器自动发现新增的服务器;
s214:alloc服务器监听zkclient的节点增加事件,重新刷新提供服务的机器信息;
s215:将刷新之后提供服务的机器信息存入至redis;
s216:alloc服务器与各个长连接业务服务器之间建立心跳;
s217:alloc服务器定期向定期各个长连接业务服务器发送报文,当连续三次没有回应,则将没有回应的服务器从服务器列表中删除;
s218:当客户端查询长连接业务服务器信息时,不返回宕机的服务器的地址与端口信息。
s219:alloc服务器根据redis中客户端与服务器连接关系表,自动将服务器的消息推送至对应的客户端。
具体实现方法
1、生成证书库和导入自签名证书:
通过java的keytool工具生成服务器端的密钥对和证书仓库;例如:可以通过如下命令keytool-genkey-aliassecurespush-keysize2048-validity365-keyalgrsa-dname"cn=www.xxxx.com"-keypasssnetty-storepasssnetty-keystorespush.jks
生成服务器端证书的签名:
keytool-export-aliassecurespush-keystorespush.jks-storepasssnetty-filespush.cer
生成客户端秘钥对和证书仓库:
keytool-genkey-aliassecurecpush-keysize2048-validity365-keyalgrsa-dname"cn=www.xxxx.com"-keypasssnetty-storepasssnetty-keystorecpush.jks生成客户端证书的签名
keytool-export-aliassecurecpush-keystorecpush.jks-storepasssnetty-filecpush.cer
将服务器签名导入到客户端证书库:
keytool-import-trustcacerts-aliassecurespush-filespush.cer-storepasssnetty-keystorecpush.jks
将客户端签名导入到服务器证书库:
keytool-import-trustcacerts-aliassecurecpush-filecpush.cer-storepasssnetty-keystorespush.jks
证书的加载和校验;主要通过java.security.keystore的load方法将秘钥和服务端信任的证书加载到证书库中,然后通过javax.net.ssl.sslcontext的init方法初始化刚才的秘钥和信任证书加载到ssl上下文中,然后创建一个sslengin,传入io.netty.handler.ssl.sslhandler构造函数中,最后传到io.netty.channel.channelpipeline中处理输入发送报文。
客户端基于nginx通过负载均衡访问alloc服务器获取负载最少的长连接业务服务器的ip和端口信息,然后客户端连接到对应的长连接服务器建立起长连接。当建立起连接长连接后出现连接关闭,则重新重复上面的步骤获取长连接。
alloc服务器通过监听zookeeper的临时目录获取长连接服务器的状态和连接数量。
当提供长连接业务服务的服务器出现宕机或者其他问题而无法提供长连接服务的时候,alloc可以通过zkclient监听到对应的服务器节点的删除事件,然后alloc服务器会把对应的节点服务器信息从payload服务器列表中删除。客户端重连的时候,再经过步骤2就不再把离线的服务器信息分配给新的请求的连接。
提供长连接的业务服务器启动后,在zookeeper对应的根节点下生成自己的服务器对应的节点和更新连接数,然后alloc服务器通过监听到zkclient的节点增加事件,重新刷新提供服务的机器信息,存入redis。
节点数的扩展,服务器端只需要增加新的服务器,alloc模块自动发现新增的服务器,从而新的连接会自动落在新增服务器上面。
alloc服务器与各个长连接业务服务器之间建立心跳,每隔1秒钟发送一个报文,如果连续3次没有回应,则将该服务器从服务器列表删除;当外部客户端查询长连接业务服务器信息的时候,不会给外部客户端返回宕机的服务器地址和端口信息。
由于每一个客户端和长连接业务服务器已经建立起连接,alloc服务器在redis里面维护一套对应关系表,如果内部服务器需要给客户端推送消息,则通过客户端唯一标识,从该关系表里面查询到对应的服务器,alloc服务器自动连接该服务器,向该客户端发送消息,客户端接收到消息后,根据消息类型,做对应的业务操作。
当客户端发送到服务器的报文,转发模块会根据消息的类型,调用对应的方法完成业务操作,并给客户端返回处理结果。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的单元及算法步骤,能够以电子硬件或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。
专业技术人员可以对每个特定的应用来使用不同的方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉技术领域的人员在本发明揭露的技术范围内,可轻易想到变化或者替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。