《微服务实战》 第十二章 Spring Cloud Alibaba Sentinel(下)

简介: 《微服务实战》 第十二章 Spring Cloud Alibaba Sentinel(下)

4、Sentinel与Gateway的整合

4.1、添加依赖

<!--gateway整合sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
    <version>1.8.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.4.0</version>
</dependency>
sentinel:
  transport:
    # 配置Sentinel dashboard地址
    dashboard: localhost:8080
    # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
    port: 8719

4.2、详细配置

接下来对sentinel控制台中对gateway网关链路的流控配置项做详细的介绍,下图所示都是针对网关api附加的。

API类型

我们可以根据某个路由进行流控,也可以根据API分组进行流控,也就是请求访问地址来进行流控

首先创建API分组

选择API分组

然后在进行相应的流控规则。

针对请求属性

参数属性有五种:客户端ip、远程请求地址、请求头、请求url参数、Cookie

这里其实也就是对应的gateway中路由的匹配规则

匹配模式提供了三种:精确、子串、正则

子串匹配模式就是:我们指定127,它会自动再结尾加上%进行模糊匹配——127%

Client IP

测试

Remote Host

因为我们没有远程域名,所以这里就不进行测试了

Header

使用postman请求进行测试,如果请求头不为这个值就不会被限流

URL参数

测试

间隔

这个间隔的意思就是,以前1秒钟请求三次就会抛异常,而现在是两秒内请求三次才会抛异常,也就是说间隔从以前的一秒改变了。

Burst size

Burst size相当于是一个宽容次数,以前是1秒钟请求三次就会报异常,现在会宽容1次,也就是一秒钟请求大于三次才会抛异常

网关流控规则 GatewayFlowRule 的核心属性如下:

① resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。

② resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。

③ grade:限流指标维度,同限流规则的 grade 字段

④ count:限流阈值

⑤ intervalSec:统计时间窗口,单位是秒,默认是 1 秒

⑥ controlBehavior:流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。

⑦ burst:应对突发请求时额外允许的请求数目。

⑧ maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。

⑨ paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:

parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。

fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。

pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。

matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。

降级规则

(resource、grade、count、slowRatioThreshold、timeWindow、minRequestAmount、statIntervalMs)

自定义异常返回结果:

sentinel:  
  scg:
    fallback:
      mode: response
      response-status: 200
      response-body: '{"code":"500","message": "系统忙,请稍候再试"}'

代码实现:

/**
 * 熔断、降级回调
 */
@Configuration
public class SentinelGatewayConfig {
    /**
     * 这里可以写降级逻辑
     */
    public SentinelGatewayConfig() {
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            // 网关限制了请求,就会调用此回调 Mono Flux
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                ResponseDTO<Object> objectResponseDTO = new ResponseDTO<>();
                objectResponseDTO.setCode(500);
                objectResponseDTO.setMessage("系统异常,请稍候重试");
                String errJson = JSON.toJSONString(objectResponseDTO);
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class);
                return body;
            }
        });
    }
}

将路由、限流、降级规则持久化到nacos配置中心

spring:
  application:
    name: drp-gateway-service
  profiles:
    #开发环境dev,测试环境test,生产环境prod
    active: dev
  jackson:
    time-zone: GMT+8
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
    nacos:
      discovery:
        server-addr: localhost:8848  #Nacos server 的地址
      #路由配置
      config:
        server-addr: localhost:8848
        name: gateway-router
        namespace: public
        group: DEFAULT_GROUP
        #file-extension: json #指定yaml格式的配置
        refresh-enabled: true #支持刷新
    #限流熔断配置
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
        port: 8719
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            data-id: user-sentinel
            group-id: DEFAULT_GROUP
            rule-type: flow


目录
相关文章
|
2月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
163 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
28天前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
81 16
|
2月前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
368 13
Spring Cloud Alibaba:一站式微服务解决方案
|
2月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
47 6
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
190 5
|
2月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
78 5
|
2月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
56 5
|
2月前
|
监控 API 开发者
Sentinel:微服务的全能守护
Sentinel 是阿里巴巴开源的一款轻量级流量控制和熔断降级框架。它通过设置流量控制、熔断降级和系统保护规则,确保微服务在高并发场景下稳定运行。Sentinel 提供丰富的功能、实时监控和灵活的集成方式,适用于各种分布式系统。
206 0
|
2月前
|
监控 Java Sentinel
Hystrix 与 Sentinel 大比拼:微服务稳定性工具谁更优?
Hystrix 和 Sentinel 是用于微服务架构中保护服务稳定性和可靠性的工具,主要实现服务熔断、限流、降级等功能。Hystrix 侧重于熔断器模式和服务隔离,通过线程池或信号量隔离服务,防止故障扩散;Sentinel 则更全面,涵盖流量控制、熔断降级和系统自适应保护,适用于高并发场景,并提供实时监控和灵活的策略调整。两者设计理念不同,Hystrix 适合中小规模应用,而 Sentinel 更适合大规模高并发系统。
47 0
|
6月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
117 1