设为首页 加入收藏

TOP

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战(四)
2019-09-14 00:53:56 】 浏览:126
Tags:Spring Cloud Alibaba Sentinel 分布式 系统 流量 卫兵 进阶 实战
cloud-high/consumer_fallback/src/main/java/com/springcloud/consumer_fallback/ConsumerFallbackApplication.java
***

@Bean
@LoadBalanced
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {
    return new RestTemplate();
}

这里需要注意,@SentinelRestTemplate注解的属性支持限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)的处理。

其中blockHandlerfallback属性对应的方法必须是对应blockHandlerClassfallbackClass属性中的静态方法。

@SentinelRestTemplate注解的限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)属性不强制填写。

当使用RestTemplate调用被Sentinel熔断后,会返回RestTemplate request block by sentinel信息,或者也可以编写对应的方法自行处理返回信息。这里提供了 SentinelClientHttpResponse用于构造返回信息。

2.2 测试

顺次启动provider_server和consumer_fallback两个子工程。先在浏览器中交替访问http://localhost:9090/helloByFeign 和 http://localhost:9090/helloByRestTemplate ,而后打开Sentinel控制台,在这两个接口上增加限流信息,注意,这里要将限流信息加在资源上,具体如图:

在浏览器中刷新两个链接,两个限流信息都可以正常浏览器中显示,测试成功,再次查看Sentinel控制台,也可以看到被拒接的流量统计,如图:

3. Sentinel整合服务网关限流

Sentinel目前支持Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。看一下官方的结构图,如图:

从这张官方的图中,可以看到,Sentinel对Zuul的限流主要是通过3个Filter来完成的,对Spring Cloud Gateway则是通过一个SentinleGatewayFilter和一个BlockRequestHandler来完成的。

Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:

  • GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
  • ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。

3.1 Zuul 1.x

Sentinel 提供了 Zuul 1.x 的适配模块,可以为 Zuul Gateway 提供两种资源维度的限流:

  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 route ID(对应 RequestContext 中的 proxy 字段)
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

3.1.1 创建子工程zuul_server

工程依赖pom.xml如下:

代码清单:Alibaba/sentinel-springcloud-high/zuul_server/pom.xml
***

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-zuul-adapter</artifactId>
</dependency>

这里因为sentinel-zuul-adapter未包含在spring-cloud-starter-alibaba-sentinel,需要手动单独引入。

3.1.2 配置文件application.yml如下:

代码清单:Alibaba/sentinel-springcloud-high/zuul_server/src/main/resources/application.yml
***

server:
  port: 18080
spring:
  application:
    name: spring-cloud-zuul-server
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.44.129:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8720
zuul:
  routes:
    consumer-route:
      path: /consumer/**
      serviceId: spring-cloud-consumer-fallback

3.1.3 定义降级处理类ZuulFallbackProvider.java如下:

代码清单:Alibaba/sentinel-springcloud-high/zuul_server/src/main/java/com/springcloud/zuul_server/fallback/ZuulFallbackProvider.java
***

public class ZuulFallbackProvider implements ZuulBlockFallbackProvider {
    @Override
    public String getRoute() {
        return "*";
    }

    @Override
    public BlockResponse fallbackResponse(String route, Throwable cause) {
        RecordLog.info(String.format("[Sentinel DefaultBlockFallbackProvider] Run fallb
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2019最新版Java零基础入门视频教.. 下一篇多线程编程学习九(并发工具类).

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目