码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Netty Websocket SpringBoot Starter


    netty websocket starter

    Quick Start

    Demo 项目

    添加依赖

    
    <repository>
        <id>githubid>
        <url>https://maven.pkg.github.comurl>
        <snapshots>
            <enabled>trueenabled>
        snapshots>
    repository>
    
    
    <dependency>
        <groupId>com.github.kuangcpgroupId>
        <artifactId>netty-ws-spring-boot-starterartifactId>
        <version>1.0.5-RELEASEversion>
    dependency>
    

    基础配置

    netty-ws:
      port: 5455
      max-content-length: 4096
      max-frame-size: 65536
      reader-idle-sec: 60
      reader-idle-threshold: 2
      connect-auth: true
    

    自定义连接处理类

    
    @Component
    @ChannelHandler.Sharable
    public class DemoHandler extends AbstractBizHandler {
    
        public DemoHandler(CacheDao cacheDao, UserDao userDao, WsServerConfig config) {
            super(cacheDao, userDao, config);
            this.schedulerPollQueueMsg(Executors.newScheduledThreadPool(1));
        }
    
        @Override
        public void connectSuccess(Long userId) {
            log.info("connected {}", userId);
        }
    
        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            String id = WsSocketUtil.id(ctx);
            Long userId = channelUserMap.get(id);
            log.info("disconnect {}", userId);
            super.channelInactive(ctx);
        }
    
        @Override
        protected void handSharkHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) {
            super.handSharkHttpRequest(ctx, request);
        }
    }
    

    实现存储扩展 com.github.kuangcp.websocket.store.CacheDao
    实现认证扩展 com.github.kuangcp.websocket.store.UserDao

    • 然后启动项目, 验证websocket通信。 可使用 Js 测试客户端 测试
      • 连接地址 ws://127.0.0.1:5455/ws?uid={uid}&token={token}
      • 注意认证的实现方式为HTTP握手时,将Token作为url参数或者作为Header,参数名都是token

    设计思路

    Netty作为通信基础,每个用户连接时通过前置的Nginx等SLB层负载均衡到WS集群。

    1. 用户和主机ip关系绑定到Redis map结构中
    2. 每个主机ip绑定一个Redis的list队列,存放了其他节点写入的消息数据,解决应用层向用户推送消息时,用户连接随机分散的问题。

    注意:Redis可替换成任意中心存储, 已由 CacheDao 抽象,应用层自己实现。

  • 相关阅读:
    Go/Golang语言学习实践[回顾]教程12--快速体验Go语言的并发之美
    《2022中国低/无代码市场研究及选型评估报告》发布
    JDK8中HashMap底层源码解析-treeifyBin和splite方法
    bootstrap-fileinput拦截文件上传处理失败,根据后台返回数据处理
    <C++>解密 构造函数和析构函数
    为什么说做亚马逊站外引流必须有独立站着陆页
    面试官:关于网络IO模型的原理如何理解,说说你的分析
    解决eclipse中的Java文件,使用idea打开的乱码问题
    【毕业设计】基于stm32的车牌识别 - 单片机 嵌入式 物联网 机器视觉
    爬虫利器Frida RPC入门——夜神模拟器环境篇
  • 原文地址:https://blog.csdn.net/kcp606/article/details/140391661
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号