十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录

一、网关技术的实现

在SpringCloud中网关的实现包括两种:

作用:

二、搭建网关服务

1、新建模块,并添加依赖

2、新建Gateway包,并编写启动类

3、编写yml文件

4、启动服务,并在网页内测试

5、步骤

三、路由断言工厂

1、网关路由可以配置的内容包括:

四、路由过滤器

配置路由过滤器:

1、修改yml文件

2、重启gateway服务,并在userController中添加请求头参数

3、重启user服务,并且在浏览器中进行测试

配置所有路由的过滤器:

1、在yml文件中添加默认路由过滤器

2、重启网关,并测试

五、全局过滤器

1、新增拦截器类

2、重启服务,并发送请求

3、添加过滤参数并发送请求

六、过滤器执行顺序

七、跨域问题的解决


一、网关技术的实现

在SpringCloud中网关的实现包括两种:

  • gateway
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。

而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

作用:

  1. 对用户请求做身份认证、权限校验
  2. 将用户请求路由到微服务,并实现负载均衡
  3. 对用户请求做限流

二、搭建网关服务

1、新建模块,并添加依赖

复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2、新建Gateway包,并编写启动类

3、编写yml文件

复制代码
server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes:
        - id: user-service #路由标识(唯一)
          uri: lb://userservice #目标路由的地址
          predicates: #路由断言
            - Path=/user/** #判断路径
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

4、启动服务,并在网页内测试

5、步骤

三、路由断言工厂

1、网关路由可以配置的内容包括:

  • 路由id:路由唯一标示
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求或响应

具体使用方法可以在spring官网查看

当路由规则不符合时,会出现404的错误!

四、路由过滤器

路由过滤器工厂同样有30多个,这里是具体实现方法

配置路由过滤器:

1、修改yml文件
复制代码
          filters:
            - AddRequestHeader=Truth,Itcast is freaking aowsome!
2、重启gateway服务,并在userController中添加请求头参数
3、重启user服务,并且在浏览器中进行测试

说明请求头添加成功了

这只是配置单个路由的过滤器,若要添加所有路由过滤器,进行以下步骤

配置所有路由的过滤器:

1、在yml文件中添加默认路由过滤器
2、重启网关,并测试

发现请求头添加成功,也就是过滤器添加成功

五、全局过滤器

1、新增拦截器类

java 复制代码
@Order(-1) //参数是指过滤器的优先级,值越低,优先级越高
@Component
public class AuthorizeFileter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        1.获取请求参数
            ServerHttpRequest request = exchange.getRequest();
            MultiValueMap<String, String> params = request.getQueryParams();
//        2.获取参数中的authorization参数
            String authorization = params.getFirst("authorization");
//        3.判断参数值是否等于admin
            if ("admin".equals(authorization)){
//        4.是则放行
            return chain.filter(exchange);
        }
        else {
//        5.否则拦截
//        5.1设置状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//        5.2拦截请求
            return exchange.getResponse().setComplete();
        }
    }
}

2、重启服务,并发送请求

3、添加过滤参数并发送请求

六、过滤器执行顺序

  • order值越小,优先级越高
  • 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器

七、跨域问题的解决

在gateway的yml文件中加上,网站记得改

bash 复制代码
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期
相关推荐
sx24369419 分钟前
day33:零基础学嵌入式之网络——TCP并发服务器
网络·网络协议·http
无敌的牛1 小时前
Linux文件理解,基础IO理解
linux·运维·服务器
angushine1 小时前
鲲鹏服务器logstash采集nginx日志
运维·服务器·nginx
未来之窗软件服务1 小时前
跨平台 WebSocket 服务器的设计与实现 —— 基于.NET 8 的跨操作系统解决方案linux,macos,windows——开发工具
linux·服务器·websocket·仙盟创梦ide·东方仙盟
XXYBMOOO2 小时前
Xilinx-FPGA-PCIe-XDMA 驱动内核兼容性问题修复方案
linux·运维·服务器
waveee1232 小时前
学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型
服务器·数据结构·学习
wmm_会飞的@鱼5 小时前
FlexSim-汽车零部件仓库布局优化与仿真
服务器·前端·网络·数据库·数学建模·汽车
-XWB-5 小时前
【安全漏洞】网络守门员:深入理解与应用iptables,守护Linux服务器安全
linux·服务器·网络
不做无法实现的梦~5 小时前
mid360连接机载电脑,远程桌面连接不上的情况
运维·服务器·电脑