聊天服务器分布式改造

目前的聊天室是单节点的,无论是http接口还是socket接口都在同一个进程,无法承受太多人同时在线,容灾性也非常差。因此,一个成熟的IM产品一定是做成分布式的,根据功能分模块,每个模块也使用多个节点并行部署。

1.技术选型

Spring Cloud Alibaba 和 Netflix 都是用于构建分布式系统的工具集,它们在微服务架构中发挥着重要作用,但在多个方面存在差异:
发展与维护

  • Netflix:部分核心组件(如 Eureka、Hystrix)停止更新维护,企业使用有后续风险。
  • Spring Cloud Alibaba:由阿里巴巴开源并持续投入开发,社区活跃,不断迭代优化,能及时修复问题、添加新功能。

核心组件功能

  • Netflix 服务注册与发现(Eureka),负载均衡(Ribbon),熔断与限流(Hystrix),都已经停更。
  • Spring Cloud Alibaba的各种组件处于活跃的开发和维护状态,不断推出新的功能和优化。

生态系统

  • Netflix:早期生态完整,但因组件停更发展受限。
  • Spring Cloud Alibaba:深度集成 Spring Cloud,与阿里巴巴其他开源项目配合好,社区文档和示例丰富,生态发展好。

综上,我们选择Spring Cloud Alibaba(2021.x 版本)。

2.主要服务组件

组件功能 
Nacos服务注册与发现组件,配置中心
spring-cloud-starter-gateway
通信网关
Spring Cloud Alibaba LoadBalancer客户端负载均衡器
spring-security-oauth2
集中授权中心

2.1.Nacos服务发现与配置管理

Nacos 是 Spring Cloud Alibaba 中核心的服务注册与发现组件,同时也具备配置管理功能。除了Nacos,还有Eureka,Consul,ZooKeeper等有类似功能,但Nacos同时在这两个方面表现优异,还有一个可视化管理后台,作为首选产品。

2.2.spring-security-oauth2授权中心

spring-security-oauth2作为一个集中授权中心,无论是客户端请求,还是微服务内部的请求,都需要先到它这里进行认证,结合jwt算法,可以生成一个无需服务器管理的token。

Spring Security OAuth2 实现了 OAuth 2.0 协议中的四种授权方式,分别是授权码模式(Authorization Code)、简化模式(Implicit)、密码模式(Resource Owner Password Credentials)和客户端模式(Client Credentials)。下面为你详细介绍这四种授权方式:

授权码模式(Authorization Code)

授权码模式是 OAuth 2.0 中最安全、最常用的授权方式。它适用于有服务器端的应用,通过客户端引导用户到授权服务器进行登录授权,获取授权码,再用授权码换取访问令牌。

简化模式(Implicit)

简化模式是一种简化的授权方式,适用于没有服务器端的客户端应用(如单页应用)。它省略了授权码的步骤,直接在浏览器中获取访问令牌。

 密码模式(Resource Owner Password Credentials)

密码模式是一种简单直接的授权方式,适用于受信任的客户端应用。用户直接将自己的用户名和密码提供给客户端,客户端使用这些信息向授权服务器换取访问令牌。

客户端模式(Client Credentials)

客户端模式是一种用于客户端应用自身获取访问令牌的授权方式,不涉及用户的身份信息。适用于客户端应用需要以自己的身份访问资源服务器的场景。

微服务内部授权上,本文使用客户端模式。当微服务之间以服务自身的身份进行交互,且不需要区分用户身份时,客户端模式是一个简单、安全、高效的授权方式。可以使用 OAuth 2.0 协议的客户端模式来管理服务之间的访问权限。

客户端登录验证上,本文使用密码模式,结合jwt算法,实现无状态的授权。

3.模块划分

对于一个聊天软件,按照功能进行划分,先简单划分为用户,web,socket模块。后面根据需要再进行细化。

