Version: Next

高并发压力测试

使用 Jmeter 进行压力测试

  • 20000 个并发请求,压 provider-hystrix-payment8001payment_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-payment8001Controller 接口
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);
}
}

测试

  • 启动 7001provider-hystrix-payment8001feign-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 自身 必须有 服务降级