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

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

org.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.cloudspring-cloud-starter-netflix-zuulcom.alibaba.cspsentinel-zuul-adapter1.7.1

2、配置文件,其实Sentinel在这里没什么配置
server:port: 6001spring:application:name: e-zuuleureka:instance:hostname: localhostlease-expiration-duration-in-seconds: 90 #表示服务端多长时间没有接受到心跳信息后可以删除自己lease-renewal-interval-in-seconds: 30 #表示需要要向服务端发送信息,表示自己还活着ip-address: trueclient:healthcheck:enabled: true #客户端心跳检测service-url:defaultZone: http://${eureka.instance.hostname}:3001/eureka/zuul:add-proxy-headers: trueLogFilter:pre:disable=true:routes:e-email:serviceId: e-emailpath: /email/**e-user:serviceId: e-userpath: /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 {@Beanpublic ZuulFilter sentinelZuulPreFilter() {// We can also provider the filter order in the constructor.return new SentinelZuulPreFilter(); }@Beanpublic ZuulFilter sentinelZuulPostFilter() {return new SentinelZuulPostFilter(); }@Beanpublic ZuulFilter sentinelZuulErrorFilter() {return new SentinelZuulErrorFilter(); }@PostConstructpublic void doInit() {// 注册 FallbackProviderZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider()); initGatewayRules(); }/*** 配置限流规则*/private void initGatewayRules() {Set 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 @Overridepublic String getRoute() {return "*"; }@Overridepublic 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最新的网关流控组件 一、说明
【spring|spring cloud zuul 与 sentinel的结合使用操作】Sentinel 网关流控支持针对不同的路由和自定义的 API 分组进行流控,支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控。
Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置。
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

二、功能接入
1. 网关添加sentinel相关的jar依赖
com.alibaba.cloudspring-cloud-starter-alibaba-sentinelcom.alibaba.cspsentinel-datasource-nacoscom.alibaba.cloudspring-cloud-alibaba-sentinel-gateway

2. 网关zuul的sentinel配置
spring:# sentinel动态配置规则cloud:sentinel:zuul:enabled: trueorder:pre: 2000post: 500error: -100filter:enabled: falsedatasource:# 限流ds1:nacos:server-addr: ${zlt.nacos.server-addr}dataId: ${spring.application.name}-sentinel-gw-flowgroupId: DEFAULT_GROUPrule-type: gw-flow# api分组ds2:nacos:server-addr: ${zlt.nacos.server-addr}dataId: ${spring.application.name}-sentinel-gw-api-groupgroupId: DEFAULT_GROUPrule-type: gw-api-group

绑定gw-flow(限流)和gw-api-group(api分组)的规则数据源为nacos
并指定nacos上对应的dataId和groupId
3. nacos规则配置
3.1. 限流配置gw-flow
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

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
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

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管理(分组)
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

网关流控规则
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

四、测试限流api
1. 测试限流规则1
所有user的请求只要参数带有name的都拦截(qps=0)
不加name参数,可以访问api
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

后面加上name参数,请求被拦截
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

2. 测试限流规则2
api分组为uaa_api的所有请求都拦截(qps=0)
前缀匹配/api-uaa/oauth/**
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

精准匹配/user/login
spring|spring cloud zuul 与 sentinel的结合使用操作
文章图片

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

    推荐阅读