• Spring Cloud学习(六)【统一网关 Gateway】



    网关的功能

    网关功能:

    • 身份认证和权限校验
    • 服务路由、负载均衡
    • 请求限流

    在这里插入图片描述
    在SpringCloud中网关的实现包括两种:

    • gateway
    • zuul

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

    在这里插入图片描述

    搭建网关服务

    搭建网关服务的步骤:

    1. 创建新的 module,引入 SpringCloudGateway 的依赖和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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 编写路由配置及 nacos 地址
    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/**   # 路由断言,判断请求路径是否️以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. 启动 gateway 服务与其它服务,访问 gateway,可以看到 gateway 将我们的请求进行了路由

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    路由断言工厂Route Predicate Factory

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

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

    我们在配置文件中写的断言规则只是字符串,这些字符串会被 Predicate Factory 读取并处理,转变为路由判断的条件

    例如 Path=/user/** 是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory 类来处理的

    像这样的断言工厂在SpringCloudGateway还有十几个

    在这里插入图片描述

    路由过滤器 GatewayFilter

    GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

    在这里插入图片描述
    Spring提供了31种不同的路由过滤器工厂。例如:

    在这里插入图片描述

    1. 给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

    实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

    在这里插入图片描述
    如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

    在这里插入图片描述

    在这里插入图片描述

    全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

    区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

    定义方式实现GlobalFilter接口。

    在这里插入图片描述

    定义全局过滤器,拦截并判断用户身份

    需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

    • 参数中是否有authorization,
    • authorization参数值是否为admin

    如果同时满足则放行,否则拦截

    1. 自定义类,实现 GlobalFilter 接口,添加 @Order 注解:
      在这里插入图片描述
      在这里插入图片描述

    过滤器执行顺序

    请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

    请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器

    在这里插入图片描述

    • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
    • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
    • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从 1 递增。
    • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

    可以参考下面几个类的源码来查看:

    在这里插入图片描述
    在这里插入图片描述

    跨域问题处理

    跨域:域名不一致就是跨域,主要包括:

    • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
    • 域名相同,端口不同:localhost:8080和localhost8081

    跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
    解决方案:CORS

    网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

    在这里插入图片描述

  • 相关阅读:
    建立线上线下一体化营销体系,数字化营销系统必不可少
    中国制造让苹果跪服,将再增加一家中国高科技供应商
    交叉编译器gcc-linaro-7.5.0快速安装
    SpringBoot整合Hibernate
    Http请求参数类型及servlet获取方式
    将LZO形式的文件放入HDFS中并压缩,LZO文件必须创建索引才支持切片
    【中秋征文】使用Python中秋节程序员的浪漫《嫦娥奔月》
    【蓝桥杯单片机入门记录】动态数码管
    解决Ubuntu下SSH无法连接的问题
    OpenCV 的模板匹配
  • 原文地址:https://blog.csdn.net/qq_46456049/article/details/134352996