【SpringCloud | 第4篇】Gateway网关统一入口

文章目录

  • 网关作用
  • 工作原理
  • [predicates 断言](#predicates 断言)
    • [1. 写法](#1. 写法)
    • [2. 断言机制](#2. 断言机制)
    • [3. 自定义断言](#3. 自定义断言)
  • [filters 过滤器](#filters 过滤器)
    • [1. RewritePath GatewayFilter Factory(路径重写)](#1. RewritePath GatewayFilter Factory(路径重写))
    • [2. 默认 filter](#2. 默认 filter)
    • [3. Global Filter全局过滤器](#3. Global Filter全局过滤器)
    • [4. 自定义过滤器](#4. 自定义过滤器)
  • 跨域

网关作用

官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/index.html

Spring Cloud Gateway:

  1. Server WebFlux ------ spring-cloud-starter-gateway
  2. Server MVC ------ spring-cloud-starter-gateway-mvc(性能较差)

工作原理

yaml 复制代码
spring:
  profiles:
    active: dev
  application:
    name: easylive-cloud-gateway
  cloud:
    gateway:
      routes:
        #视频模块
        - id: video
          uri: lb://easylive-cloud-web
          predicates:
            - Path=/web/**
          filters:
            - StripPrefix=1
        #互动服务
        - id: interact
          uri: lb://easylive-cloud-interact
          predicates:
            - Path=/interact/**
          filters:
            - StripPrefix=1

spring-cloud-gateway下的配置:

  1. id:服务唯一标识
  2. uri:服务路由地址(lb 表示负载均衡)
  3. predicates:断言,判断什么时候路由到该服务
  4. filters:过滤条件
  5. order:顺序,值越小,优先级越高

predicates 断言

1. 写法

文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/configuring-route-predicate-factories-and-filter-factories.html

短写法:

长写法:

2. 断言机制

文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/request-predicates-factories.html#path-route-predicate-factory

3. 自定义断言

可以仿照 QueryRoutePredicateFactory 编写一个自定义断言配置。

!\[\](https://i-blog.csdnimg.cn/direct/285fef32e8ea4fa28e9f1bd59ef084e7.png)

自定义断言类的类名中 RoutePredicateFactory 之前就是就是配置文件中要写入的断言名 name 。

filters 过滤器

官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/gatewayfilter-factories.html

1. RewritePath GatewayFilter Factory(路径重写)

RewritePath GatewayFilter Factory 路径重写 filter:

2. 默认 filter

对所有路径均有效的过滤器。

官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/gatewayfilter-factories/default-filters.html

3. Global Filter全局过滤器

官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/global-filters.html

java 复制代码
@Component
@Slf4j
public class GatewayGlobalRequestFilter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求的URI
        String rawpath = exchange.getRequest().getURI().getRawPath();
        // 判断请求的URI是否是内部API
        if (rawpath.indexOf(Constants.INNER_API_PREFIX) != -1) {
            throw new BusinessException(ResponseCodeEnum.CODE_404);
        }
        log.info("这个是全局过滤器, {}" , rawpath);
        // 继续执行下一个过滤器
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // 设置过滤器的优先级,数字越小优先级越高
        return 0;
    }
}

4. 自定义过滤器

仿照实现 GatewayFilterFactory 接口的某个 FilterFactory 实现。

跨域

跨域(Cross-Origin Resource Sharing,简称 CORS )是一种安全策略,用于限制一个域的网页如何与另一个域的资源进行交互。这是浏览器实现的同源策略(Same-Origin Policy)的一部分,旨在防止恶意网站通过一个域的网页访问另一个域的敏感数据。

由于浏览器实施的同源策略(Same Origin Policy),这是一种基本的安全协议,它确保了浏览器的稳定运行。没有同源策略,浏览器的许多功能可能无法正常工作。整个Web体系建立在同源策略之上,浏览器是这一策略的具体实现。该策略禁止来自不同域的JavaScript脚本与另一个域的资源进行交互。所谓同源,指的是两个页面必须具有相同的协议(protocol)、域名(host)和端口号(port)。

请求是能正常的发出去的,后端也正常的响应了,浏览器是把响应给拦截了,所以会出现:has been blocked by CORS policy: Response to preflight request does not pass access control check

  • 单体项目解决跨域:

    (1)在 Controller 上添加 @CrossOrigin 注解。

    (2)编写 CrossFilter。

  • 微服务解决跨域

    微服务场景下,如果要对每一个服务单独编写跨域逻辑,比较繁琐。

    Gateway 网关对接前端入口,由 Gateway 处理跨域,所有请求经过网关,网关处理后,所有的响应都允许跨域。

官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webflux/cors-configuration.html

服务端通过在响应头中添加某些信息,告知浏览器哪些来源可以访问,浏览器就不再拦截响应。

相关推荐
利威尔xu3 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF4 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
利威尔xu4 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
霸道流氓气质5 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
frjc8 小时前
Spring AI 高级实战:ChatMemory、Tool Calling 与 MCP 架构解析
人工智能·spring·架构
T量子永生10 小时前
Unisoc(紫光展锐) Kernel 6.18 DDK 编译框架详解
linux·运维·spring
麻瓜code11 小时前
Spring AI 全模块 API 字典一览(1.1.0 版)
人工智能·windows·spring
养军博客12 小时前
Spring Security 4.x / 5.x / 6.x 配置全对比:前后端不分离与前后端分离
java·后端·spring·springsecurity
java_nnnn13 小时前
Spring IoC & DI 从入门到理解:控制反转、依赖注入与 Bean 管理详解
数据库·sql·spring