• gateway网关


    概述

    Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等

    三大核心概念

    1、Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
    2、Predicate(断言):参考的是Java8的java.util.function.Predicate
    开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
    3、Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

    使用

    1、引入依赖(要注意版本问题)

           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
                <version>2.1.3.RELEASE</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、配置文件

    server:
      port: 9527
    
    spring:
      application:
        name: cloud-gateway
    
    eureka:
      instance:
        hostname: cloud-gateway-service
        client: #服务提供者provider注册进eureka服务列表内
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://eureka7001.com:7001/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、启动类加注解@EnableEurekaClient

    YML新增网关配置
    cloud:  //spring的下一层
        gateway:
          routes:
            - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: http://localhost:8001          #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/get/**         # 断言,路径相匹配的进行路由
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    访问地址;http://localhost:9527/payment/get/31就可以映射到8001

    Gateway网关路由有两种配置方式:
    1、是上面的yml里面配置
    2、代码中注入RouteLocator的Bean

    @Component
    @Slf4j
    public class MyLogGateWayFilter  implements GlobalFilter, Ordered {
    
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            String uname = exchange.getRequest().getQueryParams().getFirst("uname");
            if (uname == null){
                System.out.println("****用户名为null,无法登录");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    通过微服务名实现动态路由

    discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      cloud:
        gateway:
          routes:
            - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: http://localhost:8001          #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/get/(**)         # 断言,路径相匹配的进行路由
    
            - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              #uri: http://localhost:8001          #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
                - After=2022-11-05T03:18:35.300+08:00[GMT+08:00]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    Predicate的使用
    • After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai] # 断言,路径相匹配的进行路由
    • Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai] # 断言,路径相匹配的进行路由
      • Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai]
    • Cookie=username,zzyy
      • Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
      • Method=GET
      • Query=username, \d+ # 要有参数名username并且值还要是整数才能路由
        Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。
    Filter的使用

    自定义过滤器:

    @Component
    @Slf4j
    public class MyLogGateWayFilter  implements GlobalFilter, Ordered {
    
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            String uname = exchange.getRequest().getQueryParams().getFirst("uname");
            if (uname == null){
                System.out.println("****用户名为null,无法登录");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    访问地址:http://localhost:9527/payment/lb?uname=z3 ,只有参数是uname才能成功访问进来

  • 相关阅读:
    干货 | 深度多元时序模型在携程关键指标预测场景下的探索应用
    网站架构演变、LNP+Mariadb数据库分离、Web服务器集群、Keepalived高可用
    深入了解 JavaScript 中的构造函数和对象创建
    Python之冒泡排序(AI自动写文章项目测试)
    FastAPI 学习之路(一)fastapi--高性能web开发框架
    Power BI 傻瓜入门 6. 从动态数据源获取数据
    RabbitMQ笔记(基础篇)
    计算机毕业设计django基于python仓库管理系统(源码+系统+mysql数据库+Lw文档)
    如何选择一个向量数据库:Elastic Cloud 和 Zilliz Cloud 面面观
    如何将 PDF 转换为 Word:前 5 个应用程序
  • 原文地址:https://blog.csdn.net/weixin_42193335/article/details/127699265