spring cloud gateway 路由转发原理_微服务网关的作用是什么

spring cloud gateway 路由转发原理_微服务网关的作用是什么SpringCloudGateway文章目录SpringCloudGateway依赖三大组件路由断言过滤器小DemoGateway初次使用工作原理配置路由断言和过滤器1.快捷方式配置网关2.将参数全部展开路由断言规则1.时间作为匹配路由规则AfterBeforeBetween1.1TheAfterRoutePredicateFactory时间之后1.2TheBeforeRoutePredicateFactory时间之前1.3.After和Before两者比

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

依赖

		 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

三大组件

  1. 路由

  2. 断言

  3. 过滤器

路由

网关的基本组成,它由ID,目标URL,断言和过滤器组成.如果断言为true,将匹配路由

断言

只有断言成功的请求才会匹配路由

过滤器

可以对请求或响应进行处理

小Demo Gateway初次使用

新建服务模块,提供 @GetMapping(“/say”) @GetMapping(“/say/one”) 两个请求映射

@RestController
public class HelloController {

    @GetMapping("/say")
    public String say()
    {
        return "HelloWord";
    }

    @GetMapping("/say/one")
    public String sayOne()
    {
        return "HelloWord one";
    }

}

新建一个网关模块

设置如下配置

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Path=/say/**

启动两个服务

image-20220320203932339

我们先不经过网关访问服务 测试是否能正常访问

image-20220320204435940

然后测试通过网关路由服务

image-20220320204518403

至此 通过网关路由服务的一个demo完成了

工作原理

下图提供了Spring网关工作原理的高级概述:

image-20220320204705420

客户端向网关发送请求,如果网关处理的映射请求与路由匹配,则将映射请求交给 GateWay Web Handler处理. Handler再通过相关的过滤器链将请求交给实际服务执行,最后返回

过滤器可以发送代理请求前执行,也可以在代理请求后执行

配置路由断言和过滤器

有两种方式可以来配置网关

1.快捷方式配置网关

快捷配置由过滤器名称,后跟一个等号=,用逗号(,)分隔的参数值来识别。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

2.将参数全部展开

完全展开的参数看起来更像带有名称/值对的标准yaml配置。 通常,会有一个name键和一个args键。 args键是配置断言或过滤器的键值对的映射

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

路由断言规则

Spring Cloud GateWay 路由断言规则

1.时间作为匹配路由规则 After Before Between

1.1 The After Route Predicate Factory 时间之后

spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - After=2022-03-20T21:02:47.789-07:00[Asia/Shanghai]

image-20220320210727992

当请求的时间在断言时间之后,将匹配路由

我们配置的时间时 2022-03-20T21:02:47.789 在当前时间2022-03-20 21:07之前

也就是当前请求时间在我们断言的时间之后 此时能匹配路由

spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - After=2022-03-21T21:02:47.789-07:00[Asia/Shanghai]

当前时间是 03-20 我们断言的时间时 03-21 则请求不能匹配当前路由

idea64_kT6F53Db4Q

1.2 The Before Route Predicate Factory 时间之前

看了上面时间之后的例子 对于时间之前的你肯定立马就能明白是怎么回事

与After正好相反

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Before=2022-03-20T21:02:47.789-07:00[Asia/Shanghai]

image-20220320210727992

请求的时间在断言设置的时间之后,不能匹配到当前请求,所有无法匹配路由

image-20220320212018901

把断言时间设置为当前时间之后 再来测试下

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Before=2022-03-22T21:02:47.789-07:00[Asia/Shanghai]

idea64_zclceImqkS

1.3.After和Before两者比较

image-20220320212422404

1.4 The Between Route Predicate Factory 两个时间之间

指定两个时间,用逗号分割,如果请求时间在这两个时间之间,将匹配路由

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Between=2022-03-19T21:02:47.789-07:00[Asia/Shanghai],2022-03-22T21:02:47.789-07:00[Asia/Shanghai]

此时请求时间为

image-20220320212716724

image-20220320212721973

能正常路由 如果请求时间不在设置的时间范围内

则不能匹配路由

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Between=2022-03-22T21:02:47.789-07:00[Asia/Shanghai],2022-03-23T21:02:47.789-07:00[Asia/Shanghai]

image-20220320212809655

2.Cook作为匹配路由规则 Cookie

2.1 The Cookie Route Predicate Factory

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Cookie=token,123

如果请求cookie中有name为token,且值为123将匹配当前路由

image-20220320213341759

name和value有一个不一样都不能成功路由

image-20220320213759651

name和value都相同 则能成功路由

image-20220320213831912

3.请求头作为匹配路由规则 Header

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Header=token,123

请求对象的请求头中 如果有name为token,且值为123,将匹配当前路由

改用postman测试

image-20220320214449264

如图 测试请求头没有name为token value为123 的请求头信息 则不能匹配路由

当请求头中有 name为token 值为 123的请求头信息时,能匹配到当前路由

image-20220320214542684

4.Host作为匹配路由规则 Host

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Host=**.haha.com:81

先修改本机host文件

127.0.0.1   qq.haha.com
127.0.0.1   qq.haha.cn

访问 http://qq.haha.com:81/say 能匹配到路由

image-20220320220006870

改成 cn 则不能匹配到路由

image-20220320220031733

5.请求方法作为匹配路由规则 Method

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Method=GET,POST

image-20220320220307465

GET和PUT请求都能匹配到路由

如果我们换成PUT请求则不能匹配到路由

image-20220320220348535

6.路径作为匹配路由规则 Path

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Path=/say

访问 /say 能匹配到路由

image-20220320220457134

多加一级路径则不能匹配到路由

可以正则 改成 /say/**

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Path=/say/**

image-20220320220612927

image-20220320220619846

此时无论访问 /say 还是 /say/one都能匹配到路由

7.查询参数作为匹配路由规则 Query

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Query=skuID

如果只写一个参数 则意思为 查询参数有skuID则匹配当前路由

image-20220320221048071

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8080  # 匹配后提供服务的路由地址
          predicates:
            - Query=skuID,11

如果两个参数,用逗号分割 则意思为 查询参数为skuID ,且值为11 匹配当前路由

注意 两个条件都必须满足 且请求方式与服务请求映射的方式一致

如果skuID 不为 11 也不能匹配到当前路由

image-20220320221201786

8.权重作为匹配路由规则 Weight

server:
  port: 81
spring:
  cloud:
    gateway:
      routes:   # 配置路由,是一个集合
        - id: apptest1         # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:80  # 匹配后提供服务的路由地址
          predicates:
            - Path=/say/**
            - Weight=group,5
        - id: apptest2          # 路由的ID, 没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8081  # 匹配后提供服务的路由地址
          predicates:
            - Path=/say/**
            - Weight=group,5

有两个路由ID 二者根据权重匹配路由 都在一个权重分组中 且权重都为5 这样匹配到/say/** 的百分之五十 请求交给80端口,另外的交给8081端口

复制一个服务,并输出打印当前服务的端口号

image-20220320221525601

package gateway.controller;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author sz
 * @DATE 2022/3/20  20:15
 */

