Version: Next
高并发压力测试
使用
Jmeter
进行压力测试
20000
个并发请求,压provider-hystrix-payment8001
的payment_TimeOut
接口在 测试计划 下新建一个 线程组
设置
200
个线程,每个线程循环请求100
次,1
秒内完成,共并发20000
次保存线程组配置文件
添加
->Sampler
->HTTP 请求
设置服务器ip、端口、HTTP 请求路径
问题
20000
个并发请求发到带TimeOut
的接口后,不带延迟的ok
接口的响应速度出现了明显下降- 因为:Tomcat 的默认工作线程池被占满了,没有多余的线程来分担压力、处理请求
- 上述测试,只是
provider 8001
自己测试,还没用有客户端consumer-order80
来调用,如果加入客户端,那么客户端程序只能干等着
客户端发起高并发测试
客户端高并发
- 根据上述的问题,新建一个客户端项目,从客户端并发远程调用生产者微服务,使得网络负载情况进一步加大
- 新建
cloud-consumer-feign-hystrix-order80
- 通过
OpenFeign
远程调用provider8001
- 在客户端集成
hystrix
pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
yaml
server:
port: 80
#这里只把feign做客户端用,不注册进eureka
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: false
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/
主启动
@SpringBootApplication
@EnableFeignClients
public class OrderHystrixMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrixMain80.class, args);
}
}
业务类
Service
- 通过
OpenFeign
调用对方Provider-hystrix-payment8001
的Controller
接口
PaymentHystrixService
@FeignClient("CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}
Controller
- 注入
OpenFeign
Service 接口,用来通过OpenFeign
发起远程调用
@RestController
public class PaymentHystrixController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id){
return paymentHystrixService.paymentInfo_OK(id);
}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
return paymentHystrixService.paymentInfo_TimeOut(id);
}
}
测试
- 启动
7001
、provider-hystrix-payment8001
、feign-hystrix-order80
- 访问
localhost:80/consumer/payment/hystrix/ok/2
- 得到响应
线程池:http-nio-8001-exec-4payment_OK, id:2 O(∩_∩)O哈哈~
高并发压力测试
- 使用 JMeter , 20000 个线程压
provider-hystrix-payment8001
的 timeout接口 - 消费者通过
80
远程调用8001
的 ok 接口,响应速度出现下降
需要进行的改进
解决
- 生产者服务
8001
超时 了:消费者调用方80
不能一直卡死等待,必须有 服务降级- 生产者服务
8001
宕机 了:消费者调用方80
不能一直卡死等待,必须有 服务降级- 生产者服务
8001
正常:消费者调用方80
自己出故障或自己有要求(如自身等待时间小于服务提供者响应时间),80
自身 必须有 服务降级