• webSocket连接数太多启动不起来怎么办?


    前言

    因为SpringBoot 自带tomcat,而tomcat默认支持1W的连接数量,超过就会拒绝。既然问题出在tomcat,那么现在就有两个方案。

    1. 调大tomcat的连接数量;
    2. 容器换成jetty。

    对于需要保持数十万的长连接,jetty无疑更适合作为启动容器;
    启动容器替换成jetty,只需要在jar引用的时候排除掉tomcat,并且加上jetty的jar附上jar引用代码

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-tomcatartifactId>
            exclusion>
        exclusions>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-jettyartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    聊聊jetty

    前言

    在我们使用SpringBoot开发单体应用或者微服务应用的时候,会引入spring-boot-starter-web这个starter组件,其嵌入Jetty、Tomcat、Undertow三种servlet容器供大家选择,默认是Tomcat容器。

    在日常工作中,SpringBoot 默认推荐的配置并一定适用于所有情况,根据项目配置以及环境,选择合适的容器,才能更好的搭建项目。

    区别Tomcat和Jetty

    • Tomcat和Jetty都是一种Servlet引擎,可以将它们比作为中国与美国的关系,虽然Jetty正常成长为一个优秀的Servlet引擎,但是目前的Tomcat的地位仍然难以撼动。相比较来看,它们都有各自的优点和缺点。Tomcat经过长时间的发展,它已经广泛地被市场接收和认可,相对jetty来说Tomcat更加成熟,在企业级应用方面也是更胜一筹。但是随着Jetty的发展,Jetty的市场份额也在不断提高;
    • Jetty的机构比Tomcat简单。Jetty的设计是基于Handler设计的,易于扩展;Tomcat的设计是基于容器设计的,进行扩展需要了解Tomcat的整体设计结构,不易扩展;
    • Jetty和Tomcat性能方面差异不大。Jetty可以同时处理大量连接而且可以长时间保持连接,适合于Web聊天应用等等。Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少了服务器内存开销,从而提高服务器性能。Jetty默认采用非阻塞IO(NIO),在处理I/O请求上更占优势,在处理静态资源时,性能较高。Tomcat适合处理少量非常繁忙的连接,也就是说连接生命周期短的话,Tomcat的总体性能更高。另外,Tomcat默认采用的时阻塞IO(BIO)处理I/O请求,在处理静态资源时,性能较差

    Jetty相关属性

    server:
      jetty:
        accesslog:
          enabled: true # 是否打开jetty日志
          dir:  # 访问日志所在目录
        max-threads: 200 # 最大线程数(默认200)
        min-threads: 8 # 最小线程数(默认8)
        thread-idle-timeout: 2000 # 线程最大空闲时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动类效果如下

    在这里插入图片描述

    聊聊Undertow

    Undertow介绍

    1. Undertow是红帽公司开发的一款基于NIO的高性能Web嵌入式服务器
    2. Undertow的特点:
      • 轻量级:由两个核心jar包组成,加载一个Web应用可以小于10MB内存
      • Servelet3.1支持
      • WebSocket支持:对WebSocket完全支持,用以满足Web应用巨大数量的客户端
      • 嵌套性:不需要容器,只需通过API即可快速搭建Web服务器

    SpringBoot集成Undertow

    <dependency>
       <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-tomcatartifactId>
            exclusion>
        exclusions>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-undertowartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    常用配置参数

    server:
      undertow:
        # 设置IO线程数,主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程
        # 不要设置过大,如果过大,启动项目会报错
        # CPU有几核,就填写几
        io-threads: 32
        # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
        # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
        worker-threads: 2000
        # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
        # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
        buffer-size: 1024
        # 是否分配的直接内存(NIO直接分配的对外内存)
        direct-buffers: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动类启用效果

    在这里插入图片描述

  • 相关阅读:
    CSV 文本过滤查询汇总计算
    java 整理
    在Vue中使用Immutable.js
    Python---Socket 网络通信
    “蔚来杯“2022牛客暑期多校训练营5
    跟李沐学AI-深度学习课程04数据操作
    油罐清洗抽吸系统设计
    Kubernetes 中使用consul-template渲染配置
    如何做一个基于 Python 的搜索引擎?
    【网络】UDP和TCP套接字编程
  • 原文地址:https://blog.csdn.net/qq_42582773/article/details/127427903