@Data
@RestController
public class HelloController {

    @Value("${server.port}")
    public String serverPort;

    @GetMapping("/say")
    public String say()
    {
        return "HelloWord   "+serverPort;
    }

    @GetMapping("/say/one")
    public String sayOne()
    {
        return "HelloWord one";
    }

}

image-20220320222254682

Postman_LhqOquGtIj

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183106.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月11日 下午5:16
下一篇 2022年10月11日 下午5:16


相关推荐

  • Glide使用总结

    Glide使用总结

    2021年10月1日
    40
  • 怎么样复制网页上不能复制的文字_如何复制文字

    怎么样复制网页上不能复制的文字_如何复制文字网上的办法有很多,大部分是使用上的漏洞,但是我们作为技术人员那么去弄就太LOW了,接下来从修改代码的角度去过掉,很简单:这里以百度文库为例子,毕竟百度文库真的是XX;第一步:ctrl+s保存:比如:https://wenku.baidu.com/view/142a3a06a26925c52dc5bf14.html?from=search这个链接里面的文字我们是不能复制的…

    2022年10月10日
    5
  • 电容参数X5R,X7R,Y5V,COG

    电容参数X5R,X7R,Y5V,COG电容参数 X5R X7R Y5V COG 本文转载于原地址 电容的 X5R X7R Y5V COG 这类参数描述了电容采用的电介质材料类别 温度特性以及误差等参数 不同的值也对应着一定的电容容量的范围 X7R 常于容量为 3300pF 0 33uF 的电容 这类电容适用于滤波 耦合等场合 电介质常数比较大 当温度从 0 C 变化为 70 C 时 电容容量的变化为 15 Y5P 与 Y5V 常用于容量为 150

    2025年11月21日
    6
  • HotPower超级CRC计算器与第三方CRC计算器名词解释与对照及操作

    HotPower超级CRC计算器与第三方CRC计算器名词解释与对照及操作http www 21ic com tools HotPower HotWC3 V1 23 htmlPower 超级 CRC 计算器与第三方 CRC 计算器名词解释与对照及操作 权值 Poly CRC 多项式的数字表达 HotPower 超级 CRC 计算器采用最符合内部运算的权值 初值 Init CRC 初始化预置值 出值 XorOut CRC 运算后输出前的异或值

    2026年3月18日
    2
  • Java经典代码-冒泡排序[通俗易懂]

    Java经典代码-冒泡排序[通俗易懂]/** *@authorManScript * */publicclassMaopao{staticint[]scores={5,10,5,2,9,3,8};publicstaticvoidmain(String[]args){for(inti=0;ifor(intj=0;jif(scores[j]>scores[j+1]){

    2022年7月7日
    27
  • Android获取分辨率和像素密度「建议收藏」

    Android获取分辨率和像素密度「建议收藏」看了网上好多的代码说是获取的分辨率其实得到的是屏幕的宽和高。1.如何获取分辨率和像素密度2..实现代码如下 DisplayMetricslocalDisplayMetrics=newDisplayMetrics(); try{ DisplaylocalDisplay=getWindow().getWindowManager().getDefaultDispl

    2022年6月14日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号