美文网首页SpringCloud
SpringCloud微服务实战——搭建企业级开发框架(十六):

SpringCloud微服务实战——搭建企业级开发框架(十六):

作者: 全栈程序猿 | 来源:发表于2020-11-16 09:05 被阅读0次

    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分支。

    GitEgg-Cloud是一款基于SpringCloud整合搭建的企业级微服务应用开发框架,开源项目地址:

    Gitee: https://gitee.com/wmz1930/GitEgg
    GitHub: https://github.com/wmz1930/GitEgg

    欢迎感兴趣的小伙伴Star支持一下。

    相关文章

      网友评论

        本文标题:SpringCloud微服务实战——搭建企业级开发框架(十六):

        本文链接:https://www.haomeiwen.com/subject/nrrrsktx.html