壓測和提高QPS
壓測和提高QPS
1.對項目的所有接口響應時間進行監控(使用攔截器,依賴swagger3增強版),將接口的響應時間統一控制在500毫秒內完成
(1)swagger3增強版
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
**
* @author Yubo Huang
* @date Created in 2024/11/10 10:05 上午
* @description 文檔配置
*/
@Configuration
public class Knife4jConfig {
@Bean
public OpenAPI springShopOpenApi() {
return new OpenAPI()
// 接口文檔標題
.info(
new Info().title("接口文檔")
// 接口文檔簡介
.description("Knife4j OpenApi3的接口文檔")
// 接口文檔版本
.version("v1.0")
// 開發者聯系方式
.contact(new Contact().name("").email(""))
);
}
}
(2)攔截器
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import java.lang.reflect.Method; /** * @author Yubo Huang * @date Created in 2024/11/10 9:17 上午 * @description 響應時間 */ @Slf4j @Component public class ResTimeInterceptor implements HandlerInterceptor { private static final Long MAX_RES_TIME = 500L; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long resTime = endTime - startTime; if (resTime < MAX_RES_TIME) { return; } if (handler instanceof HandlerMethod handlerMethod) { //controller Class<?> beanType = handlerMethod.getBeanType(); //api Method method = handlerMethod.getMethod(); //info Tag tag = beanType.getAnnotation(Tag.class); String name = tag.name(); Operation operation = method.getAnnotation(Operation.class); String summary = operation.summary(); //log String queryString = request.getQueryString(); log.warn("{} -> {} -> {} -> resTime:{} -> param:{}", name, summary, request.getRequestURI(), resTime, queryString); } } }
(3).添加攔截器
import com.yb.interceptor.ResTimeInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @author Yubo Huang * @date Created in 2024/11/10 10:19 上午 * @description web配置 */ @Configuration @RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { private final ResTimeInterceptor resTimeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(resTimeInterceptor); } }
2.獨立的服務器或者虛擬機下進行(限制cpu和內存)
3.新寫一個接口,接口中使用sleep休眠300毫秒(對該接口進行壓測)
4.單個節點的項目調整(最大線程數和最大等待數),通過jmeter壓測到最大qps
5.這就是服務器下該節點的最大QPS,根據需求增加服務器和項目節點就可以了
6.當多個節點的QPS到達了需求,接下來還要考慮nginx的QPS和mysql的TPS,共同來支撐需求對應的QPS
網絡的上行和下行是否影響QPS

浙公網安備 33010602011771號