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

网友投稿 358 2022-10-17


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

spring cloud zuul 与 sentinel结合

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

1、必须的依赖

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.cloud

spring-cloud-starter-netflix-zuul

com.alibaba.csp

<artifactId>sentinel-zuul-adapter

1.7.1

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

server:

port: 6001

spring:

application:

name: e-zuul

eureka:

instance:

hostname: localhost

lease-expiration-duration-in-seconds: 90 #表示服务端多长时间没有接受到心跳信http://息后可以删除自己

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;

@Configuration

public 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 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

@Component

public 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依赖

com.alibaba.cloud

spring-cloud-starter-alibaba-sentinel

com.alibaba.csp

sentinel-datasource-nacos

com.alibaba.cloud

spring-cloud-alibaba-sentinel-gateway

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:刚性通道时代——PDH
下一篇:传送网基础知识
相关文章

 发表评论

暂时没有评论,来抢沙发吧~