分布式websocket解决方案

news2024/11/25 15:56:20

1、websocket问题由来

websocket基础请自行学习,本文章是解决在分布式环境下websocket通讯问题。
在单体环境下,所有web客户端都是连接到某一个微服务上,这样消息都是到达统一服务端,并且也是由一个服务端进行响应,所以不会出现问题。
但是在分布式环境下,我们很容易发现,客户端连接的不是同一个后台微服务,这样就会导致一个问题是客户端与服务端发送和接收处理的服务不一致,因为客户端一旦与服务端建立连接,后续通讯就只能与该微服务通讯了,这样就不能实现通讯。
分布式环境下通讯图

2、解决方式

大家首先可能会想到使用分布式缓存来解决此问题,但是websocket的session(不明白session的先补充wensocket基础知识)是不允许被持久化的,这样就导致不能共享,导致消息发送失败。
解决方式有很多种,本本章介绍使用redis的发布订阅来解决分布式消息通讯问题。

![redis发布订阅解决分布式websocket](https://img-blog.csdnimg.cn/0aaf63dc1ae04c1589e6a95f2ff9a707.p
redis发布订阅解决分布式websocket

3、实现过程

3.1 引入依赖

以下是gradle依赖,使用maven依赖的同理

    compile 'org.springframework.boot:spring-boot-starter-web'
	//websocket
    compile 'org.springframework.boot:spring-boot-starter-websocket'
	compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
	compile 'org.projectlombok:lombok'
	//redis
	compile 'org.springframework.boot:spring-boot-starter-data-redis'

3.2 负载均衡配置

负载均衡使用nginx,相关配置如下

代理对个微服务

upstream chat_server{
   
		server 127.0.0.1:9090;
		server 127.0.0.1:9091;
	}
location /ws {
   
			proxy_read_timeout 60;
			#proxy_connect_timeout 10;
			#proxy_send_timeout 60;
			#websocket长时间没有进行通讯时,在nginx达到默认超时时间后会自动断开,可增大超时时间,生产环境建议增加心跳检测解决
			#proxy_read_timeout 3600s;
			proxy_pass http://chat_server/ws;
			proxy_set_header Host $host:$server_port;
			proxy_set_header  X-Real-IP        $remote_addr;
			proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
			proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection 'upgrade';
        }

由此负载均衡也配置完成。

3.3 后台服务实现

aplication.properties配置

server.port=9090
spring.application.name=netty-chat
server.servlet.context-path=/ws

#redis
spring.redis.host=192.168.202.133
spring.redis.port=6379
spring.redis.password=

整个代码目录
在这里插入图片描述

redis发布订阅实现,见redis模块下;
websocket实现见,socket目录下;
源码

3.4 前端服务实现

jquery资源自行下载

<!DOCTYPE html>
<html lang="en">
<head>
    <meta 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,设置axios,utils工具包,vue.fonfig.js配置项 (下)

系列文章目录 这里是创建移动端项目 【Vue】Vue2.x创建项目全程讲解&#xff0c;保姆级教程&#xff0c;手把手教&#xff0c;Vue2怎么创建项目&#xff08;上&#xff09; 【Vue】Vue2创建移动端项目实战教程&#xff0c;创建移动端项目保姆级教程&#xff0c;接上一篇创建Vue…

解压版 MySQL 数据库的安装与配置

目录 1 下载2 安装3 配置3.1 添加环境变量3.2 新建配置文件3.3 初始化MySQL3.4 注册MySQL服务3.5 启动MySQL服务3.6 修改默认账户密码 4 登录MySQL5 卸载MySQL 安装环境:Win10 64位 软件版本:MySQL 5.7.24 解压版 1 下载 点击链接 进入如下界面 ❗️注意&#xff1a; 我们一般不…

JavaEE初阶:多线程 - 编程

1.认识线程 我们在之前认识了什么是多进程&#xff0c;今天我们来了解线程。 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 引入进程这个概念&#xff0c;主要是为了解决并发编程这样的…

JAVA集合-List

// 数组的缺点&#xff1a;每次使用都需要指定长度&#xff0c;掉率低&#xff0c;操作麻烦 // // 【java集合体系】&#xff1a;分类&#xff1a;6个接口&#xff0c;1个工具类 // 6个接口&#xff1a; 单列 :Collection,(父接口) // …

成功项目管理必备的五个关键因素

在任何组织中&#xff0c;良好的项目管理都是项目成功的首要标准。然而&#xff0c;一旦被淹没在无穷无尽的任务、持续的紧迫性和利益相关者相互冲突等情况中&#xff0c;管理好项目可能会让你感到力不从心。找出项目成功的关键因素并加以解决&#xff0c;就能避免一切失败。 …

浅谈学生宿舍安全用电管理存在的问题及防范措施

安科瑞 华楠 摘要&#xff1a;2009年&#xff0c;由一个小小的“热的快”引起的学院女生火灾事件&#xff0c;再一次敲响了大学生安全用电的警钟。而近年来随着教育事业的蓬勃发展和教育体制的推进&#xff0c;我国高等教育总规模在逐年增加。而目前高等学校能源使用主要是以电…

产品帮助中心的制作方法,保姆级0-1完整的实操教程!

帮助中心是一个产品的重要用户自助服务模块&#xff0c;包括各类产品相关信息&#xff0c;用以帮助用户快速理解和使用产品功能。对于我们产品开发和管理者而言&#xff0c;设计帮助中心的初衷是解决用户困惑&#xff0c;怎么设计帮助中心&#xff0c;才能让其价值尽可能的大&a…

【C语言】每日一题(寻找数组的中心下标)

寻找数组的中心下标&#xff0c;链接奉上 方法 暴力循环前缀和 暴力循环 ​​​​​​​思路&#xff1a; 依旧是我们的老朋友&#xff0c;暴力循环。 1.可以利用外层for循环&#xff0c;循环变量为数组下标&#xff0c;在循环内分别求出下标左边与右边的sum 2.在边界时讨论&…

伙伴云CEO戴志康:让数据和业务更好的互通展现,数字化与可视化同步进行

近日&#xff0c;零代码平台伙伴云产品「页面」功能正式上线&#xff0c;在【小伙开麦】直播间&#xff0c;CEO戴志康和产品经理共同为在线观众展示「页面」的功能与使用技巧&#xff0c;让小伙伴们大呼过瘾&#xff01;好玩、好用、好看的「页面」&#xff0c;到底有哪些亮点&…

动手学深度学习-pytorch版本(一):引言 预备知识

参考引用 动手学深度学习利用 Anaconda 安装 pytorch 和 paddle 深度学习环境 pycharm 安装 0. 环境安装 利用 Anaconda 安装 pytorch 和 paddle 深度学习环境 pycharm 安装 1. 引言 机器学习&#xff08;machine learning&#xff0c;ML&#xff09;是⼀类强⼤的可以从经…

苏宁API的详细介绍及应用领域分析

随着电子商务的快速发展&#xff0c;越来越多的企业开始关注并积极开发自己的API接口&#xff0c;以提供更加高效、便捷和个性化的服务。苏宁作为中国领先的零售企业之一&#xff0c;也不例外。 1. 苏宁API是什么&#xff1f; 苏宁API是苏宁开放平台提供的一组接口集合&#x…

c++ 获取输入

获取键盘输入 #include <iostream> #include <limits>bool enter_state(int &pos) {unsigned int userInput;std::cout << "[info] 请选择: 0.主驾, 1.副驾, 2.后排" << std::endl;std::cout << "[info] 请输入&#xff1a;…

网络系统架构演变

1.系统架构演变 随着互联网的发展&#xff0c;网站应用的规模不断扩大。需求的激增&#xff0c;带来的是技术上的压力。系统架构也因此不断的演进、升级、迭代。从单一应用&#xff0c;到垂直拆分&#xff0c;到分布式服务&#xff0c;到SOA&#xff0c;以及现在火热的微服务架…

BFS(广度优先搜索)和DFS(深度优先搜索)的相关介绍解析

文章目录 DFS 和 BFSBFS 的应用一&#xff1a;层序遍历BFS 的应用二&#xff1a;最短路径最短路径例题讲解 DFS简介DFS原理分类与分析1. DFS连通性模型2. DFS思路应用-穷举求解问题 DFS&#xff08;深度优先搜索&#xff09;和 BFS&#xff08;广度优先搜索&#xff09;就像孪生…

java:反射

java代码运行的三个阶段 第一阶段&#xff1a;源代码编译为了字节码&#xff08;.class文件&#xff09; 第二阶段&#xff1a;就是类加载器将字节码文件加载到内存中 第三阶段&#xff1a;程序运行时 类加载 将 class 文件读取到内存中的过程&#xff0c;称为类加载 class 文…

LabVIEW使用边缘检测技术实现彩色图像隐写术

LabVIEW使用边缘检测技术实现彩色图像隐写术 隐写术是隐藏信息的做法&#xff0c;以隐瞒通信的存在而闻名。该技术涉及在适当的载体&#xff08;如图像&#xff0c;音频或视频&#xff09;中插入秘密消息。在这些载体中&#xff0c;数字图像因其在互联网上的广泛使用而受到青睐…

软件测试用例设计方法之因果图法

基本概念 因果图是一种利用图解法分析输入的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 设计测试用例的步骤 分析软件规格说明描述中, 哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件), 并给每…

API 接口设计版本管理控制的规范:向后兼容的3个规则

一下文章内容来自之前做API接口时整理的一些内容&#xff0c;记录分享一下。 在HTTP和HTML发展的早期&#xff0c;有着这样一条规则&#xff1a;任何浏览器在遇到无法识别的元素或元素属性时&#xff0c;都应该像该标签不存在一样行事。这使得快速更新HTML的功能成为可能&…

通过代码实现窗口界面布局的方法

在QWidget窗口中添加相关事件resizeEvent()函数并编写相关功能代码&#xff1a; void Widget::resizeEvent(QResizeEvent *event) {QSize szui->plainTextEdit->size();ui->plainTextEdit->move(5,5);ui->pabpic->move(5,sz.height()5);ui->plainTextEd…

c++游戏小技巧12:输入输出流(存读档超全版)

目录 1.前言 2.输入/输出概念 3.流的概念 4.正文 1.标准I/O流 1.get()函数 2.getline()函数 3.read()函数 4.ignore()函数 5.gcount()函数 6.peek()函数 7.putback()函数 8.istream集合栗子 9.put()函数 10.write()函数 11.ostream集合栗子 2.文件I/O流 1.流…