请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

张老师你好,我在springcloud gateway中设置resttemplate流控不生效

RestTemplate的配置代码与你得代码一致

@Configuration
public class GatewayBeanConf {

    @Bean
    @SentinelRestTemplate(
            blockHandlerClass = RestTemplateSentinelHandler.class, blockHandler = "handleBlock"
            ,fallbackClass = RestTemplateSentinelHandler.class, fallback = "handleFallback"
    )
    public RestTemplate restTemplate() {
        // 使用factory对RestTemplate可以对其做一些业务相关的配置
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        // 建立连接超时时间 单位ms
        factory.setConnectTimeout(15 * 1000);
        // 传递数据的超时时间 单位ms
        factory.setReadTimeout(5000);
        RestTemplate restTemplate =  new RestTemplate(factory);
        return restTemplate;
    }
}
public class RestTemplateSentinelHandler {

    /**
     * 处理RestTemplate发送请求,因为限流原因抛出的BlockingException异常
     * @param request // 请求信息
     * @param body // 请求的参数信息
     * @param requestExecution // 请求的链路信息
     * @param exception // Sentinel限流触发后抛出的异常
     * @return
     */
    public static SentinelClientHttpResponse handleBlock(
            HttpRequest request,
            byte[] body,
            ClientHttpRequestExecution requestExecution,
            BlockException exception
    ) {

        log.info("handle RestTemplate block exception, [{}] [{}]"
                , request.getURI().getPath(), exception.getClass().getCanonicalName());
            return new SentinelClientHttpResponse(
                JSON.toJSONString(
                        new CommonResponse<String>(
                                -1,
                                "trigger RestTemplate handler block exception"
                                , request.getURI().getPath()
                        )
                )
        );
    }

    /**
     * 异常降级之后的处理方法
     * @param request
     * @param body
     * @param requestExecution
     * @param exception
     * @return
     */
    public static SentinelClientHttpResponse handleFallback(
            HttpRequest request,
            byte[] body,
            ClientHttpRequestExecution requestExecution,
            BlockException exception
    ) {

        log.info("handle RestTemplate fallback exception, [{}] [{}]"
                , request.getURI().getPath(), exception.getClass().getCanonicalName());
            return new SentinelClientHttpResponse(
                JSON.toJSONString(
                        new CommonResponse<String>(
                                -1,
                                "trigger RestTemplate handler fallback exception"
                                , request.getURI().getPath()
                        )
                )
        );
    }
}

在nacos的配置gateway-flow-rule-sentinel中,进行了以下的配置:

[
  {
    "resource": "health-cloud-sentinel",
    "resourceMode": 0,
    "count": 3,
    "intervalSec": 10
  },
  {
    "resource": "POST:http://10.10.102.134:7000/health-cloud-authority-center/authority/token",
    "resourceMode": 0,
    "count": 1,
    "intervalSec": 60
  },
  {
    "resource": "sentinel-client-api",
    "resourceMode": 1,
    "count": 5,
    "intervalSec": 10
  },
  {
    "resource": "health-cloud-cookbook-api",
    "resourceMode": 1,
    "count": 1,
    "intervalSec": 50
  }
]

在sentinel dashboard中配置也已经自动同步,如下图所示:

图片描述
张老师给看一下,基于上述的配置,为什么RestTemplate的没有触发handlerBlock

正在回答 回答被采纳积分+3

1回答

张勤一 2022-08-17 10:40:50

同学你好:

    这种问题就好好的检查下配置吧,这里面我们的代码仅仅是兜底,用于控制限流的实际使用的是 Sentinel,所以,只有配置正确了才会生效。

1 回复 有任何疑惑可以回复我~
  • 提问者 itxingqing #1
    nacos中已经配置了限流策略,那应该走这个兜底代码吧,张老师
    回复 有任何疑惑可以回复我~ 2022-08-17 10:58:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信