我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何搭建springboot+websocket+redis

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何搭建springboot+websocket+redis

本篇内容主要讲解“如何搭建springboot+websocket+redis”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何搭建springboot+websocket+redis”吧!

在多负载环境下使用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监听配置:

@Configurationpublic class RedisConfig {        @Bean    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {        RedisMessageListenerContainer container = new RedisMessageListenerContainer();        container.setConnectionFactory(redisConnectionFactory);        return container;    }}

webSocket配置:

@Configurationpublic class WebSocketConfig {        @Bean    public ServerEndpointExporter serverEndpointExporter(){        return new ServerEndpointExporter();    }}

redis工具类:

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

WebSocket服务提供类:

@Slf4j@Component@ServerEndpoint("/websocket/server/{loginName}")public class WebSocketServer {        private RedisMessageListenerContainer redisMessageListenerContainer =            ApplicationContextProvider.getBean(RedisMessageListenerContainer.class);        private static AtomicInteger onlineCount = new AtomicInteger(0);        private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();        private Session session;        private SubscribeListener subscribeListener;        @OnOpen    public void onOpen(@PathParam("loginName") String loginName, Session session) {        this.session = session;        //加入set中        webSocketSet.add(this);        //在线数加1        addOnlineCount();        log.info("有新连接[" + loginName + "]加入!当前在线人数为{}", getOnlineCount());        subscribeListener = new SubscribeListener();        subscribeListener.setSession(session);        //设置订阅topic        redisMessageListenerContainer.addMessageListener(                subscribeListener, new ChannelTopic(Constants.TOPIC_PREFIX + loginName));    }        @OnClose    public void onClose() throws IOException {        //从set中删除        webSocketSet.remove(this);        //在线数减1        subOnlineCount();        redisMessageListenerContainer.removeMessageListener(subscribeListener);        log.info("有一连接关闭!当前在线人数为{}", getOnlineCount());    }        @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;            }        }    }        @OnError    public void onError(Session session, Throwable error) {        log.info("发生错误,{}", error);    }        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) {        //推送站内信webSocket        redisUtil.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”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何搭建springboot+websocket+redis

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何搭建springboot+websocket+redis

本篇内容主要讲解“如何搭建springboot+websocket+redis”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何搭建springboot+websocket+redis”吧!在多
2023-06-14

php如何搭建websocket环境

这篇文章主要介绍“php如何搭建websocket环境”,在日常操作中,相信很多人在php如何搭建websocket环境问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何搭建websocket环境”的疑
2023-07-04

如何使用WebSocket+SpringBoot+Vue搭建简易网页聊天室

今天小编给大家分享一下如何使用WebSocket+SpringBoot+Vue搭建简易网页聊天室的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
2023-07-06

如何在spring环境中搭建websocket

今天就跟大家聊聊有关如何在spring环境中搭建websocket,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。本文基于Apach Tomcat 8.0.3+MyEclipse+ma
2023-05-31

SpringBoot如何快速搭建

这篇文章主要介绍SpringBoot如何快速搭建,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Boot 概述Build Anything with Spring Boot:Spring Boot is
2023-06-02

如何搭建redis集群

这篇文章主要讲解了“如何搭建redis集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何搭建redis集群”吧!redis集群搭建在开始redis集群搭建之前,我们先简单回顾一下redi
2023-06-25

Linux下如何搭建Redis

这篇文章主要介绍了Linux下如何搭建Redis,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度
2023-06-28

springboot如何集成websocket

这篇文章主要介绍了springboot如何集成websocket,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 原生注解pom.xml
2023-06-22

eclipse如何搭建springboot框架

要在Eclipse中搭建Spring Boot框架,可以按照以下步骤进行操作:1. 首先,确保已经安装了Java Development Kit(JDK)和Eclipse IDE。可以从官方网站下载并安装它们。2. 打开Eclipse ID
2023-10-08

docker如何搭建redis集群

要搭建Redis集群,可以使用Docker来进行部署。下面是一种常见的方法:1. 创建一个文件夹,在文件夹中创建一个名为`docker-compose.yml`的文件,内容如下:```yamlversion: '3'services:red
2023-08-23

Springboot多租户SaaS如何搭建

这篇文章主要介绍“Springboot多租户SaaS如何搭建”,在日常操作中,相信很多人在Springboot多租户SaaS如何搭建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Springboot多租户Sa
2023-07-02

如何搭建一个SpringBoot项目

这篇文章给大家分享的是有关如何搭建一个SpringBoot项目的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。零、环境介绍环境:jdk1.8及以上,maven,Win10,IDEA,网络一、手把手创建请求创建在启动
2023-06-25

SpringBoot如何搭建多数据源

这篇文章主要为大家展示了“SpringBoot如何搭建多数据源”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot如何搭建多数据源”这篇文章吧。首先我们建立两个数据库(可以不在同一
2023-06-21

Windows下如何搭建Redis集群

这篇文章给大家分享的是有关Windows下如何搭建Redis集群的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis集群:如果部署到多台电脑,就跟普通的集群一样;因为Redis是单线程处理的,多核CPU也只能
2023-06-29

redis集群搭建如何使用

搭建 redis 集群步骤:规划集群拓扑配置 redis 服务器创建集群创建槽添加数据redis 集群优点:高可用性可扩展性线性可伸缩性数据分区注意事项:集群管理客户端支持数据丢失Redis 集群搭建和使用指南搭建 Redis 集群要搭
redis集群搭建如何使用
2024-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录