• SpringCloud全系列知识(4)——统一网关Gateway


    SpringCloud(4)— 统一网关Gateway

    一 认识网关

    1.网关的功能

    1.身份认证和权限校验

    2.服务路由,负载均衡

    3.请求限流
    在这里插入图片描述

    2.技术实现

    • Gateway
    • zuul
      在这里插入图片描述

    二 Gateway的使用

    1.搭建网关服务

    1.创建新的Module,引入 Gateway 和 Nacos 服务发现依赖。

    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-gatewayartifactId>
    dependency>
    
     <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-loadbalancerartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.配置Gateway

    spring:
      application:
        name: alibaba-gateway
      cloud:
        nacos:
          server-addr: http://localhost:8848
          discovery:
            username: nacos
            password: nacos
        gateway:
          # 网关路由配置
          routes:
            - id: alibaba-order # 路由id,自定义,唯一即可
              #uri: http://127.0.0.1 # 路由的目标地址,http表示固定地址
              uri: lb://alibaba-order # 路由的微服务名称,lb是负载均衡(loadBalance)
              # 路由断言,判断是否符合路由规则条件
              predicates:
                #路径断言
                - Path=/order/** # 按路径匹配,只要你以/order开头就符合要求
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.断言工厂

    断言工厂( Router Predicate Factory)主要用于读取定义的断言规则,并解析为为判断条件。

    配置文件中的断言规则仅仅是字符串,这些字符串会被断言工厂解析,转变为真正的的路由判断条件。

    Spring Cloud Gateway官方参考文档

    Spring Cloud Gateway官方示例
    在这里插入图片描述

    不符合断言条件时,会返回404

    3.路由过滤器

    GatewayFilter是网关中的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
    在这里插入图片描述

    Gateway Filter提供了31种过滤器,具体可参考官方文档

    Spring Cloud Gateway过滤器工厂官方文档:Spring Cloud Gatewa过滤器工厂官方文档

    gateway:
      # 网关路由配置
      routes:
        - id: alibaba-user
          uri: lb://alibaba-user
          predicates:
            - Path=/user/**
          filters:
            # 为微服务 alibaba-user 添加请求头 author,值为shawn
            - AddRequestHeader=author, shawn
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用 default-filters 属性添加全局过滤器,全局过滤器对整个网关下的所有路由配置生效

    gateway:
      # 网关路由配置
      routes:
        - id: alibaba-user
          uri: lb://alibaba-user
          predicates:
            - Path=/user/**
      # 使用 default-filters 属性配置全局过滤器
      default-filters:
        - AddRequestHeader=author, shawn
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.GlobalFilter

    全局过滤器 GlobalFilter 的作用是处理进入一切网关的请求和响应的数据,和 GatewayFilter 的作用一样。

    GlobalFilter 需要通过自己实现代码,而 GatewayFilter 仅仅是通过配置实现固定业务的处理。

    通过实现 GlobalFilter 接口来定义全局过滤器。
    在这里插入图片描述

    自定义实现类实现GlobalFilter并且处理简单的业务逻辑

    @Component
    //定义过滤器执行顺序,也可以通过实现 Orderd 接口来定义执行顺序
    @Order(-1)
    public class CustomGlobalFilter implements GlobalFilter {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            //1.获取请求参数
            ServerHttpRequest request = exchange.getRequest();
            MultiValueMap<String, String> queryParams = request.getQueryParams();
            String author = queryParams.getFirst("author");
    
            //2.处理业务逻辑
            if("shawn".equals(author)){
                //放行
                return chain.filter(exchange);
            }
            //3.拦截
            ServerHttpResponse response = exchange.getResponse();
            //3.1设置状态码
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    此时访问地址中必须有author参数且参数值必须为shawn才能正常访问,否则抛出401。

    5.过滤器执行顺序

    在这里插入图片描述

    每个过滤器都必须指定一个 Int 类型的执行顺序,值越小,执行顺序越靠前。

    可以通过 @Order 注解 或者 实现 Orderd 接口来实现。
    在这里插入图片描述

    6.网关的跨域问题处理

    在这里插入图片描述

    跨域配置示例

    gateway:
          globalcors:
            add-to-simple-url-handler-mapping: true
            cors-configurations:
              '[/**]':
                # 允许跨域的网站
                allowedOrigins:
                  - "http://192.168.16.192:8080"
                  - "http://localhost:8080"
                allowedHeaders: "*"
                # 允许跨域的请求方式
                allowedMethods:
                  - GET
                  - POST
                  - POST
                  - DELETE
                  - OPTIONS
                allowCredentials: true  # 是否允许携带cookie
                maxAge: 36000 # 跨域检测有效期
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    MySQL基本语句
    【Eye-tracking】DIDEC: The Dutch Image Description and Eye-tracking Corpus
    如何实时计算日累计逐单资金流
    分布式应用程序协调服务软件--zookeeper
    Golang运行时垃圾收集原理及调优
    acwing算法基础之数据结构--栈和队列
    【Spring Cloud系列】Config详解与应用
    Flink JobManager的高可用配置
    Python基础:【习题系列】函数
    python使用字符串的格式化方法来设置字符串的固定长度
  • 原文地址:https://blog.csdn.net/shaopengjie2/article/details/128144866