自学内容网 自学内容网

Spring Cloud Gateway常见问题

Spring Gateway不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能。

官网

Spring Cloud Gateway工作流程

  1. 路由判断:客户端的请求到达网关后,先经过 Gateway Handler Mapping 处理,这里面会做断言(Predicate)判断,看下符合哪个路由规则,这个路由映射后端的某个服务。

  2. 请求过滤:然后请求到达 Gateway Web Handler,这里面有很多过滤器,组成过滤器链(Filter Chain),这些过滤器可以对请求进行拦截和修改,比如添加请求头、参数校验等等,有点像净化污水。然后将请求转发到实际的后端服务。

  3. 服务处理:后端服务会对请求进行处理。

  4. 响应过滤:后端处理完结果后,返回给 Gateway 的过滤器再次做处理。

  5. 响应返回:响应经过过滤处理后,返回给客户端。

工作流程图

Spring Cloud Gateway的断言是什么?

断言(编程术语):对一个表达式进行if判断,结果为真 / 假,如果为真则做这件事,否则就做那件事。

如果客户端发送的请求满足断言条件,则映射到指定的路由器,转发到指定的服务上处理。

Spring Cloud Gateway如何实现动态路由?

基于Nacos注册中心实现,Spring Cloud Gateway从注册中心获取服务的元数据(服务名称、路径等),然后根据这些信息自动生成路由规则,当你添加、移除或更新服务实例时,网关会自动感知并相应调整路由规则,无需手动维护路由配置。

Nacos官网文档

Spring Cloud Gateway的过滤器有哪些?

  1. 过滤器Filter按 请求 和 响应 划分
  • Pre类型:在请求被转发到微服务之前,对请求进行拦截和修改。例如:参数校验、权限校验、流量监控、日志输出、协议转换等操作。
  • Post类型:微服务处理完请求后,返回相应给网关,网关可以再次处理。例如修改响应内容、响应头、日志输出、流量监控等。
  1. 过滤器Filter按 作用范围 划分
  • GatewayFilter:局部过滤器,应用在 单个 或 一组路由 上的过滤器。
  • GlobalFilter:全局过滤器:应用在所有路由上的过滤器。

局部过滤器

如果URL匹配成功,则去掉URL中的"API"

filters: #过滤器
  - RewritePath=/api/(?<segment>.*),/$\{segment} # 将跳转路径中包含的 “api” 替换成空

全局过滤器

常见用法:负载均衡

spring:
  cloud:
    gateway:
      routes:
        - id: route_member # 第三方微服务路由规则
          uri: lb://passjava-member # 负载均衡,将请求转发到注册中心注册的 passjava-member 服务
          predicates: # 断言
            - Path=/api/member/** # 如果前端请求路径包含 api/member,则应用这条路由规则
          filters: #过滤器
            - RewritePath=/api/(?<segment>.*),/$\{segment} # 将跳转路径中包含的api替换成空

关键字 lb,用到全局过滤器 LoadBalancerClientFilter,当匹配到这个路由后,会将请求转发到 passjava-member 服务,且支持负载均衡转发,也就是先将 passjava-member 解析成实际微服务的 host 和 port,再转发给实际的微服务。

Spring Cloud Gateway 如何自定义全局异常处理?

在 SpringBoot 项目中,捕获全局异常只需要在项目中配置 @RestControllerAdvice@ExceptionHandler就可以了。不过,这种方式在 Spring Cloud Gateway 下不适用。

Spring Cloud Gateway 提供了多种全局处理的方式,比较常用的一种是实现ErrorWebExceptionHandler并重写其中的handle方法。

@Order(-1)
@Component
@RequiredArgsConstructor
public class GlobalErrorWebExceptionHandler implements ErrorWebExceptionHandler {
    private final ObjectMapper objectMapper;

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
    // ...
    }
}

原文地址:https://blog.csdn.net/m0_74119287/article/details/143696028

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!