主要目标,除了聊天这种实时性要求,以及客户端推送这种需要服务器主动发送消息以外,其他逻辑尽可能走http,实现负载均衡。 架构图如下:

客户端统一访问gateway网关,通过账号密码向授权中心认证通过后,得到一个token,后续所有http请求都需要带上此header。http登录成功之后,服务器还会根据负载均衡策略选择一个socket节点,作为客户端聊天的主要通信网关,用户在这次登录的生命周期只会绑定该节点,而其他http请求则会被分散到不同模板的不同节点。

4.第三方中间件

中间件作用
mysql 用户,讨论群,消息等数据的持久化方案
minio头像,多媒体消息的文件存储系统
redis用户数据快速缓存
nacos服务注册发现,配置管理

由于使用的中间件比较多,本文使用docker-compose进行集中化配置,配置如下:

version: '3.3'
 
services:
  db:
    image: mysql:latest
    container_name: im-mysql
    environment:
      MYSQL_PASSWORD: '123456'
      MYSQL_ROOT_PASSWORD: '123456'
    ports:
      - "3306:3306"
    volumes:
      - ./data/mysql/data:/var/lib/mysql
    restart: always
    networks:
      - im-network
  nacos:
    image: nacos/nacos-server:v2.3.1
    container_name: im-nacos
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=standalone
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    ports:
      - "8848:8848"
      - "9848:9848"
    networks:
      - im-network 

  minio:
    image: minio/minio:latest
    container_name: im-s3
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    command: server --console-address ":9001" /data    
    volumes:
      - ./data/minio:/data
    restart: always
    networks:
      - im-network

  redis:
    image: redis:latest
    container_name: im-redis
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data
    restart: always
    networks:
      - im-network      
networks:
  im-network:
     driver: bridge

 全部代码已在github上托管

服务端代码请移步 --> 聊天室服务器

客户端代码请移步 --> 聊天室客户端

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …

深入解析 BitBake 日志机制:任务调度、日志记录与调试方法

1. 引言:为什么 BitBake 的日志机制至关重要? BitBake 是 Yocto 项目的核心构建工具,用于解析配方、管理任务依赖,并执行编译和打包任务。在 BitBake 构建过程中,日志记录机制不仅用于跟踪任务执行情况,还…

OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对选定区域内的梯度场应用适当的非线性变换,然后通过泊松求解器重新积分,可以局部修改图像的表观照明。 cv::illuminati…

【DuodooTEKr 】多度科技 以开源之力,驱动企业数字化转型

多度科技 背景 / Background 在全球产业链重构与国内经济双循环的浪潮下,中国制造业与贸易企业正面临数字化升级的迫切需求。开源技术作为数字化转型的基石,不仅能打破技术壁垒、降低企业成本,更能通过协作创新加速产业智能化进程。 多度科技…

VBA经典应用69例应用7:从字符串中删除数字

《VBA经典应用69例》(版权10178981),是我推出的第九套教程,教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开,这套教程案例众多,紧贴“实战”,并做“战术总结”,以便…

Vue 系列之:插槽

前言 插槽是定义在子组件中的&#xff0c;相当于一个占位符&#xff0c;父组件可以在这个占位符中填充HTML代码、组件等内容。 插槽显不显示、怎样显示是由父组件来控制的&#xff0c;而插槽在哪里显示就由子组件来进行控制。 基本使用 子组件&#xff1a; <template&g…

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…

IP,MAC,ARP 笔记

1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字&#xff0c;比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此&#xff0c;完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…

【A2DP】MPEG - 2/4 AAC 编解码器互操作性要求详解

目录 一、概述 二、编解码器特定信息元素(Codec Specific Information Elements ) 2.1 信息元素结构 2.2 对象类型(Object Type) 2.3 MPEG - D DRC 2.4 采样频率(Sampling Frequency) 2.5 通道(Channels) 2.6 比特率(Bit rate) 2.7 可变比特率(VBR) 三、…

