环境
spring cloud 版本 Camden.SR7
开启Hystrix
背景
当通过hystrix.threadpool.default.coreSize设置核心线程数量时 创建线程池时核心线程数和最大线程数都使用的它
当执行feign逻辑时 会判断当前线程数是否小于最大线程数 所以每次都会新建一个线程来执行网络请求
当请求执行完毕以后由于当前线程数不大于核心线程数(永远满足不了)所以不会退出死循环 而是从队列中获取请求 没有的话将阻塞
如果coreSize设置的过大 通过feign调用的服务过的 且每个服务调用的次数足够多 将导致wating线程数很大
当核心线程数设置为200 5个服务持续调用 当调用1000次后线程总数将达到1000 每个服务200线程 如果并发底的话 可能只有几个线程在工作 其他线程都在睡觉
解决方式
方式一
获取进程hystrix线程的waiting和running的比列 根据比列来设置线程池的参数
获取hystrix线程数量可以通过shell命令或java代码
shell命令:通过jstack -l ${pid} >> thread.dump 获取dump文件
通过grep分析 如cat hystrix.dump|grep hystrix-[|wc -l] 通过网站分析 https://www.fastthread.io
通过反射获取threadPool修改核心线程数和最大线程数与允许最大空闲时间
####方式二:直接把HystrixConcurrencyStrategy换掉由自己来创建线程池
建立相同的包 把代码copy一份想怎么改就这么改
java代码获取hystrix线程池信息 也可以到HystrixCircuitBreaker里面获取
Field field = ReflectionUtils.findField(HystrixThreadPool.Factory.clas