Spring Cloud Gateway 通过注解配置

GatewayConfig

其实这种配置方式就是通过代码的方式进行配置,也就是通过@Bean注入一个RouteLocator

那我们直接来操作一下

具体操作

首先我们在新建一个GateWayConfig,其实这里的配置对应的就是我们之前在YML中配置的对应内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.mashibing.com.cloudalibabagateway9999.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GateWayConfig {
   /*
   配置了一个id为path_msb1的路由规则
   当访问地址http://localhost:9999/msb/**
   就会转发到http://localhost:9001/nacos-provider/msb/任何地址
    */

   @Bean
   public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
       // 构建多个路由routes
       RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
       // 具体路由地址
       routes.route("path_msb",r -> r.path("/msb/**").uri("http://localhost:9001/nacos-provider")).build();
       // 返回所有路由规则
       return routes.build();
  }
}
阅读更多

Spring Cloud Gateway 断言 Predicate

每一个Predicate的使用,可以理解为:当满足条件后才会进行转发,如果是多个,那就是满足所有条件才会转发

断言种类

  1. After:匹配在指定日期时间之后发生的请求。
  2. Before:匹配在指定日期之前发生的请求。
  3. Between:需要指定两个日期参数,设定一个时间区间,匹配此时间区间内的请求。
  4. Cookie:需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。
  5. Header:需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。
阅读更多

Spring Cloud 网关介绍

在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如:

  • 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
  • 认证复杂,每个微服务都有独立认证
  • 存在跨域请求,在一定场景下处理相对复杂

为解决上面的问题所以引入了网关的概念:所谓的API网关,就是指系统的统一入口,提供内部服务的路由中转,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等。

13912782ae2c4387a81b42b1ea1b32db.png

阅读更多

Spring Cloud Alibaba Sentinel 源码分析-滑动时间窗口算法原理

“滑动时间窗口算法” 是Sentinel源码中的一个非常重要的算法。

image-20211222170933011

时间窗算法

那么在了解滑动时间窗算法之前,我们先要来了解时间窗算法,也可以称之为:固定时间窗算法

概念:固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。

阅读更多

Spring Cloud Alibaba Sentinel DegradeSlot 源码解析

DegradeSlot是熔断降级的Slot,那我们直接来看核心方法

1
2
3
4
5
6
7
8
9
//DegradeSlot.entry
@Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
boolean prioritized, Object... args) throws Throwable {
// 熔断降级检测
performChecking(context, resourceWrapper);
// 触发下一个节点
fireEntry(context, resourceWrapper, node, count, prioritized, args);
}
阅读更多

Spring Cloud Alibaba Sentinel StatisticSlot 源码解析

StatisticSlot定义:

StatisticSlot 是 Sentinel 最为重要的类之一,用于根据规则判断结果进行相应的统计操作。

entry 的时候:依次执行后面的判断 slot。每个 slot 触发流控的话会抛出异常(BlockException的子类)。若有 BlockException抛出,则记录 block 数据;若无异常抛出则算作可通过(pass),记录 pass 数据。

exit 的时候:若无 error(无论是业务异常还是流控异常),记录 complete(success)以及 RT,线程数-1。

阅读更多

Spring Cloud Alibaba Sentinel FlowSlot 源码解析

FlowSlot获取全部流控规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 获取到指定资源的所有流控规则
Collection<FlowRule> rules = ruleProvider.apply(resource.getName());
// 逐个应用流控规则。若无法通过则抛出异常,后续规则不再应用
if (rules != null) {
for (FlowRule rule : rules) {
if (!canPassCheck(rule, context, node, count, prioritized)) {
// FlowException继承BlockException
throw new FlowException(rule.getLimitApp(), rule);
}
}
}
-------------------------------------------------------------------------------------------
// 这里调用的apply方法就是FlowSlot中的对应方法
private final Function<String, Collection<FlowRule>> ruleProvider = new Function<String, Collection<FlowRule>>() {
@Override
public Collection<FlowRule> apply(String resource) {
// Flow rule map should not be null.
// 获取所有资源和对应的流控规则 key为资源名称,value为该资源对应的所有流控规则
Map<String, List<FlowRule>> flowRules = FlowRuleManager.getFlowRuleMap();
// 获取指定资源的流控规则
return flowRules.get(resource);
}
};
阅读更多