spring cloud zuul 与 sentinel的结合使用操作

spring cloud zuul 与 sentinel结合

本来大型服务处理请求超时,限流,降级熔断工作用hystrix,但是这个这个项目不再更新了,虽说它现在提供的版本不会影响到大多数开发者的使用,但是长远考虑,被更换是一件必然的事,而且现在像resilience4j, Sentinel这样的替代品出现,今天我们就看看使用zuul 与 Sentinel整合,实现降级与超时处理,其实网上有很多这样的教程,这里我只是做一个自己的笔记而已

1、必须的依赖

        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>        </dependency>        <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>            <version>1.7.1</version>        </dependency>

2、配置文件,其实Sentinel在这里没什么配置

server:  port: 6001spring:  application:    name: e-zuuleureka:  instance:    hostname: localhost    lease-expiration-duration-in-seconds: 90 #表示服务端多长时间没有接受到心跳信息后可以删除自己    lease-renewal-interval-in-seconds: 30 #表示需要要向服务端发送信息,表示自己还活着    ip-address: true  client:    healthcheck:      enabled: true #客户端心跳检测    service-url:      defaultZone: http://${eureka.instance.hostname}:3001/eureka/zuul:  add-proxy-headers: true  LogFilter:    pre:      disable=true:  routes:    e-email:      serviceId: e-email      path: /email/**    e-user:      serviceId: e-user      path: /user/**

3、配置类, 其实配置类和后边的降级回调处理类才是关键

而且配置类中几个关于zuul与Sentinel的过滤器非常关键,这里要是不提供它们,将无法实现我们想要的功能,还有就是网关规则,可以选择qps, 超时,线程等,setGrade(RuleConstant.DEGRADE_GRADE_RT)提供选择不同的策略

package com.mjlf.ezuul.config;import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.ZuulBlockFallbackManager;import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulErrorFilter;import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPostFilter;import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPreFilter;import com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;import com.netflix.zuul.ZuulFilter;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;import java.util.HashSet;import java.util.Set;@Configurationpublic class ZuulConfig {    @Bean    public ZuulFilter sentinelZuulPreFilter() {        // We can also provider the filter order in the constructor.        return new SentinelZuulPreFilter();    }    @Bean    public ZuulFilter sentinelZuulPostFilter() {        return new SentinelZuulPostFilter();    }    @Bean    public ZuulFilter sentinelZuulErrorFilter() {        return new SentinelZuulErrorFilter();    }    @PostConstruct    public void doInit() {        // 注册 FallbackProvider        ZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider());        initGatewayRules();    }    /**     * 配置限流规则     */    private void initGatewayRules() {        Set<GatewayFlowRule> rules = new HashSet<>();        rules.add(new GatewayFlowRule("e-user").setCount(3) // 限流阈值                .setIntervalSec(1) // 统计时间窗口,单位是秒,默认是 1 秒        );        rules.add(new GatewayFlowRule("e-user")                .setGrade(RuleConstant.DEGRADE_GRADE_RT)//设置超时类型规则                .setMaxQueueingTimeoutMs(500)        );        GatewayRuleManager.loadRules(rules);    }}

4、回调处理类,当有请求被拦截到后,就会调用降级回调方法

// 自定义 FallbackProvider@Componentpublic class MyBlockFallbackProvider implements ZuulBlockFallbackProvider {    private Logger logger = LoggerFactory.getLogger(DefaultBlockFallbackProvider.class);    // you can define route as service level     @Override    public String getRoute() {        return "*";    }    @Override    public BlockResponse fallbackResponse(String route, Throwable cause) {        RecordLog.info(String.format("[Sentinel DefaultBlockFallbackProvider] Run fallback route: %s", route));        if (cause instanceof BlockException) {            return new BlockResponse(429, "Sentinel block exception", route);        } else {            return new BlockResponse(500, "System Error", route);        }    }}

zuul集成Sentinel最新的网关流控组件一、说明

Sentinel 网关流控支持针对不同的路由和自定义的 API 分组进行流控,支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控。

Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置。

二、功能接入

1. 网关添加sentinel相关的jar依赖

<dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency>    <groupId>com.alibaba.csp</groupId>    <artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency>

2. 网关zuul的sentinel配置

spring:  # sentinel动态配置规则  cloud:    sentinel:      zuul:        enabled: true        order:          pre: 2000          post: 500          error: -100      filter:        enabled: false      datasource:        # 限流        ds1:          nacos:            server-addr: ${zlt.nacos.server-addr}            dataId: ${spring.application.name}-sentinel-gw-flow            groupId: DEFAULT_GROUP            rule-type: gw-flow        # api分组        ds2:          nacos:            server-addr: ${zlt.nacos.server-addr}            dataId: ${spring.application.name}-sentinel-gw-api-group            groupId: DEFAULT_GROUP            rule-type: gw-api-group

绑定gw-flow(限流)和gw-api-group(api分组)的规则数据源为nacos并指定nacos上对应的dataId和groupId

3. nacos规则配置

3.1. 限流配置gw-flow

Data ID:api-gateway-sentinel-gw-flow

Group:DEFAULT_GROUP

配置内容:

[  {    "resource": "user",    "count": 0,    "paramItem": {      "parseStrategy": 3,      "fieldName": "name"    }  },  {    "resource": "uaa_api",    "count": 0  }]

规则1:所有user的请求只要参数带有name的都拦截(qps=0),user为zuul路由配置上的routeId规则2:api分组为uaa_api的所有请求都拦截(qps=0)

3.2. api分组配置gw-api-group

Data ID:api-gateway-sentinel-gw-api-group

Group:DEFAULT_GROUP

配置内容:

[  {    "apiName": "uaa_api",    "predicateItems": [      {        "pattern": "/user/login"      },      {        "pattern": "/api-uaa/oauth/**",        "matchStrategy": 1      }    ]  }]

上面配置意思为满足规则的api都统一分组为uaa_api分组规则1:精准匹配/user/login分组规则2:前缀匹配/api-uaa/oauth/**

4. 网关zuul启动参数

需要在接入端原有启动参数的基础上添加-Dcsp.sentinel.app.type=1启动以将您的服务标记为 API Gateway,在接入控制台时您的服务会自动注册为网关类型,然后您即可在控制台配置网关规则和 API 分组,例如:

java -Dcsp.sentinel.app.type=1 -jar zuul-gateway.jar

三、sentinel控制台管理

API管理(分组)

网关流控规则

四、测试限流api

1. 测试限流规则1

所有user的请求只要参数带有name的都拦截(qps=0)

不加name参数,可以访问api

后面加上name参数,请求被拦截

2. 测试限流规则2

api分组为uaa_api的所有请求都拦截(qps=0)

前缀匹配/api-uaa/oauth/**

精准匹配/user/login

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

有时我们选择改变,并非经过深思熟虑,

spring cloud zuul 与 sentinel的结合使用操作

相关文章:

你感兴趣的文章:

标签云: