Sentinel限流之後,預設的響應訊息為Blocked by Sentinel (flow limiting),對於系統整體功能提示來說並不統一,參考我們前面設定的統一響應及異常處理方式,返回相同的格式的訊息。
1、在自定義Sentinel返回訊息之前,需要調整一下程式碼結構,因為這裡要用到統一返回異常的格式,考慮到後期可能的使用問題,這裡需要把gitegg-platform-boot工程裡定義的統一響應及異常移到新建的gitegg-platform-base通用定義工程裡面,同時在gitegg-platform-cloud中引入gitegg-platform-base和spring-boot-starter-web
<!-- 為了使用HttpServletRequest和HttpServletResponse -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<optional>true</optional>
</dependency>
<dependency>
<groupid>com.gitegg.platform</groupid>
<artifactid>gitegg-platform-base</artifactid>
</dependency>
2、在GitEgg-Platform子工程gitegg-platform-cloud中自定義Sentinel錯誤處理類GitEggBlockExceptionHandler.java:
package com.gitegg.platform.cloud.sentinel.handler;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gitegg.platform.base.enums.ResultCodeEnum;
import com.gitegg.platform.base.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定義異常處理器
*/
@Slf4j
@Component
public class GitEggBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
response.setStatus(429);
response.setContentType("application/json;charset=utf-8");
Result result = Result.error(ResultCodeEnum.SYSTEM_BUSY, ResultCodeEnum.SYSTEM_BUSY.getMsg());
new ObjectMapper().writeValue(response.getWriter(), result);
}
}
3、配置Sentinel控制檯,配置容易出現限流的規則,開啟Jmeter進行測試,我們可以看到返回訊息已經是我們自定義的格式了:
本文原始碼在https://gitee.com/wmz1930/GitEgg 的chapter-16分支。