• Gateway网关


    Gateway网关介绍

    Spring Cloud Gateway 是一个构建在 Spring Framework、Project Reactor 和 Spring Boot 之上的 API 网关。它主要用于处理 API 请求,执行各种策略如路由、过滤和转发,然后将请求代理到适当的微服务。下面简要概述了 Spring Cloud Gateway 的工作原理:

    基本组件:

    1. 路由(Route): 路由是网关的基础构建块,由一个 ID、一个目标 URI、一系列断言和一系列过滤器组成。如果断言为真,则将请求路由到 URI。

    2. 断言(Predicate): 断言用于匹配 HTTP 请求的各个属性,如路径、头、方法等。

    3. 过滤器(Filter): 一旦断言成功,过滤器会被应用于请求或响应的修改。

    工作流程:

    1. 接收请求: Spring Cloud Gateway 首先接收到从客户端发来的请求。

    2. 匹配路由: 网关根据请求的属性(如 URL、HTTP 方法或头部信息等)匹配预定义的路由。这是通过断言完成的。

    3. 执行过滤器: 在路由到下游服务之前和之后,可以应用各种过滤器来修改请求和响应。

    4. 代理请求: 一旦匹配到合适的路由并执行了所有的过滤器,网关将请求代理到对应的下游服务。

    5. 获取响应: 网关从下游服务获取响应,并通过任何配置的后置过滤器。

    6. 返回响应: 最终,经过所有处理和过滤后的响应返回给客户端。

    高性能与非阻塞

    Spring Cloud Gateway 使用了非阻塞 API 和 Project Reactor,从而确保高吞吐量和低延迟。

    通过这样的机制,Spring Cloud Gateway 不仅仅是一个简单的代理服务,还可以添加各种中间层功能,如安全性验证、限流、监控等。

    这样的设计使得 Spring Cloud Gateway 非常适合微服务架构,它可以很容易地与其他 Spring Cloud 组件和服务集成,为微服务提供统一的入口点和管理界面。

    环境配置

    添加依赖,添加nacos依赖报错时添加指定的版本号就行了。

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.cloudgroupId>
    7. <artifactId>spring-cloud-starter-gatewayartifactId>
    8. dependency>

    application.yml配置文件

    1. server:
    2. port: 10010
    3. spring:
    4. application:
    5. name: gateway
    6. cloud:
    7. nacos:
    8. server-addr: localhost:8848 #nacos地址,把自己也注册到nacos
    9. gateway:
    10. routes: #定义路由规则数组
    11. - id: user-service #路由标识,必须唯一
    12. uri: lb://userservice #路由的目标地址,lb表示负载均衡模式,也可以直接写http地址
    13. predicates: #路由断言,判断请求是否符合规则
    14. - Path=/user/** #路由断言,判断路径是否以/user开头,如果是则符合
    15. - id: order-service
    16. uri: lb://orderservice
    17. predicates:
    18. - Path=/order/**

    断言工厂

    只有条件都符合时才会放行,在predicates下进行配置。

    路由过滤器

    Gatewa自带过滤器

    GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理,比如添加请求头,GatewayFilter通过配置定义,处理逻辑是固定的

    filters:对当前请求进行添加过滤器(局部过滤器,不能自定义)。

    default-filters:对所有请求添加过滤器(全局过滤器,不能自定义)。

    1. spring:
    2. application:
    3. name: gateway
    4. cloud:
    5. nacos:
    6. server-addr: localhost:8848 #nacos地址,把自己也注册到nacos
    7. gateway:
    8. routes: #定义路由规则数组
    9. - id: user-service #路由标识,必须唯一
    10. uri: lb://userservice #路由的目标地址
    11. predicates: #路由断言,判断请求是否符合规则
    12. - Path=/user/** #路由断言,判断路径是否以/user开头,如果是则符合
    13. filters: #针对当前实例添加过滤器
    14. - AddRequestHeader=Truth, Itcast is freaking awesome! #添加请求头,只对user的服务添加
    15. - id: order-service
    16. uri: lb://orderservice
    17. predicates:
    18. - Path=/order/**
    19. default-filters: #对所有的服务添加过滤器
    20. - AddRequestHeader=xin, xin is freaking awesome!

    GlobalFilter全局过滤器

    全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样,区别在于GlobalFilter的逻辑需要自己写代码实现(可以自定义)。

    定义一个类实现GlobalFilter接口,再交给Spring管理就可以了。

    在Spring WebFlux和Spring Cloud Gateway中,filter方法是用于处理HTTP请求和响应的核心部分。这个方法通常定义在一个实现了GatewayFilter接口的类中。filter方法接收两个参数:

    • ServerWebExchange exchange: 这个参数包含了当前HTTP请求-响应交换的所有信息。你可以从中获取到请求头、请求体、响应头、响应体等,并进行相应的处理。
    • GatewayFilterChain chain: 这是一个责任链,包含了一系列的过滤器。当你在filter方法中处理完请求或响应后,你需要调用chain.filter(exchange)来将控制权传递给链中的下一个过滤器。
    • Mono作为返回类型表示这是一个异步操作,并且没有返回值(Void)。在Reactor框架(Spring WebFlux底层使用的响应式库)中,Mono和Flux是用于表示异步操作的。
    1. @Order(1) //过滤器的执行顺序,越小优先级越高可以为负数
    2. @Component
    3. public class AuthorizeFilter implements GlobalFilter {
    4. @Override
    5. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    6. //获取请求参数
    7. ServerHttpRequest request = exchange.getRequest();
    8. //获取参数中的authorization参数
    9. MultiValueMap params = request.getQueryParams();
    10. String auth = params.getFirst("authorization");
    11. if (auth.equals("admin")) { //这里可能为null,注意处理一下
    12. //放行
    13. return chain.filter(exchange);
    14. }
    15. //设置状态码,401一般表示未登录
    16. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
    17. //拦截
    18. return exchange.getResponse().setComplete();
    19. }
    20. }

    过滤器执行顺序

    声明顺序由当前层次的过滤器按顺序来递增优先级,不同乘次的过滤器优先级相同的情况下,defaultFilter>路由过滤器>GlobalFilter过滤器。 

    跨域问题处理

    因为请求是先经过网关,再去微服务,在微服务配置跨域是进不来了,因为网关不会放行。

    允许特定网站的请求同意跨域

    1. spring:
    2. cloud:
    3. nacos:
    4. server-addr: localhost:8848 #nacos地址,把自己也注册到nacos
    5. gateway:
    6. globalcors: # 全局的跨域处理
    7. add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
    8. corsConfigurations:
    9. '[/**]':
    10. allowedOrigins: # 允许哪些网站来的请求可以跨域,只有这两个网站来的请求可以跨域
    11. - "http://localhost:8090"
    12. - "http://www.leyou.com"
    13. allowedMethods: # 允许的跨域ajax的请求方式
    14. - "GET"
    15. - "POST"
    16. - "DELETE"
    17. - "PUT"
    18. - "OPTIONS"
    19. allowedHeaders: "*" # 允许在请求中携带的头信息
    20. allowCredentials: true # 是否允许携带cookie
    21. maxAge: 360000 # 这次跨域检测的有效期

    允许所有的请求都能跨域

    1. spring:
    2. application:
    3. name: gateway
    4. cloud:
    5. nacos:
    6. server-addr: localhost:8848
    7. gateway:
    8. globalcors:
    9. add-to-simple-url-handler-mapping: true
    10. corsConfigurations:
    11. '[/**]':
    12. allowedOrigins:
    13. - "*"
    14. allowedMethods:
    15. - "GET"
    16. - "POST"
    17. - "DELETE"
    18. - "PUT"
    19. - "OPTIONS"
    20. allowedHeaders: "*"
    21. maxAge: 360000

  • 相关阅读:
    k8s 部署mysql8(PV和PVC 版本)
    ADSP-21569/ADSP-21593的开发入门(上)
    想要精通算法和SQL的成长之路 - 旋转链表
    Sql注入详解(原理篇)
    好心情:这4种营养素能增强抗抑郁药的疗效!不知道的人亏大了
    20231027 基于STM32mp157a 的内核与应用层通过子系统控制led灯,以及计时器功能
    对dubbo的DubboReference.check的参数进行剖析
    从一个 issue 出发,带你玩图数据库 NebulaGraph 内核开发
    皮带机巡检解决方案
    CompletableFuture方法介绍及代码示例
  • 原文地址:https://blog.csdn.net/LYXlyxll/article/details/132781071