• 【Spring Cloud】教你十分钟学会Gateway~


    • ?? 个人主页:
    • **?? 版权:**本文由【】原创、在CSDN首发、需要转载请联系博主
    • ?? 如果文章对你有帮助、欢迎关注+点赞+收藏(一键三连)哦
    • ??想寻找共同成长的小伙伴,可以互粉哦

    ??文章目录

    ??1.1 概述

    ??相关术语

    ??1.2 入门

    ?????1.2.1 搭建环境

    ?????1.2.2 测试

    ??2.1?routes路由

    ?????2.1.2 路由匹配规则

    ??2.2.1 predicates 断言

    ??7.3.3 Filter 网关过滤器


    1.1 概述

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor(响应式编程) 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

    Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。


    1.1.1 相关术语

    Gateway 目标是替代 Zuul,所有基本特性差别不大,主要的区别,底层的通信框架。

    术语

    描述

    Route(路由)

    网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

    Predicate(断言)

    这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。

    Filter(过滤器)

    和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。

    1.2 入门

    1.2.1 搭建环境

    • 创建项目:test-gateway-2.1

    • 修改pom,添加坐标

      org.springframework.cloud spring-cloud-starter-gateway
          
          
              com.alibaba.cloud
              spring-cloud-starter-alibaba-nacos-discovery
          
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 配置 yml文件:application.yml

      #端口号
      server:
      port: 10010
      spring:
      application:
      name: test-gateway
      cloud:
      nacos:
      discovery:
      server-addr: 127.0.0.1:8848 #nacos服务地址
      gateway:
      discovery:
      locator:
      enabled: true #开启服务注册和发现的功能,自动创建router以服务名开头的请求路径转发到对应的服务

    • 编写启动类

      @SpringBootApplication
      @EnableDiscoveryClient
      public class TestGatewayApplication {
      public static void main(String[] args) {
      SpringApplication.run(TestGatewayApplication.class, args);
      }

      }

    1.2.2 测试

    http://localhost:10010/service-consumer/feign/echo/abc
    
    http://localhost:10010/service-provider/echo/abc
    
    • 1
    • 2
    • 3

    2.1routes路由

    2.1.2 路由匹配规则

    • gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分

    组成

    描述

    路由 Route

    路由是网关的基本单元, 由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。

    断言 Predicate

    路由转发的判断条件,目前SpringCloud Gateway支持多种方式, 常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式

    过滤器 Filter

    过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容

    • 修改yml文件,添加

      routes:
        - id: consumer				  #自定义
          uri: lb://service-consumer    #访问路径
          predicates:					  #断言
            - Path=/consumer/**
          filters:					  #过滤器
            - StripPrefix=1 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      2.2.1 predicates 断言

    在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件,来进行作为条件匹配到对应的路由。

    简单来说, Predicate 就是一组匹配规则,方便请求过来时,匹配到对应的 Route 进行处理。

    • Spring Cloud GateWay 内置多种 Predicate ,如下:

    规则

    实例

    Path

    - Path=/gate/,/rule/

    Before

    - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

    After

    - After=2017-01-20T17:42:47.789-07:00[America/Denver]

    Between

    - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver]

    Cookie

    - Cookie=chocolate, ch.p

    Header

    - Header=X-Request-Id, d+

    Host

    - Host=www.hd123.com

    Method

    - Method=GET

    Query

    - Query=baz

    RemoteAddr

    - RemoteAddr=192.168.1.1/24

    • 实例1:通过请求参数匹配

      spring:
      cloud:
      gateway:
      routes:
      - id: query
      uri: http://www.czxy.com
      predicates:
      - Query=my,123
      #访问路径,有参数my将转发到www.czxy.com
      http://localhost:10010/?my=123

    • 实例2:通过请求路径匹配

      spring:
      cloud:
      gateway:
      routes:
      - id: path
      uri: http://www.czxy.com
      predicates:
      - Path=/czxy/{flag}

      http://localhost:10010/czxy/666

    • 总结:

      • 各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。

      • 一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发

    7.3.3 Filter 网关过滤器

    • 路由过滤器允许以某种方式修改传入的HTTP请求或传出HTTP响应。

    过滤规则

    实例

    说明

    PrefixPath

    - PrefixPath=/app

    对所有的请求路径添加前缀app

    RedirectTo

    - RedirectTo=302, 首页 - 传智专修学院

    重定向,配置包含重定向的返回码和地址

    RemoveRequestHeader

    - RemoveRequestHeader=X-Request-Foo

    去掉某个请求头信息

    RemoveResponseHeade

    - RemoveResponseHeader=X-Request-Foo

    去掉某个响应头信息

    RemoveRequestParameter

    - RemoveRequestParameter=red

    去掉某个请求参数信息

    RewritePath

    - RewritePath=/where(/.), /test(/.)

    改写路径 /where/… 改成 /test/…

    SetPath

    - SetPath=/{segment}

    设置请求路径,与RewritePath类似

    SetRequestHeader

    - SetRequestHeader=X-Request-Red, Blue

    设置请求头信息

    SetStatus

    - SetStatus=401

    设置响应状态码

    StripPrefix

    - StripPrefix=2

    跳过指定路径

    RequestSize

    - name: RequestSize args: maxSize: 5000000

    请求大小

    • 实例1:跳过指定路径

      spring:
      cloud:
      gateway:
      routes:
      - id: consumer
      uri: lb://service-consumer
      predicates:
      - Path=/consumer/**
      filters:
      - StripPrefix=1

    • 实例2:添加前缀

      spring:
      cloud:
      gateway:
      routes:
      - id: PrefixPath
      uri: lb://service-consumer
      predicates:
      - Path=/consumer/**
      filters:
      - StripPrefix=1
      - PrefixPath=/feign

    • 实例3:改写路径

      spring:
      cloud:
      gateway:
      routes:
      - id: RewritePath
      uri: lb://service-consumer
      predicates:
      - Path=/consumer/**
      filters:
      - RewritePath=/consumer(?/?.*), ${segment}

    到这里说明你已经学会了哦,努力学习!学无止境!!!


    想要了解更多吗?没时间解释了,快来点一点!!!
    ??
    ————————————————
    版权声明:本文为CSDN博主「」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:程 序 员 爱 摸 鱼??

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    MyBatisPlus中使用Mybatis方式操作数据库。
    A-Level 化学例题解析及练习Atomic Structure
    Vue 模板语法 v-bind
    Netty的拆包粘包问题
    [附源码]Python计算机毕业设计SSM考勤系统设计(程序+LW)
    多线程高频考点(如何解决死锁,谈谈HashMap HashTable ConcurrentHashMap的区别)
    Golang源码:singleflight分析(二)
    亚远景科技-ASPICE评估输入
    Centos7-Failed to start LSB: Bring up/down networking
    基于nodejs的电影交流网站
  • 原文地址:https://blog.csdn.net/m0_67403272/article/details/126080664