SpringCloud微服務實戰——搭建企業級開發框架(十六):整合Sentinel高可用流量管理框架【自定義返回訊息】

全棧程式猿發表於2021-11-15

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進行測試,我們可以看到返回訊息已經是我們自定義的格式了:
image.png

本文原始碼在https://gitee.com/wmz1930/GitEgg 的chapter-16分支。

相關文章