网络安全规划重安全性需求

1.网络安全基本内容 安全包括哪些方面 操作系统内部的安全包括&#xff1a;数据存储安全、应用程序安全、操作系统安全。 此外还有网络安全、物理安全、用户安全教育。 网络安全&#xff1a; 网络安全是指网络系统的硬件、软件及其系统中的数 据受到保护&#xff0c;不因偶然…

发展史 | 深度学习 / 云计算

注&#xff1a;本文为来自 csdn 不错的“深度学习 / 云计算发展史 ” 相关文章合辑。 对原文&#xff0c;略作重排。 深度学习发展史&#xff08;1943-2024 编年体&#xff09;&#xff08;The History of Deep Learning&#xff09; Hefin_H 已于 2024-05-23 15:54:45 修改 …

Qt开发:nativeEvent事件的使用

文章目录 一、概述二、nativeEvent 的定义三、Windows 平台示例三、使用nativeEvent监测设备变化 一、概述 Qt 的 nativeEvent 是一个特殊的事件处理机制&#xff0c;允许开发者处理操作系统级别的原生事件。通常&#xff0c;Qt 通过 QEvent 机制来管理事件&#xff0c;但有时…

宠物医院台账怎么做,兽医电子处方单模板打印样式,佳易王兽医兽药开方宠物病历填写打印操作教程

一、概述 本实例以佳易王兽医宠物电子处方开单系统版本为例说明&#xff0c;其他版本可参考本实例。试用版软件资源可到文章最后了解&#xff0c;下载的文件为压缩包文件&#xff0c;请使用免费版的解压工具解压即可试用。 软件特点&#xff1a; 多场景处方兼容性针对宠物医…

RuleOS:区块链开发的“新引擎”,点燃Web3创新之火

RuleOS&#xff1a;区块链开发的“新引擎”&#xff0c;点燃Web3创新之火 在区块链技术的浪潮中&#xff0c;RuleOS宛如一台强劲的“新引擎”&#xff0c;为个人和企业开发去中心化应用&#xff08;DApp&#xff09;注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…

Leetcode 刷题记录 04 —— 子串

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 和为 K 的子数组 方法一&#xff1a;枚举 方法二&#xff1a;前缀和 哈希表优化 0…

3D数字化:家居行业转型升级的关键驱动力

在科技日新月异的今天&#xff0c;家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起&#xff0c;再到如今3D数字化营销的广泛应用&#xff0c;消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷&#xff0c;还…

开启Ollama的GPU加速

Ollama 开启 GPU 加速可显著提升大语言模型运行效率与性能&#xff0c;通过利用 NVIDIA CUDA 等 GPU 并行计算能力优化矩阵运算&#xff0c;推理速度可实现数倍至数十倍的提升&#xff0c;有效降低用户交互延迟。 1.验证WSL内是否已正确启用CUDA支持&#xff0c;需在两个不同环…

Linux 指定命令行前后添加echo打印内容

目录 一. 前提条件二. 通过sh脚本进行批量修改三. 通过Excel和文本编辑器进行批量转换四. 实际执行效果 一. 前提条件 ⏹项目中有批量检索文件的需求&#xff0c;如下所示需要同时执行500多个find命令 find ./work -type f -name *.java find ./work -type f -name *.html fi…

力扣HOT100之哈希:128. 最长连续序列

这道题我想的比较简单&#xff0c;先遍历一遍输入的数组&#xff0c;然后将读取到的数字存入一个map容器中&#xff08;注意&#xff0c;不是unordered_map&#xff09;&#xff0c;数字作为键&#xff0c;布尔变量为值&#xff0c;然后再遍历一遍map&#xff0c;用一个变量tem…

在VMware上部署【Rocky Linux】保姆级

镜像下载 国内各镜像站点均可下载rocky Linux镜像&#xff0c;下面例举阿里云网站 阿里云镜像站点&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xf…