[SpringCloud] 组件性能优化技巧

news/2024/10/22 14:36:37/
  • Feign 配置优化
  • hystrix配置 优化
  • ribbon 优化
  • Servlet 容器 优化
  • Zuul配置 优化

文章目录

      • 1.Servlet 容器 优化
      • 2.Feign 配置优化
      • 3.Zuul配置 优化
      • 4.hystrix配置 优化
      • 5.ribbon 优化

1.Servlet 容器 优化

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

Zuul使用的内置容器默认是Tomcat, 可以将其换成undertow, 可以显著减少线程的数量。


<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>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
server:undertow:io-threads: 16worker-threads: 256buffer-size: 1024buffers-per-region: 1024direct-buffers: true
  1. server.undertow.io-threads: 设置IO线程数, 主要执行非阻塞的任务。
  2. server.undertow.worker-threads: 阻塞任务线程池 。
  3. server.undertow.buffer-size: 类似netty的池化内存管理, buffer的大小, 小的空间被利用更充分。
  4. server.undertow.buffers-per-region: 每个区分配的buffer数量。
  5. server.undertow.direct-buffers: 是否分配的直接内存(NIO直接分配的堆外内存)。

2.Feign 配置优化

feign 默认不启用hystrix, feign.hystrix.enabled=true 开启熔断。

feign 启用压缩也是一种有效的性能优化方式。

feign:compression:request:enabled: truemime-types: text/xml,application/xml,application/jsonresponse:enabled: true

feign HTTP请求方式选择。

feign默认使用的是基于JDK提供的URLConnection调用HTTP接口, 无线程池, Apache HttpClientokhttp都支持配置连接池功能, 也可以使用okhttp请求方式。

HttpClient:

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

okHttp:

feign:okhttp:enabled: truehttpclient:max-connections: 1000max-connections-per-route: 200   
  1. max-connections: 设置整个连接池最大连接数。
  2. max-connections-per-route: 设置路由的默认最大连接。

3.Zuul配置 优化

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

Zuul默认是使用信号量隔离, 信号量数量为100, 请求的并发线程超过100就会报错。

zuul:semaphore:max-semaphores: 5000

为了方便ThreadLocal的使用, 可以改变隔离策略, 需要调大hystrix的线程池大小。

zuul:ribbonIsolationStrategy: THREAD
hystrix:threadpool:default:coreSize: 100maximumSize: 400allowMaximumSizeToDivergeFromCoreSize: truemaxQueueSize: -1
  1. hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize: 是否让maximumSize生效, false为只有coreSize会生效。
  2. hystrix.threadpool.default.maxQueueSize: 线程池的队列大小。
  3. hystrix.threadpool.default.maximumSize: 最大线程数。
  4. zuul.ribbon-isolation-strategy: 线程隔离策略。

4.hystrix配置 优化

需要设置参数hystrix.threadpool.default.coreSize 来指定熔断隔离的线程数, 这个数需要调优。

hystrix:threadpool:default:coreSize: 500command:default:circuitBreaker: requestVolumeThreshold: 1000fallback:enabled: trueexecution:isolation:thread:timeoutInMilliseconds: 100000 
  1. hystrix.command.default: 全局作用域, 作用的所有的hystrix的客户端, 如果需要对某个微服务, 可以写serviceId。
  2. hystrix.command.default.fallback.enabled: 是否开启回退方法。
  3. hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 请求处理的超时时间, 缺省为1000,表示默认的超时时间为1S。
  4. hystrix.threadpool.default.coreSize 核心线程池数量。
  5. hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 回退最大线程数。
  6. hystrix.command.default.circuitBreaker.requestVolumeThreshold: 熔断器失败的个数

5.ribbon 优化

Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的, 而是在调用的时候才会去创建相应的Client, 所有第一次调用的耗时不仅仅包含发送HTTP请求的时间, 还包括了创建RibbonClient的时间。

ribbon:eager-load:enabled:trueclients:service-1,service-2,service-n
  1. ribbon.eager-load.enabled: 开启Ribbon的饥饿模式。
  2. ribbon.eager-load.clients: 指定需要饥饿加载的服务名。

http://www.ppmy.cn/news/1033732.html

相关文章

两只小企鹅(Python实现)

目录 1 和她浪漫的昨天 2 未来的旖旎风景 3 Python完整代码 1 和她浪漫的昨天 是的,春天需要你。经常会有一颗星等着你抬头去看&#xff1b; 和她一起吹晚风吗﹖在春天的柏油路夏日的桥头秋季的公园寒冬的阳台&#xff1b; 这世界不停开花&#xff0c;我想放进你心里一朵&am…

文献综述|NLP领域后门攻击、检测与防御

前言&#xff1a;在信息安全中后门攻击&#xff08;Backdoor Attack&#xff09;是指绕过安全控制而获取对程序或系统访问权的方法。而随着深度学习以及各种神经网络模型的广泛应用&#xff0c;神经网络中存在的后门问题也引起了研究人员的广泛关注。神经网络后门攻击就是使网络…

ReentrantReadWriteLock

关于读写锁状态的存取 // ReentrantReadWriteLock.Sync static final int SHARED_SHIFT 16; static final int SHARED_UNIT (1 << SHARED_SHIFT); static final int MAX_COUNT (1 << SHARED_SHIFT) - 1; static final int EXCLUSIVE_MASK (1 <&l…

MYSQL-习题掌握

文章目录 SQL基本操作1 设计表操作1.1 关系表字段1.2 关系表创建1.3 关系表数据1.4 关系表关系 2 SQL操作2.1 SQL 1-102.2 SQL 11-202.3 SQL 21-302.4 SQL 31-402.5 SQL 41-50 SQL基本操作 1 设计表操作 1.1 关系表字段 1 学生表 student s_ids_names_births_sex学生编号学…

库存管理系统哪个好?亿发云南省大型智能WMS仓储信息解决方案,免费更新

在当今激烈的仓储物流竞争中&#xff0c;企业的成功关键在于加强作业效率和降低话费。随着科技的不断更新&#xff0c;传统仓储方式已逐渐被智能仓储管理系统&#xff08;WMS&#xff09;取代&#xff0c;并逐渐成为行业趋势。大数据时代下&#xff0c;引进行之有效的智能管理系…

轻薄的ESL电子标签有哪些特性?

在智慧物联逐渐走进千万家的当下&#xff0c;技术变革更加日新月异。ESL电子标签作为科技物联的重要组成部分&#xff0c;是推动千行百业数字化转型的重要技术&#xff0c;促进物联网产业的蓬勃发展。在智慧零售、智慧办公、智慧仓储等领域&#xff0c;ESL电子标签在未来是不可…

TypeScript教程(四)基本运算符

一、运算符 TypeScript包含以下几种运算符&#xff1a; 1.算术运算符 2.逻辑运算符 3.关系运算符 4.按位运算符 5.赋值运算符 6.三元/条件运算符 7.字符串运算符 8.类型运算符 1.算术运算符 y5 运算符描述例子x 运算结果y 运算结果加法xy275-减法xy-235*乘法xy*2105…

el-table分页后序号连续的两种方法

实现效果&#xff1a; 第一页排序到10&#xff0c;第二页的排序应从11开始 实现方法一&#xff1a; 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…