1. SpringCloud Gateway是什么
    SpringCloud Gateway使用的webflux中的reactor-netty响应式编程组件,底层使用了netty通讯框架.
    在这里插入图片描述

  2. SpringCloud Gateway特性
    在这里插入图片描述

  3. SpringCloud Gateway和Zuul的区别
    在这里插入图片描述

  4. Zuul1.x模型
    在这里插入图片描述
    缺点:
    在这里插入图片描述

  5. SpringCloud Gateway是基于WebFlux框架实现的,那么WebFlux框架是什么?
    在这里插入图片描述

  6. GateWay的三大概念
    在这里插入图片描述
    图片引用链接

  7. GateWay的核心逻辑和工作流程
    核心逻辑: 路由转发+ 执行过滤器链
    工作流程:
    在这里插入图片描述
    在这里插入图片描述

  8. 网关路由的配置方式

  • 在配置文件yml中配置(简单)

    server:
      port: 9527
    
    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true                 # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
          # 路由是有id、uri、predicate(断言)、一系列filter(过滤器)组成
          routes:
            - id: payment_routh             # 路由的id,没有固定规则但是要求唯一,建议配合服务名
              # localhost:9527即调用该微服务,比如localhost:9527/payment/get/1即调用localhost:8001/payment/get/1或者localhost:8002/payment/get/1
              uri: lb://cloud-payment-service # lb://表示基于服务注册的负载均衡
    #          uri: http://localhost:8001    # 匹配后提供服务的路由地址(手动执行服务实例,太笨拙)
              predicates:
                - Path=/payment/get/**      # 断言,路径相匹配的进行路由
    
            - id: payment_routh2
              uri: lb://cloud-payment-service # lb://表示基于服务注册的负载均衡
    #          uri: http://localhost:8002(手动执行服务实例,太笨拙)
              predicates:
                - Path=/payment/lb/**
    #            - After=2020-12-05T14:35:53.747+08:00[Asia/Shanghai]       # 在这个时间点之后该路由才生效
    #            - Before=2020-12-05T15:35:53.747+08:00[Asia/Shanghai]       # 在这个时间点之前该路由才生效
    #            - Between=2020-12-05T15:35:53.747+08:00[Asia/Shanghai],2020-12-31T15:35:53.747+08:00[Asia/Shanghai]       # 在这个时间点之间该路由才生效
    #            - Cookie=username,zzyy           # cookie键值对,只有带上cookie才能使用网关,否则404
    #            - Method=GET                     # get方法才允许访问
    #            - Header=X-Request-Id, \d+       # 请求头要有X-Request-Id属性并且值为正数的正则表达式
    #            - Query=username, \d+            # 要有参数名username并且值是正数才能路由
    #            - Host=**.atguigu.com             # 限制主机名
    
    eureka:
      instance:
        hostname: cloud-gateway-service
      client:
        fetch-registry: true
        register-with-eureka: true
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka   #集群版
    
  • 代码中注入RouteLocator的Bean

    @Configuration
    public class GateWayConfig {
        /**
         * 配置一个id为path_route_atguigu的路由规则
         * 当访问防止http://localhost:9527/guonei将会自动转发到地址http://news.baidu.com/guonei
         * @param routeLocatorBuilder
         * @return
         */
        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
            RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
            routes.route("path_route_atguigu", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
            return routes.build();
        }
    }
    
  1. GateWay的Filter使用

    package com.atguigu.springcloud.filter;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    import java.util.Date;
    
    @Component
    @Slf4j
    public class MyLogGateWayFilter implements GlobalFilter, Ordered{
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            log.info("********come in MyLogGateWayFilter: " + new Date());
            String uname = exchange.getRequest().getQueryParams().getFirst("uname");
            if(uname == null){
                log.info("********用户名为null,非法用户");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            // 过滤器链续传下去
            return chain.filter(exchange);
        }
    
        @Override
        // 加载过滤器的顺序,值越小,级别越高
        public int getOrder() {
            return 0;
        }
    }
    
    
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