SpringCloud 性能优化

news2025/1/8 11:39:24

Springcloud的性能问题

Springcloud 原始的配置,性能是很低的,大家可以使用Jmeter测试一下,QPS不会到50。要做到高并发,需要做不少的配置优化,主要的配置优化有以下几点:

  • Feign 配置优化
  • hystrix配置 优化
  • ribbon 优化
  • Servlet 容器 优化
  • Zuul配置 优化

应用服务组件调优

Servlet 容器 优化

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器,可以将 Web 服务器切换到 Undertow 来提高应用性能,Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式

Zuul使用的内置容器默认是Tomcat,可以将其换成undertow,可以显著减少线程的数量,替换方式即在pom中添加以下内容:
第一步,移除Tomcat 依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
      </exclusion>
   </exclusions>
</dependency>

第二步,增加Untertow 依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

第三步,Undertow 的属性配置

server:
  undertow:
     io-threads: 16
     worker-threads: 256
     buffer-size: 1024
     buffers-per-region: 1024
     direct-buffers: true

server.undertow.io-threads: 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程,不要设置过大,如果过大,启动项目会报错:打开文件数过多

server.undertow.worker-threads: 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程,它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8

server.undertow.buffer-size: 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理,每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可

server.undertow.buffers-per-region: 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region

server.undertow.direct-buffers: 是否分配的直接内存(NIO直接分配的堆外内存)

在这里插入图片描述

Feign 配置优化

feign 默认不启用hystrix,需要手动指定 feign.hystrix.enabled=true 开启熔断

feign 启用压缩也是一种有效的性能优化方式,具体的配置如下

feign:
	compression:
		request:
			enabled: true
			mime-types: text/xml,application/xml,application/json
		response:
			enabled: true

feign HTTP请求方式选择
feign默认使用的是基于JDK提供的URLConnection调用HTTP接口,不具备连接池,所以资源开销上有点影响,经测试JDK的URLConnection比Apache HttpClient快很多倍。Apache HttpClient和okhttp都支持配置连接池功能,也可以使用okhttp请求方式。
当使用HttpClient时,可如下设置:

feign:
  httpclient:
    enabled: true
    max-connections:1000
    max-connections-per-route: 200 

当使用OKHttp时,可如下设置:

feign:
  okhttp:
    enabled: true
  httpclient:
    max-connections: 1000
    max-connections-per-route: 200 	 

max-connections 设置整个连接池最大连接数(该值默认为200), 根据自己的场景决定
max-connections-per-route 设置路由的默认最大连接(该值默认为50),限制数量实际使用

在这里插入图片描述

Gateway组件调优

Zuul配置 优化

我们知道Hystrix有隔离策略:THREAD 以及SEMAPHORE ,默认是 SEMAPHORE 。

Zuul默认是使用信号量隔离,并且信号量的大小是100,请求的并发线程超过100就会报错,可以调大该信号量的最大值来提高性能,配置如下:

zuul:
  semaphore:
    max-semaphores: 5000

表示,当Zuul的隔离策略为SEMAPHORE时,设置指定服务的最大信号量为5000。对于特定的微服务,可以通过下面的方式,设置最大信号量

设置默认最大信号量:

zuul:
semaphore:
max-semaphores: 5000 # 默认值
设置指定服务的最大信号量:

zuul:
  eureka:
    <commandKey>:
      semaphore:
        max-semaphores: 5000 	

在这里插入图片描述

为了方便ThreadLocal的使用,也可以改为使用线程隔离的策略,这种场景下,就需要调大hystrix线程池线程大小,该线程池默认10个线程,调整的配置示例如下:

zuul:
  ribbonIsolationStrategy: THREAD
hystrix:
  threadpool:
    default:
      coreSize: 100
      maximumSize: 400
      allowMaximumSizeToDivergeFromCoreSize: true
      maxQueueSize: -1

hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize:是否让maximumSize生效,false的话则只有coreSize会生效

hystrix.threadpool.default.maxQueueSize:线程池的队列大小,-1代表使用SynchronousQueue队列

hystrix.threadpool.default.maximumSize:最大线程数量

hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize:是否让maximumSize生效,false的话则只有coreSize会生效

hystrix.threadpool.default.maxQueueSize:线程池的队列大小,-1代表使用SynchronousQueue队列

zuul.ribbon-isolation-strategy:设置线程隔离,thread 线程隔离,SEMAPHORE 表示信号量隔离

默认配置都可以去HystrixThreadPoolProperties和ZuulProperties这两个java文件中查找

hystrix配置 优化

首先需要设置参数hystrix.threadpool.default.coreSize 来指定熔断隔离的线程数,这个数需要调优,经测试线程数我们设置为和提供方的容器线程差不多,吞吐量高许多。

其次,启用Hystrix后,很多服务当第一次访问的时候都会失败 是因为初始化负载均衡一系列操作已经超出了超时时间了,因为默认的超时时间为1S,需要修改超时时间参数,方可解决这个问题。

