redis 作为负载均衡、服务注册和发现方案(替代zookeeper、Eureka)

背景

有一个netty-chat服务,所有终端连接到一个服务上,随着用户量的提升,对服务端的压力是非常巨大的。所以就有多个netty-chat服务,但是需要终端需要连接哪一个,以及其中一个netty-chat服务挂掉,其他服务需要知道怎么办?动态知道netty-chat服务上线和下线,我首先想到了zookeeper,但是为了开发和维护方便,就舍弃了。只用到了redis。

负载均衡

终端要登陆到netty-chat服务,首先要请求服务网关,由服务网关(实现负载均衡)返回给终端具体哪一个netty-chat的ip、port。
连接成功后,netty-chat服务可把连接到本服务的终端数量写入到redis。这样方便网关服务实现负载均衡。

服务注册和发现

netty-chat-server1服务启动后,向redis中定时(比如3s)写入key,设定好过期时间。比如 5s过期。(定时写入的时间一定大于过期时间),若该服务一直正常运行,则该key永不消失。若该服务器突然停电,则5s到期后需要通知到监控服务。这就需要redis的另一个特性“键空间通知和事件通知”。
可参考我一篇文章:
redis监听key值设置(set)事件、过期(expired)事件(notify-keyspace-events K$x)

String key = "netty-chat-server-0001";
String startDateTime = String.valueOf(System.currentTimeMillis());
jedis.set(key, startDateTime);
jedis.expire(key, 5);
        
threadPool.scheduleAtFixedRate(()->{
    jedis.expire(key, 5);
}, 3, 3, TimeUnit.SECONDS);//3s后执行,每3s执行一次

若服务崩溃,key自动过期消失,redis服务主动通知到监控服务。监控服务就会知道哪个服务挂掉。服务启动时,监控也会实时知道服务启动。需要设置key值(set)事件、过期(expired)事件。

不足之处,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容