spring-gateway快速入门

221 阅读3分钟

1.起步

在项目的 pom.xml 文件中添加 Spring Cloud Gateway ,sentinel,nacos的依赖:

建议直接使用一些开源项目的环境配置 既有不冲突的环境,又有现成的一些配置

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba Sentinel Gateway -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>

        <!-- Sentinel Datasource Nacos -->

<!--        持久化-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.网关配置

2.1 配置文件--转发url

在 application.yml 或 application.properties 文件中,您可以定义路由规则。例如,以下是一个简单的路由配置:

spring:
  cloud:
    gateway:
      routes:
        - id: api_route # 自定义 保证唯一
          uri: http://localhost:8123 # 指定端口
          predicates:
            - Path=/api/**  # 匹配规则

例如localhost:8080/api/home会转发到 localhost:8123/api/home

在springboot配置文件中,设置 前缀

server:
  port: 8123
  servlet:
    context-path: /api

2.2使用内置拦截器--配置文件

在配置文件中设置请求头,添加响应头

default-filters:
  - AddResponseHeader=requ, name
filters:
  - AddRequestHeader=xxx, yyy
  - AddRequestParameter=xxx, yyy
 配置熔断器 #指定名称
  - name: CircuitBreaker
    args:
      name: myCircuitBreaker
 #  forward标识一个内部转发  访问一个内部的服务
      fallbackUri: forward:/fallback

forward是服务器内部转发

  1. 避免额外的HTTP请求: 当使用forward: 时,请求不会离开应用程序的上下文,因此不会产生额外的HTTP请求。这与重定向不同,重定向会使得客户端(通常是浏览器)向服务器发送一个新的HTTP请求。
  2. 保留请求状态: 由于请求是在服务器内部转发,因此原始请求的HTTP状态(如请求参数、请求头、会话属性等)都会被保留。这允许目标控制器或视图访问原始请求的所有信息。

2.3 自定义全局拦截器

所有路由都会经过全局拦截器

@Component//继承父类
public class AuthFilter implements GlobalFilter, Ordered
@Override//实现方法
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
//继续执行过滤链->此过滤链的终止
return chain.filter(mutableExchange);

2.4自定义拦截器基础

实现缓存/黑白名单/验证码校验 这些基本功能

继承这个对象AbstractGatewayFilterFactory

这个泛型是配置属性 举例:

public class CacheRequestFilter extends AbstractGatewayFilterFactory<CacheRequestFilter.Config> {

   public CacheRequestFilter() {
       super(CacheRequestFilter.Config.class);
   }

   public static class Config {
       // 定义配置属性,如:
       private boolean enabled;
       private int timeout;

       // 构造函数、getter和setter
   }

   @Override
   
   //会传入config的值(在配置文件中配置)
   public GatewayFilter apply(Config config) {
       // 使用config对象中的参数来配置过滤器
       return (exchange, chain) -> {
           // 过滤器逻辑
       };
   }
}

在配置文件中,通过name和args添加过滤器,其中args指定参数

spring:
cloud:
 gateway:
    routes:
      - id: api_route  # 客户端访问
        uri: http://localhost:8123
        predicates:
          - Path=/api/**
        
      filters:
        - name: CacheRequestFilter
          args:
            enabled: true
            timeout: 3000
  # 其他数据类型数组
            list: ["a","b"] # 可白名单的配置
            

2.5 通用控制器的拦截:

案例:验证码的生成->放在网关中生成

当网文网关 端口/code,返回数据

@Component
public class ValidateCodeHandler implements HandlerFunction<ServerResponse>
@Configuration
public class RouterFunctionConfiguration
{
   @Autowired
   private ValidateCodeHandler validateCodeHandler;

   @SuppressWarnings("rawtypes")
   @Bean
   public RouterFunction routerFunction()
   {

       return RouterFunctions.route(
               RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
               validateCodeHandler);
//        RequestPredicate predicate, HandlerFunction<T> handlerFunction  两个参数

   }


}

3.sentinel整合gateway

3.1 sentinel的的基本介绍

3.2.1 限流

sentinel有两种基本的限流:url限流和资源限流(注解@sentinelResource) 可以重写降级策略 配置类 初始化 WebCallbackManager上添加自定义bean url限流:实现urlBlockhanlder

资源限流: 注解中指定blockHanderClass,和blockHander(静态方法)

3.2.2黑白名单

配置类 WebCallbackManager.setRequestOriginParser()

3.2.3 热点限流,系统规则自适应限流

根据参数限流(不支持url限流方式)

gateway整合sentinel

添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

自定义降级处理

@Configuration
public class GatewayConfig
{
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)

    public SentinelFallbackHandler sentinelGatewayExceptionHandler()
    {
        return new SentinelFallbackHandler();(实现WebExceptionHandler
)
    }
}

4.webflux的基本api

[Spring WebFlux 原理与适用场景 (chinalhr.github.io)](https://chinalhr.github.io/post/spring-webflux-principle/)