参考的hystrix配置如下:

hystrix:
  threadpool:
    default:
      coreSize: 500
  command:
    default:
	  circuitBreaker: 
	    requestVolumeThreshold: 1000
      fallback:
        enabled: true
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 100000 

hystrix.command.default: 全局的作用域,作用的所有的hystrix的客户端,如果需要对某个微服务,可以写serviceId

hystrix.command.default.fallback.enabled 是否开启回退方法

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 请求处理的超时时间,缺省为1000,表示默认的超时时间为1S

hystrix.threadpool.default.coreSize 核心线程池数量

hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 回退最大线程数

hystrix.command.default.circuitBreaker.requestVolumeThreshold 熔断器失败的个数,进入熔断器的请求达到1000时服务降级(之后的请求直接进入熔断器)
在这里插入图片描述

ribbon 优化

Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间,这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,很容易就会出现上面所描述的显现。

因此我们可以通过设置:

ribbon:
	eager-load:
    	enabled:true
	clients:service-1,service-2,service-n

在这里插入图片描述

参数说明:

ribbon.eager-load.enabled : 开启Ribbon的饥饿加载模式

ribbon.eager-load.clients: 指定需要饥饿加载的服务名,如果不指定服务名称,饥饿加载模式无效

Zuul的饥饿加载,没有设计专门的参数来配置,而是直接采用了读取路由配置来进行饥饿加载。所以,如果我们使用默认路由,而没有通过配置的方式指定具体路由规则,那么 zuul.ribbon.eager-load.enabled=true 的配置就没有什么作用了。

如果需要真正启用Zuul 的饥饿加载,需要通过zuul.ignored-services=*来忽略所有的默认路由,让所有路由配置均维护在配置文件中,以达到网关启动的时候就加载好各个路由的负载均衡对象。

关于Zuul 的默认路由,这里详细介绍一下。假设你的注册服务中心有三个已经注册的服务名称service-a,service-b,service-c。但是在zuul配置文件中,只映射了service-a,service-b,如下:

