sentinel整合openfeign
前置条件
- 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 配置yml
feign:
sentinel:
enabled: true
实践
- 改造接口
配置fallback参数
@FeignClient(value = "cloud-provider-payment", fallback = PaymentFallbackService.class)
public interface CloudProviderPaymentFeignService {
@GetMapping("hello")
String hello();
@GetMapping("chain3")
String chain3();
}
- 实现接口
@Component
public class PaymentFallbackService implements CloudProviderPaymentFeignService {
@Override
public String hello() {
return "我是整合openFeign后的异常处理";
}
@Override
public String chain3() {
return null;
}
}
-
测试
正常情况
cloud provider payment 9001服务宕机。可以发现自动调用了fallback里面的实现类对应的方法。
总结
- 简单
sentinel整合gateway
前置条件
若想跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway
依赖,同时需要添加 spring-cloud-starter-gateway
依赖来让 spring-cloud-alibaba-sentinel-gateway
模块里的 Spring Cloud Gateway 自动化配置类生效:
-
依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
配置yml
server: port: 2001 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true routes: - id: after_route uri: lb://cloud-consumer-feign predicates: - Path=/api/** - After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai] // 核心 sentinel: filter: enabled: false transport: dashboard: localhost:8080 port: 8719 // nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: "*"
-
请求一次
- 回到页面
实践
流控
-
简单演示
-
从请求链路里面添加流控规则并填写参数
-
测试
-
-
参数解释
API分组
:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫my_api
,请求 path 模式为/foo/**
和/baz/**
的都归到my_api
这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。其中网关限流规则
GatewayFlowRule
的字段解释如下:
API名称
:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。
间隔
:统计时间窗口,单位是秒,默认是 1 秒。
流控方式
:流量整形的控制效果,同限流规则的controlBehavior
字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
burst
:应对突发请求时额外允许的请求数目。
maxQueueingTimeoutMs
:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
针对请求属性
:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:
参数属性
:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP
)、Host(PARAM_PARSE_STRATEGY_HOST
)、任意 Header(PARAM_PARSE_STRATEGY_HEADER
)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM
)四种模式。
匹配模式
:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT
)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS
)和正则匹配(PARAM_MATCH_STRATEGY_REGEX
)。(1.6.2 版本开始支持)用户可以通过
GatewayRuleManager.loadRules(rules)
手动加载网关规则,或通过GatewayRuleManager.register2Property(property)
注册动态规则源动态推送(推荐方式)。
-
针对请求属性演示
这里就对header进行演示,其他的大家以此类推即可。
-
流控配置如下
-
测试
无header
有header
-
-
API分组限流演示
-
代码
这里我们定义了两个分组 some_customized_api和another_customized_api
@Configuration public class ApiGroupConfig { @PostConstruct public void doInit() { initCustomizedApis(); } private void initCustomizedApis() { Set<ApiDefinition> definitions = new HashSet<>(); // ApiDefinition api1 = new ApiDefinition("some_customized_api") .setPredicateItems(new HashSet<ApiPredicateItem>() {{ add(new ApiPathPredicateItem().setPattern("/product/baz")); add(new ApiPathPredicateItem().setPattern("/product/foo/**") .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX)); }}); // ApiDefinition api2 = new ApiDefinition("another_customized_api") .setPredicateItems(new HashSet<ApiPredicateItem>() {{ add(new ApiPathPredicateItem().setPattern("/ahas")); }}); definitions.add(api1); definitions.add(api2); GatewayApiDefinitionManager.loadApiDefinitions(definitions); } }
-
重启项目打开dashboard
-
再流控页面则可以按照分组来进行配置
-
- 整合gateway其实就是网关级别得流控