电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

springboot+websocket+redis搭建的實現

瀏覽:11日期:2023-03-18 17:13:28

在多負載環境下使用websocket。

一、原因

在某些業務場景,我們需要頁面對于后臺的操作進行實時的刷新,這時候就需要使用websocket。

通常在后臺單機的情況下沒有任何的問題,如果后臺經過nginx等進行負載的話,則會導致前臺不能準備的接收到后臺給與的響應。socket屬于長連接,其session只會保存在一臺服務器上,其他負載及其不會持有這個session,此時,我們需要使用redis的發布訂閱來實現,session的共享。

二、環境準備

在https://mvnrepository.com/里,查找websocket的依賴。使用springboot的starter依賴,注意對應自己springboot的版本。

springboot+websocket+redis搭建的實現

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.2.10.RELEASE</version></dependency>

除此之外添加redis的依賴,也使用starter版本:

<!-- redis --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>三、代碼

redis監聽配置:

/** * @description: redis監聽配置類 * @author:weirx * @date:2021/3/22 14:08 * @version:3.0 */@Configurationpublic class RedisConfig { /** * description: 手動注冊Redis監聽到IOC * * @param redisConnectionFactory * @return: org.springframework.data.redis.listener.RedisMessageListenerContainer * @author: weirx * @time: 2021/3/22 14:11 */ @Bean public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(redisConnectionFactory);return container; }}

webSocket配置:

/** * @description: websocket配置類 * @author:weirx * @date:2021/3/22 14:11 * @version:3.0 */@Configurationpublic class WebSocketConfig { /** * description: 這個配置類的作用是要注入ServerEndpointExporter, * 這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint。 * 如果是使用獨立的servlet容器,而不是直接使用springboot的內置容器, * 就不要注入ServerEndpointExporter,因為它將由容器自己提供和管理。 * * @return: org.springframework.web.socket.server.standard.ServerEndpointExporter * @author: weirx * @time: 2021/3/22 14:12 */ @Bean public ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter(); }}

redis工具類:

@Componentpublic class RedisUtil { @Autowired private StringRedisTemplate stringRedisTemplate; /** * 發布 * * @param key */ public void publish(String key, String value) {stringRedisTemplate.convertAndSend(key, value); }}

WebSocket服務提供類:

/** * description: @ServerEndpoint 注解是一個類層次的注解, * 它的功能主要是將目前的類定義成一個websocket服務器端,注解的值將被用于監聽用戶連接的終端訪問URL地址, * 客戶端可以通過這個URL來連接到WebSocket服務器端使用springboot的唯一區別是要@Component聲明下, * 而使用獨立容器是由容器自己管理websocket的,但在springboot中連容器都是spring管理的。 * * @author: weirx * @time: 2021/3/22 14:31 */@Slf4j@Component@ServerEndpoint('/websocket/server/{loginName}')public class WebSocketServer { /** * 因為@ServerEndpoint不支持注入,所以使用SpringUtils獲取IOC實例 */ private RedisMessageListenerContainer redisMessageListenerContainer = ApplicationContextProvider.getBean(RedisMessageListenerContainer.class); /** * 靜態變量,用來記錄當前在線連接數。應該把它設計成線程安全的。 */ private static AtomicInteger onlineCount = new AtomicInteger(0); /** * concurrent包的線程安全Set,用來存放每個客戶端對應的webSocket對象。 * 若要實現服務端與單一客戶端通信的話,可以使用Map來存放,其中Key可以為用戶標識 */ private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>(); /** * 與某個客戶端的連接會話,需要通過它來給客戶端發送數據 */ private Session session; /** * redis監聽 */ private SubscribeListener subscribeListener; /** * 連接建立成功調用的方法 * * @param session 可選的參數。session為與某個客戶端的連接會話,需要通過它來給客戶端發送數據 */ @OnOpen public void onOpen(@PathParam('loginName') String loginName, Session session) {this.session = session;//加入set中webSocketSet.add(this);//在線數加1addOnlineCount();log.info('有新連接[' + loginName + ']加入!當前在線人數為{}', getOnlineCount());subscribeListener = new SubscribeListener();subscribeListener.setSession(session);//設置訂閱topicredisMessageListenerContainer.addMessageListener(subscribeListener, new ChannelTopic(Constants.TOPIC_PREFIX + loginName)); } /** * 連接關閉調用的方法 */ @OnClose public void onClose() throws IOException {//從set中刪除webSocketSet.remove(this);//在線數減1subOnlineCount();redisMessageListenerContainer.removeMessageListener(subscribeListener);log.info('有一連接關閉!當前在線人數為{}', getOnlineCount()); } /** * 收到客戶端消息后調用的方法 * * @param message 客戶端發送過來的消息 * @param session 可選的參數 */ @OnMessage public void onMessage(String message, Session session) {log.info('來自客戶端的消息:{}', message);//群發消息for (WebSocketServer item : webSocketSet) { try {item.sendMessage(message); } catch (IOException e) {log.info('發送消息異常:msg = {}', e);continue; }} } /** * 發生錯誤時調用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) {log.info('發生錯誤,{}', error); } /** * 這個方法與上面幾個方法不一樣。沒有用注解,是根據自己需要添加的方法。 * * @param message * @throws IOException */ public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message); } public int getOnlineCount() {return onlineCount.get(); } public void addOnlineCount() {WebSocketServer.onlineCount.getAndIncrement(); } public void subOnlineCount() {WebSocketServer.onlineCount.getAndDecrement(); }}

redis消息發布:

@Autowired private RedisUtil redisUtil; @Override public Result send(String loginName, String msg) {//推送站內信webSocketredisUtil.publish('TOPIC' + loginName, msg);return Result.success(); }

前端vue代碼:

<template> <div class='dashboard-container'> <div class='dashboard-text'>消息內容: {{ responseData }}</div> </div></template><script> import {mapGetters} from ’vuex’ export default { data() { return {websocket: null,responseData: null } }, created() { this.initWebSocket(); }, destroyed() { this.websock.close() //離開路由之后斷開websocket連接 }, methods: { //初始化websocket initWebSocket() {const wsUri = 'ws://127.0.0.1:21116/websocket/server/' + 'admin';this.websock = new WebSocket(wsUri);this.websock.onmessage = this.websocketonmessage;this.websock.onopen = this.websocketonopen;this.websock.onerror = this.websocketonerror;this.websock.onclose = this.websocketclose; }, websocketonopen() { //連接建立之后執行send方法發送數據let actions = {'用戶賬號': 'admin'};this.websocketsend(JSON.stringify(actions)); }, websocketonerror() {//連接建立失敗重連this.initWebSocket(); }, websocketonmessage(e) { //數據接收const redata = JSON.parse(e.data);this.responseData = redata; }, websocketsend(Data) {//數據發送this.websock.send(Data); }, websocketclose(e) { //關閉console.log(’斷開連接’, e); }, }, name: ’Dashboard’, computed: { ...mapGetters([’name’,’roles’ ]) } }</script>四、測試

springboot+websocket+redis搭建的實現

發送前

springboot+websocket+redis搭建的實現

發送后

到此這篇關于springboot+websocket+redis搭建的實現的文章就介紹到這了,更多相關springboot websocket redis搭建內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 超声波反应釜【百科】-以马内利仪器 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 首页 - 军军小站|张军博客 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页| Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 湖南自考_湖南自学考试| 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 |