zuul:
  ribbon:
    eager-load:
      enabled: true 
  ignored-services:*’
  routes:
    a:
      path: /a/**
      serviceId: service-a
    b:
     path: /b/**
     serviceId: service-b

这里,虽然没有配置service-c的映射,但是,由于zuul有默认的映射机制,还是可以通过http://ip:port/service-c/的Url,访问到你的service-c服务,如果不想向外界暴露默认的服务映射,可以加上 zuul.ignored-services:*

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

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

相关文章

《水经注地图服务》地图服务与通用设置说明

&#xff08;本文首发于“水经注GIS”公号&#xff0c;关注公号免费领取地图数据&#xff09; 《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基…

在 Linux 中如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?

在现代网络应用中&#xff0c;负载均衡是提高性能和可靠性的关键因素之一。通过将请求分发到多个服务器上&#xff0c;负载均衡可以确保请求被合理地处理&#xff0c;并避免单点故障。 在 Linux 环境下&#xff0c;常用的负载均衡解决方案包括 HAProxy、Nginx 和 Keepalived。…

Vue3全家桶之数据管理

我们都知道Vue框架是通过数据驱动的&#xff0c;所以数据的重要性不言而喻&#xff0c;那么有哪些数据需要管理又是如何进行管理的呢&#xff1f;本节我们就来聊一聊Vue3中的数据管理。 哪些数据需要管理&#xff1f; 在我们的前端项目中&#xff0c;都会有哪些数据呢&#x…

Imagination推出IMG CXM最小GPU,为家庭娱乐带来无比便捷的用户界面

全新IMG CXM GPU核兼容RISC-V并原生支持全HDR&#xff0c;帮助数字电视及整个消费市场降低成本 中国北京 - 2023年5月23日 - Imagination Technologies推出全新IMG CXM GPU系列为对成本敏感的消费级设备带来无缝的视觉体验。该系列包含原生支持全HDR用户界面的最小GPU。 IMG CX…

全面撤出印度市场,郭台铭终于明白了到底谁成就了富士康

郭台铭创立的富士康迅速发展成为全球最大的代工厂&#xff0c;它也因此成为制造业中的标杆&#xff0c;巨大的成绩让郭台铭开始有点飘飘然&#xff0c;以为富士康的成就完全是他的努力&#xff0c;然而随着手机组装业在印度遭受的挫折&#xff0c;郭台铭或许终于清醒认识到富士…

图的拓扑排序AOV网,有向无环图DAG描述表达式,关键路径AOE网。

一&#xff0c;有向无环图DAG描述表达式 1.DAG 若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;记为DAG。 2.用二叉树描述表达式 3.用DAG描述表达式 用二叉树描述表达式有缺点&#xff0c;有些结点大可不必存储&#xff0c;可以共用。 step1:把各个操作数…

【网络编程】| 搭建控制台通信demo

目录 &#x1f981;TCP通信实现原理&#x1f981;TCP单向通信创建服务端创建客户端 &#x1f981;TCP双向通信创建服务端创建客户端 &#x1f981;创建点对点的聊天应用创建发送消息线程和接收消息线程创建服务端创建客户端 &#x1f981;优化点对点聊天应用 &#x1f981;TCP通…

既然有了IP地址,为什么还需要MAC地址?两者到底有啥区别,深入分析后终于明白了!

在计算机网络中&#xff0c;IP地址和MAC地址是两个最基本的概念。IP地址在互联网中是用于标识主机的逻辑地址&#xff0c;而MAC地址则是用于标识网卡的物理地址。虽然它们都是用于标识一个设备的地址&#xff0c;但是它们的作用和使用场景是不同的。 IP地址是在网络层&#xff…

Windows下安装搭建MQTT服务器

服务器常用的有emqx,还有apache apolle&#xff0c;这里用的是emqx 服务端以及客户端可以使用MQTTnet&#xff08;NuGet包&#xff09; 一、MQTT服务器&#xff08; emqx &#xff09;搭建 1. 下载服务器MQTT Broker 从 https://www.emqx.io/cn/mqtt/public-mqtt5-broker下载…

Wi-Fi 6为啥那么快?

Wi-Fi 6&#xff08;802.11ax&#xff09;是当前最新的无线局域网标准&#xff0c;它带来了许多重要的改进和性能提升。本文将详细介绍Wi-Fi 6的速度和性能&#xff0c;以及与前一代标准相比的差异。 Wi-Fi 6的速度提升 相比于前一代标准&#xff08;Wi-Fi 5或802.11ac&#x…

fNIRS最新研究 | 脑间和脑内耦合对运动同步的差异贡献

导读 人类大脑支持行为的一个基本特征是它在脑区之间建立连接的能力。一种有前景的方法认为&#xff0c;在社交行为中&#xff0c;大脑区域不仅与大脑内的其他脑区建立连接&#xff0c;而且还与互动伙伴的其他脑区协调活动。本文探索脑间和脑内耦合是否对运动同步有不同的贡献…

设计模式之【责任链模式】,路铺好了,你走不走?

文章目录 一、什么是责任链模式1、状态模式与责任链模式的区别2、责任链模式使用场景3、责任链模式的优缺点4、责任链模式的角色 二、实例1、责任链模式的一般写法&#xff08;1&#xff09;一般写法&#xff08;2&#xff09;一般写法-使用建造者模式进阶&#xff08;3&#x…

nacos配置加载顺序

spring boot 调整日志打印情况 logging:level:com:alibaba:cloud: debug # nacos: debugorg:springframework:context: debugcloud: debug # boot: debug 项目启动时打印了 properties search order:PROPERTIES->JVM->ENV->DEFAULT_SETTING 查看具体代…

股票配资交易系统【实盘】

股票配资系统建设&#xff0c;本文档主要针对实盘股票配资系统。 股票配资交易系统主要包含三部分&#xff1a;App客户端、交易程序服务端、管理后台 App客户端 app客户端是原生应用&#xff0c;非H5生成。客户端主要功能是承接用户的股票订单委托、查询、用户资金转入&#x…

2023.5.12解决Ubuntu中ens33没有ip

在Ubtuntu中的ens33没有ip 如果Ubuntu版本过高 sudo netplan apply如果是Ubuntu 16.04及更早版本 sudo vi /etc/systemd/resolved.conf具体情况如下图所示 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopbac…

java版企业工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

iVX和其它低代码的平台的区别,“低代码/无代码”分三类

前言 这个图非常认真地对整个“低代码”领域做了严格的分类&#xff0c;这个里面并没有把只针对工作流或单纯BI的工具产品划分进去&#xff0c;主要是这一类&#xff0c;在我个人理解里面更像“SaaS”&#xff0c;也就是增强版SaaS产品&#xff0c;这类产品也主要是给业务人员使…

SpringCloud学习-实用篇04

以下内容的代码可见&#xff1a;SpringCloud_learn/day04 1.初始MQ 同步通讯和异步通讯 微服务间通讯有同步和异步两种方式&#xff0c;同步通讯就像打电话需要实时响应&#xff0c;异步通讯就像发邮件不需要马上回复。两种方式各有优劣&#xff0c;比如打电话能立即得到响应&a…

STM8使用pwm接口调试GDS06灰尘传感器

背景 刚好有项目使用GDS06这款传感器&#xff0c;这里简单做个记录。 GDS06接口如下&#xff0c;这里支持串口和PWM的输出到MCU&#xff0c;由于项目采用STM8S003F3P6&#xff0c;资源极其有限。 所以硬件设计的时候&#xff0c;就考虑采用PWM的接口方式&#xff0c;这样只是…

安科瑞有源电力滤波器的设计原理及应用前景

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;该文介绍了有源电力滤波器的工作原理和基本控制方法&#xff0c;并阐述有源电力滤波器的现状及发展前景等等。 关键词&#xff1a;有源电力滤波器&#xff1b;谐波&#xff1b;工作原理&#xff1b;…