背景
有一个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)事件。
不足之处,欢迎指正。