久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案

瀏覽:18日期:2023-03-27 17:15:12
一、背景

單機(jī)節(jié)點(diǎn)下,WebSocket連接成功后,可以直接發(fā)送消息。而多節(jié)點(diǎn)下,連接時(shí)通過nginx會(huì)代理到不同節(jié)點(diǎn)。

假設(shè)一開始用戶連接了node1的socket服務(wù)。觸發(fā)消息發(fā)送的條件的時(shí)候也通過nginx進(jìn)行代理,假如代理轉(zhuǎn)到了node2節(jié)點(diǎn)上,那么node2節(jié)點(diǎn)的socket服務(wù)就發(fā)送不了消息,因?yàn)橐婚_始用戶注冊(cè)的是node1節(jié)點(diǎn)。這就導(dǎo)致了消息發(fā)送失敗。

springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案

為了解決這一方案,消息發(fā)送時(shí),就需要一個(gè)中間件來記錄,這樣,三個(gè)節(jié)點(diǎn)都可以獲取消息,然后在根據(jù)條件進(jìn)行消息推送。

二、解決方案(springboot 基于 Redis發(fā)布訂閱)

1、依賴

<!-- redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- websocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>

2、創(chuàng)建業(yè)務(wù)處理類 Demo.class,該類可以實(shí)現(xiàn)MessageListener接口后重寫onMessage方法,也可以不實(shí)現(xiàn),自己寫方法。

import com.alibaba.fastjson.JSON;import com.dy.service.impl.OrdersServiceImpl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;import org.springframework.stereotype.Component; import java.util.HashMap; /** * @program: * @description: redis消息訂閱-業(yè)務(wù)處理 * @author: zhang yi * @create: 2021-01-25 16:46 */@Componentpublic class Demo implements MessageListener { Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void onMessage(Message message, byte[] pattern) { logger.info('消息訂閱成功---------'); logger.info('內(nèi)容:'+message.getBody()); logger.info('交換機(jī):'+message.getChannel()); }}

3、創(chuàng)建PubSubConfig配置類

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.listener.PatternTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; /** * @program: * @description: redis發(fā)布訂閱配置 * @author: zhang yi * @create: 2021-01-25 16:49 */@Configuration@EnableCachingpublic class PubSubConfig { Logger logger = LoggerFactory.getLogger(this.getClass()); //如果是多個(gè)交換機(jī),則參數(shù)為(RedisConnectionFactory connectionFactory, // MessageListenerAdapter listenerAdapter, // MessageListenerAdapter listenerAdapter2) @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); // 可以添加多個(gè) messageListener,配置不同的交換機(jī) container.addMessageListener(listenerAdapter, new PatternTopic('channel:demo')); //container.addMessageListener(listenerAdapter2, new PatternTopic('channel:demo2')); return container; } /** * 消息監(jiān)聽器適配器,綁定消息處理器,利用反射技術(shù)調(diào)用消息處理器的業(yè)務(wù)方法 * @param demo 第一步的業(yè)務(wù)處理類 * @return */ @Bean MessageListenerAdapter listenerAdapter(Demo demo) { logger.info('----------------消息監(jiān)聽器加載成功----------------'); // onMessage 就是方法名,基于反射調(diào)用 return new MessageListenerAdapter(demo, 'onMessage'); } /** * 多個(gè)交換機(jī)就多寫一個(gè) * @param subCheckOrder * @return */ //@Bean //MessageListenerAdapter listenerAdapter2(SubCheckOrder subCheckOrder) { // logger.info('----------------消息監(jiān)聽器加載成功----------------'); // return new MessageListenerAdapter(subCheckOrder, 'onMessage'); //} @Bean StringRedisTemplate template(RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); }}

4、消息發(fā)布

@Autowiredprivate RedisTemplate<String, Object> redisTemplate; redisTemplate.convertAndSend('channel:demo', '我是內(nèi)容');三、具體用法 socket連接成功。 socket消息推送時(shí),把信息發(fā)布到redis中。socket服務(wù)訂閱redis的消息,訂閱成功后進(jìn)行推送。集群下的socket都能訂閱到消息,但是只有之前連接成功的節(jié)點(diǎn)能推送成功,其余的無法推送。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: а_天堂中文最新版地址 | 成人免费视频观看 | 国产在线小视频 | 欧美顶级毛片在线播放 | 精品中文字幕一区 | 成人高清视频在线观看 | 老师的朋友2 | 精品九九 | 精品中文字幕在线观看 | 色婷婷综合在线 | 欧美日韩综合精品 | 国产福利片在线 | 欧美中文字幕在线观看 | 黄色一级网站视频 | 国产福利网站 | 五月激情综合网 | 538在线精品 | 成人亚洲精品 | 国产日韩欧美在线 | 久久久久久成人精品 | 国产精品一区二区三区在线播放 | www.99久| 国产精品日韩欧美一区二区 | 欧美一级欧美三级在线观看 | 日韩激情综合网 | 亚洲第一男人天堂 | 亚洲精品久久 | 欧美一区二区免费 | 一级毛片电影 | 99动漫| 国产在线一区二区三区 | 免费xxxxx在线观看网站软件 | 亚洲欧美在线一区 | 国产美女永久免费无遮挡 | 日韩在线观看中文字幕 | 国产美女网站 | 日韩精品一区二区在线观看 | 亚洲第一免费视频网站 | 天堂久久一区 | 精品国产精品三级精品av网址 | 午夜妇女aaaa区片 |