精华内容
下载资源
问答
  • 主要介绍了Spring Cloud GateWay 路由转发规则介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • ubuntu双网卡设置内外网上网问题,实现路由转发
  • windows开启路由转发

    2021-02-04 17:58:50
    Windows中IP路由转发功能缺省是关闭的。 步骤: 1) 打开注册表编辑器。 Registry 2) 在注册表编辑器中,定位以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip \Parameters 选择下面...

    Windows中IP路由转发功能缺省是关闭的。

     


    步骤:


    1) 打开注册表编辑器。 Registry
    2) 在注册表编辑器中,定位以下注册表项:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip
    \Parameters
    选择下面的项目:
    IPEnableRouter:REG_DWORD:0x0
    3) 要对该计算机安装和使用的所有网络连接都启用 IP 转发,请指定值为 1。
       要对该计算机安装和使用的所有网络连接都关闭 IP 转发,请指定值为 0。 

     

    注:必须以管理员或管理组成员的身份登录才能完成该过程。 默认情况下,将禁用 IP 转发。

    展开全文
  • 路由转发route详解

    万次阅读 2019-10-21 20:23:49
    路由     lo网卡 什么是广播 广播(BROADCAST): 一对多,局域网内的所有主机都可以广播,如果同一时间多个host同时广播,会造成信息干扰,实现同一广播域内的有效通信 广播地址的表现形式 以太网和IPv4...

        广播

        路由

        lo网卡

    什么是广播
    广播(BROADCAST): 一对多,局域网内的所有主机都可以广播,如果同一时间多个host同时广播,会造成信息干扰,实现同一广播域内的有效通信

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVK7zI5N-1571660615493)(/images/广播.png)]

    广播地址的表现形式
    以太网和IPv4网都用全1的地址表示广播,分别是ff:ff:ff:ff:ff:ff和255.255.255.255

    例:

    Bcast:192.168.146.255 网段广播地址

    [root@Centos6 ~]# ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:FE:5D:93  
              inet addr:192.168.146.144  Bcast:192.168.146.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fefe:5d93/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:26971 errors:0 dropped:0 overruns:0 frame:0
              TX packets:20440 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:2136491 (2.0 MiB)  TX bytes:13601286 (12.9 MiB)
    

    数据链路层(mac地址层)的广播48个1(FF:FF:FF:FF:FF:FF),
    IP层全网广播(255.255.255.255),局域网广播(ip.ip.ip.255)

    可以向广播地址发起ping错误,发送广播ping,但需要加-b参数。因为linux中默认不回应广播ping,

    可在/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts开启,0开启|1关闭

    关闭时只有网关地址响应

    [root@Centos7 ~]#ping -b 192.168.146.255
    WARNING: pinging broadcast address
    PING 192.168.146.255 (192.168.146.255) 56(84) bytes of data.
    64 bytes from 192.168.146.2: icmp_seq=1 ttl=128 time=0.429 ms
    64 bytes from 192.168.146.2: icmp_seq=2 ttl=128 time=0.391 ms
    
    [root@Centos7 ~]#route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.146.2   0.0.0.0         UG    100    0        0 ens33
    

    开启后所有该网段的host都会响应,且回复会多个回复(DUP!重复的)

    [root@Centos7 ~]#ping -b 192.168.146.255                                 
    WARNING: pinging broadcast address
    PING 192.168.146.255 (192.168.146.255) 56(84) bytes of data.
    64 bytes from 192.168.146.147: icmp_seq=1 ttl=64 time=0.096 ms
    64 bytes from 192.168.146.2: icmp_seq=1 ttl=128 time=0.311 ms (DUP!)
    64 bytes from 192.168.146.144: icmp_seq=1 ttl=64 time=1.90 ms (DUP!)
    64 bytes from 192.168.146.147: icmp_seq=2 ttl=64 time=0.045 ms
    

    路由实现

    什么是路由,路由的功能,路由的通用介质 路由:把一个数据包,从一个设备发送到不同网段的另一个设备上,路由的实现通过路由表中的记录实现。

    路由的功能:
        分隔广播域
        选择路由表中到达目标最好的路径
        维护和检查路由信息
        连接广域网

    路由的通用介质(设备)
    常见的路由器,和有路由功能的交换机,及软路由软件等,以硬件路由器为主流

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6qpQXAN-1571660615494)(/images/路由功能.jpg)]

    route命令简介 修改只是历史有效

    [root@Centos7 ~]#route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.146.2   0.0.0.0         UG    100    0        0 ens33
    192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
    192.168.146.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
    192.168.214.148 192.168.146.3   255.255.255.255 UGH   0      0        0 ens33
    [root@Centos7 ~]#route add #添加
    [root@Centos7 ~]#route del #删除
    

    Destination: 目标网络ID,主机IP,0.0.0.0/0默认路由 default
        如有Destination 169.254.0.0 Internet私有保留地址 用于网络硬件自动标记
    Genmask:network
        Gateway(网关):跨主机通信时,下一路由器临近我的接口的IP —> 下一跳
        同一网段的路由会自动生成不需要单独加 表现为Gatway 0.0.0.0
    Ifac: 接口,表示从当前设备那个网卡发出去,到达Destination
    Metric: 花费,值越小优先级越高

    路由优先级: 主机路由–>网络路由–>默认路由

    例子:

    [root@Centos7 ~]#route add -host 192.168.1.3 gw 172.16.0.1 dev eth0
    [root@Centos7 ~]#route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0
    [root@Centos7 ~]#route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0
    

    添加默认路由所有的路径都走不通时,最后的选择路由

    [root@Centos7 ~]#route add default gw 192.168.146.2
    [root@Centos7 ~]#route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.146.2   0.0.0.0         UG    0      0        0 ens33
    

    添加新的不同网段的网卡后会自动生成一条默认路由

    #ifconfig ens33:1 192.168.214.148 up
    192.168.214.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33

    #上述路由配置仅是写在内存中,实时生效,但不会永久有效,仅用于临时使用,如要永久有效,需写入配置文件中保持在硬盘中

    route路由永久有效

    #vim /etc/sysconfig/network-scripts/route-IFACE
        #需service network restart生效
    两种风格:
    (1) TARGET via GW
    如:0.0.0.0/8 via 192.168.146.2
    (2) 每三行定义一条路由
    ADDRESS#=TARGET
    NETMASK#=mask
    GATEWAY#=GW
    例:
    ADDRESS0=192.168.0.0
    NETMASK0=255.255.255.0
    GATEWAY0=192.168.146.17
    

     

    route 实现不同网段间通信

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XO5v2488-1571660615494)(/images/跨路由主机实现1.png)]

    #route add -net 172.20.1.0/24 gw 10.0.0.2 dev ens37
    #route add -net 192.168.146.0/24 gw 10.0.0.1 dev ens37
    

    需要中间设备开启路由功能,默认没启用,是自己的就收,不是自己的就直接丢弃

    #echo 1 > /proc/sys/net/ipv4/ip_forward

    如果两个中间连接的路由器处于网络的边缘是可以使用默认路由(找不到的都转向默认路由)策略实现跨网段通信

    #route add default 10.0.0.2 dev ens37
    #route add default 10.0.0.1 dev ens37
    

    配置动态路由
    quagga程序包,支持多动协议RIP(根据中间路由器的数量)、OSPF(根据带宽)和(不同网络运营商网络访问)等协议

    [root@Centos7 /etc/quagga]#systemctl start ospfd 启动服务
    [root@Centos7 /etc/quagga]#vtysh
    
    Hello, this is Quagga (version 0.99.22.4).
    Copyright 1996-2005 Kunihiro Ishiguro, et al.
    
    Centos7.hjq# 
    

    扩展:
    实现中间三个路由连接的两台主机分别基于NAT和桥接进行网络通信
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPL00T1Y-1571660615495)(/images/跨路由主机实现2.png)]

     

    lo回环网卡

        是一种特殊的网络接口,不与任何实际设备连接,而是完全由软件实现。与回环地址(127.0.0.0/8 或 ::1/128)不同,回环网卡对系统“显示”为一块硬件。任何发送到该网卡上的数据都将立刻被同一网卡接收到。
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 2444  bytes 280980 (274.3 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2444  bytes 280980 (274.3 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

     

    链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCTTXI7O-1571660615496)(/images/lo网卡.png)]

    lo网络一般情况下仅供内部测试使用,我们可以ping通127的任意网段地址,然而路由表里却并没有Lo网卡的信息,也不会因为Lo网卡的改变而自动生成,如果需要需手动添加;之所以能通,因为指向的网关为127.0.0.1/8 ,如果换成其他netmask随之改变其范围

    实验:

    实现两块lo跨主机网络的通信,可以把其放到桥接到eth0即另一块网卡上通信,通过两边路由表里配置的路由记录通信

    #ifconfig lo 6.6.6.6/32 此时该网段只有一个iP
    #ifconfig lo 7.7.7.7/32
    #route add -host 6.6.6.6 dev ens33
    #route add -host 7.7.7.7 dev eth0
    

    [centos7@localhost~]# ping -I 7.7.7.6 7.7.7.7 ping的时候使用-I 指定ping命令的接口或者地址,建议使用地址

    2 此时该网段只有一个iP
    #ifconfig lo 7.7.7.7/32
    #route add -host 6.6.6.6 dev ens33
    #route add -host 7.7.7.7 dev eth0

    >[centos7@localhost~]# ping -I  7.7.7.6 7.7.7.7   ping的时候使用-I  指定ping命令的接口或者地址,建议使用地址
    
    
    
    展开全文
  • SpringCloud Gateway路由转发规则

    千次阅读 2019-11-07 14:05:12
    :过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。 Spring Cloud GateWay 工作流程如下所示 : spring-cloud-gateway-work.png 客户端向 Spring Cloud Gateway 发出请求。如果网关处理...

    ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率...

    Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,比如:EurekaZuulFeignRibbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的网关组件,可以实现限流、安全认证、支持长连接等新特性。

    Spring Cloud Gateway

    Spring Cloud GatewaySpringCloud的全新子项目,该项目基于Spring5.xSpringBoot2.x技术版本进行编写,意在提供简单方便、可扩展的统一API路由管理方式。
    概念解释:

    • Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
    • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:PathQueryMethodHeader等。
    • Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。

    Spring Cloud GateWay 工作流程如下所示
    spring-cloud-gateway-work.png

    spring-cloud-gateway-work.png

    客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。

    开始使用

    Spring Cloud Gateway目前有两种方式进行配置:

    • application.yml配置文件方式
    • 通过@Bean注解RouteLocator方法返回值

    在本章会侧重针对配置文件方式进行讲解,当然RouteLocator方式也会简单的告诉大家的使用方式。

    添加依赖

    添加Spring Cloud Gateway相关依赖,pom.xml如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    //...省略部分内容
    <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <!--Spring Cloud Gateway-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    //...省略部分内容
    

    Spring Cloud Gateway Predicates

    在我们开始本章内容之前我们要来先了解下Spring Cloud Gateway内部提供的所有谓语、断言,这样我们才能目标性的进行学习,我整理出来了一个脑图,如下所示:

    SpringCloud-Gateway-Predicates.png

    SpringCloud-Gateway-Predicates.png

    每一个Predicate的使用,你可以理解为:当满足这种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

    Path 方式匹配转发

    通过Path转发示例,我们讲解下上面的两种配置,分别是application.yml以及RouteLocator

    配置文件匹配地址转发

    我们在application.yml配置文件内添加对应的路由配置,如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    spring:
      application:
        name: spring-cloud-gateway-sample
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                # 匹配路径转发
                - Path=/api-boot-datasource-switch.html
    # 端口号
    server:
      port: 9090
    

    先来解释下route的组成部分:

    • id:路由的ID
    • uri:匹配路由的转发地址
    • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

    在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。

    访问效果如下所示:

    spring-cloud-gateway-path-predicate.png

    spring-cloud-gateway-path-predicate.png

    RouteLocator 匹配路径转发

    在上面的配置中,如果使用RouteLocator方式该怎么进行配置呢?

    如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
      return builder.routes()
        .route("blog", r -> 
               r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com"))
        .build();
    }
    

    Before 方式匹配转发

    当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中,我们允许2019-05-01日凌晨之前通过路由转发到http://blog.yuqiyu.com,通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud GatewayBefore断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

    After 方式匹配转发

    After PredicateBefore配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - After=2019-04-29T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中允许2019-04-29凌晨之后进行转发到http://blog.yuqiyu.com

    Between 方式匹配转发

    那如果是一个时间段内允许请求转发,通过BeforeAfter组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发到http://blog.yuqiyu.com

    Spring Cloud Gateway 还提供了根据Cookie值的方式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Cookie=hengboy, yuqiyu
    

    在上面配置中,如果客户端发送请求时携带了"hengboy=yuqiyu"的Cookie信息,则允许请求转发。

    测试Cookie方式转发:

     

    1
    
    curl http://localhost:9090 --cookie "hengboy=yuqiyu"
    

    通过上面方式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致无法转发,出现404。

    Header 方式匹配转发

    Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Header=X-Request-Id, \d+
    

    在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到http://blog.yuqiyu.com,我们通过如下方式进行测试:

     

    1
    
    curl http://localhost:9090 -H "X-Request-Id:123456"
    

    如果头信息为X-Request-Id:abc时,就会转发失败,出现404。

    Host 方式匹配转发

    Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许**.yuqiyu.com域名进行访问,那么配置如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Host=**.yuqiyu.com
    

    测试如下所示:

     

    1
    2
    3
    4
    
    1. curl http://localhost:9090 -H "Host: yuqiyu.com"      	// 匹配
    2. curl http://localhost:9090 -H "Host: api.yuqiyu.com"		// 匹配
    3. curl http://localhost:9090 -H "Host: admin.yuqiyu.com"  // 匹配
    4. curl http://localhost:9090 -H "Host: hengboy.com"  	    // 不匹配
    

    请求方式 方式匹配转发

    Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允许POST请求访问,那么配置如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Method=POST
    

    发送GET请求测试:

     

    1
    2
    
    ~ curl http://localhost:9090
    {"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}
    

    我们的请求并未被Spring Cloud Gateway进行转发,那么我们再来通过POST请求进行测试:

     

    1
    
    curl -X POST http://localhost:9090
    

    是可以被转发到目标地址uri的,不过我的这个博客是OSS部署的,阿里云限制了POST访问,尽管如此我们也证明了可以转发。

    请求参数 方式匹配转发

    Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

    • 请求中存在xxx参数

      1
      2
      3
      4
      5
      6
      7
      8
      
      spring:
        cloud:
          gateway:
            routes:
              - id: blog
                uri: http://blog.yuqiyu.com
                predicates:
                  - Query=xxx
      

      我们通过curl http://localhost:9090\?xxx\=123是可以被成功转发的,只要参数存在xxx就会被成功转发,否则出现404转发失败。

    • 请求中存在xxx参数且值为zzz

      1
      2
      3
      4
      5
      6
      7
      8
      
      spring:
        cloud:
          gateway:
            routes:
              - id: blog
                uri: http://blog.yuqiyu.com
                predicates:
                  - Query=xxx, zzz
      

      根据上面配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。

    请求路径 方式匹配转发

    Spring Cloud Gateway提供了请求路径变量方式匹配转发,如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Path=/article/{articleId}
    

    在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1/article/abc等,测试如下所示:

     

    1
    2
    3
    
    ~ curl http://localhost:9090/article/1			// 匹配
    ~ curl http://localhost:9090/article/abc		// 匹配
    ~ curl http://localhost:9090/article/1/1		// 不匹配
    

    请求IP 方式匹配转发

    Spring Cloud Gateway可以限制允许访问接口的客户端IP地址,配置后只对指定IP地址的客户端进行请求转发,配置如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - RemoteAddr=192.168.1.56/24
    

    在上面我们配置了192.168.1.56/24,其中192.168.1.56是客户端的IP地址,而24则是子网掩码。

    组合示例

    相同的Predicate也可以配置多个,请求的转发是必须满足所有的Predicate后才可以进行路由转发,组合使用示例如下所示:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Query=author, hengboy
                - Query=yuqiyu
                - Method=GET
                - Cookie=hengboy, yuqiyu
                - Header=X-Request-Id, \d+
                - RemoteAddr=192.168.1.56/24
    

    总结

    本章节讲解了Spring Cloud Gateway的相关谓词、断言基本使用方式,GateWay内部提供了很多种灵活的路由转发规则,在同一个路由内存在多个Predicate时,同时满足规则后请求才会被路由转发。

    本文由恒宇少年 - 于起宇编写,遵循CC 4.0 BY-SA版权协议,转载请注明文章出处,如需公众号转载,请联系恒宇少年个人微信

    文章标签:Gateway,SpringCloud

    展开全文
  • Spring Cloud GateWay 路由转发规则

    千次阅读 2020-02-18 17:07:54
    Spring Cloud Gateway是SpringCloud的全新子项目,该项目基于...Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。 Predicate(谓语、断言):路由转...

    Spring Cloud GatewaySpringCloud的全新子项目,该项目基于Spring5.xSpringBoot2.x技术版本进行编写,意在提供简单方便、可扩展的统一API路由管理方式。
    概念解释:

    • Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
    • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:PathQueryMethodHeader等。
    • Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。

    Spring Cloud GateWay 工作流程如下所示

    客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。

    开始使用

    Spring Cloud Gateway目前有两种方式进行配置:

    • application.yml配置文件方式
    • 通过@Bean注解RouteLocator方法返回值

    在本章会侧重针对配置文件方式进行讲解,当然RouteLocator方式也会简单的告诉大家的使用方式。

    添加依赖

    添加Spring Cloud Gateway相关依赖,pom.xml如下所示:

     

    //...省略部分内容
    <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <!--Spring Cloud Gateway-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    //...省略部分内容
    

    Spring Cloud Gateway Predicates

    在我们开始本章内容之前我们要来先了解下Spring Cloud Gateway内部提供的所有谓语、断言,这样我们才能目标性的进行学习,我整理出来了一个脑图,如下所示:

    SpringCloud-Gateway-Predicates.png

    每一个Predicate的使用,你可以理解为:当满足这种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

    Path 方式匹配转发

    通过Path转发示例,我们讲解下上面的两种配置,分别是application.yml以及RouteLocator

    配置文件匹配地址转发

    我们在application.yml配置文件内添加对应的路由配置,如下所示:

     

    spring:
      application:
        name: spring-cloud-gateway-sample
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                # 匹配路径转发
                - Path=/api-boot-datasource-switch.html
    # 端口号
    server:
      port: 9090
    
    

    先来解释下route的组成部分:

    • id:路由的ID
    • uri:匹配路由的转发地址
    • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

    在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。

    访问效果如下所示:

    spring-cloud-gateway-path-predicate.png

    RouteLocator 匹配路径转发

    在上面的配置中,如果使用RouteLocator方式该怎么进行配置呢?

    如下所示:

     

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
      return builder.routes()
        .route("blog", r -> 
               r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com"))
        .build();
    }
    

    Before 方式匹配转发

    当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中,我们允许2019-05-01日凌晨之前通过路由转发到http://blog.yuqiyu.com,通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud GatewayBefore断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

    After 方式匹配转发

    After PredicateBefore配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - After=2019-04-29T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中允许2019-04-29凌晨之后进行转发到http://blog.yuqiyu.com

    Between 方式匹配转发

    那如果是一个时间段内允许请求转发,通过BeforeAfter组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]
    

    在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发到http://blog.yuqiyu.com

    Cookie 方式匹配转发

    Spring Cloud Gateway 还提供了根据Cookie值的方式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Cookie=hengboy, yuqiyu
    

    在上面配置中,如果客户端发送请求时携带了"hengboy=yuqiyu"的Cookie信息,则允许请求转发。

    测试Cookie方式转发:

     

    curl http://localhost:9090 --cookie "hengboy=yuqiyu"
    

    通过上面方式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致无法转发,出现404。

    Header 方式匹配转发

    Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Header=X-Request-Id, \d+
    

    在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到http://blog.yuqiyu.com,我们通过如下方式进行测试:

     

    curl http://localhost:9090 -H "X-Request-Id:123456"
    

    如果头信息为X-Request-Id:abc时,就会转发失败,出现404。

    Host 方式匹配转发

    Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许**.yuqiyu.com域名进行访问,那么配置如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Host=**.yuqiyu.com
    

    测试如下所示:

     

     1. curl http://localhost:9090 -H "Host: yuqiyu.com"        // 匹配
     2. curl http://localhost:9090 -H "Host: api.yuqiyu.com"        // 匹配
     3. curl http://localhost:9090 -H "Host: admin.yuqiyu.com"  // 匹配
     3. curl http://localhost:9090 -H "Host: hengboy.com"       // 不匹配
    

    请求方式 方式匹配转发

    Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允许POST请求访问,那么配置如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Method=POST
    

    发送GET请求测试:

     

    ~ curl http://localhost:9090
    {"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}
    

    我们的请求并未被Spring Cloud Gateway进行转发,那么我们再来通过POST请求进行测试:

     

    curl -X POST http://localhost:9090
    

    是可以被转发到目标地址uri的,不过我的这个博客是OSS部署的,阿里云限制了POST访问,尽管如此我们也证明了可以转发。

    请求参数 方式匹配转发

    Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

    • 请求中存在xxx参数

      spring:
        cloud:
          gateway:
            routes:
              - id: blog
                uri: http://blog.yuqiyu.com
                predicates:
                  - Query=xxx
      

      我们通过curl http://localhost:9090\?xxx\=123是可以被成功转发的,只要参数存在xxx就会被成功转发,否则出现404转发失败。

    • 请求中存在xxx参数且值为zzz

      spring:
        cloud:
          gateway:
            routes:
              - id: blog
                uri: http://blog.yuqiyu.com
                predicates:
                  - Query=xxx, zzz
      

      根据上面配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。

    请求路径 方式匹配转发

    Spring Cloud Gateway提供了请求路径变量方式匹配转发,如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Path=/article/{articleId}
    

    在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1/article/abc等,测试如下所示:

     

    ~ curl http://localhost:9090/article/1          // 匹配
    ~ curl http://localhost:9090/article/abc        // 匹配
    ~ curl http://localhost:9090/article/1/1        // 不匹配
    

    请求IP 方式匹配转发

    Spring Cloud Gateway可以限制允许访问接口的客户端IP地址,配置后只对指定IP地址的客户端进行请求转发,配置如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - RemoteAddr=192.168.1.56/24
    

    在上面我们配置了192.168.1.56/24,其中192.168.1.56是客户端的IP地址,而24则是子网掩码。

    组合示例

    相同的Predicate也可以配置多个,请求的转发是必须满足所有的Predicate后才可以进行路由转发,组合使用示例如下所示:

     

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Query=author, hengboy
                - Query=yuqiyu
                - Method=GET
                - Cookie=hengboy, yuqiyu
                - Header=X-Request-Id, \d+
                - RemoteAddr=192.168.1.56/24
    

     

    展开全文
  • 路由转发原理

    千次阅读 2020-10-29 23:12:28
    路由转发原理 (1)主机 1.1 要发送数据包给主机 4.1,因为 IP 地址不在同一网段,所以主机会将数据 包发送给本网段的网关路由器 A。 (2)路由器 A 接收到数据包,先查看数据包 IP 首部中的目标 IP 地址,再查找...
  • 路由转发流程

    千次阅读 2020-06-10 16:41:05
    IP 地址和路由转发 此文档为回忆文档,不会详细解释原理 文章目录IP 地址和路由转发一、IP 地址1.1 作用1.2 分类1.3 子网掩码二、IP地址识别(路由转发)2.1 路由器转发规则2.2 最长匹配原则2.3 路由迭代规则2.3 ...
  • 第一步:入门 如何使用phpbean进行路由转发呢?下面是一个简单的使用例子。 首先,index.php是程序的单一入门,主要进行路由转发的工作。Index.php的程序代码如下: <? include(‘startup.php’);//载入启动文件...
  • 打开windows路由转发功能

    千次阅读 2020-02-17 12:59:30
    Windows中IP路由转发功能缺省是关闭的。 关闭的话 1) 打开注册表编辑器。 2) 在注册表编辑器中,定位以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip \Parameters 选择下面的项目...
  • Linux flow offload提高路由转发效率

    万次阅读 2019-12-07 08:38:52
    利用nf_conntrack机制存储路由,省去每包路由查找: https://blog.csdn.net/dog250/article/details/24101425 在Linux的连接跟踪(nf_conntrack)中缓存私有数据省去每次查找: https://blog.csdn.net/dog...
  • 路由转发 简介 路由器首先路由表中查找,判明是否知道如何将分组发送到下一个站点(路由器或主机),如果路由器不知道如何发送分组,通常将该分组丢弃;否则就根据路由表的相应表项将分组发送到下一个站点,如果目的...
  • 然而传统的默认路由转发策略还存在问题,在分析传统的默认路由转发策略存在问题的基础上,提出改进型的默认路由转发策略。该策略解决了传统默认路由转发方式中的重复发现问题和状态复制问题,并通过仿真验证改进了...
  • debian10 squidsquid squid 要求: 先安装squid ...原先ip_forward内容为0(既不允许转发,现改为1表允许转发) syscrl -p #加载内核参数 -p指定文件 默认为ip_forward 最后重启squid服务即可 ...
  • GateWay路由转发

    千次阅读 2019-04-29 19:04:25
    因为Netflix宣布闭源,spring对很多组件都找了替代品 Zuul的替代产品就是 SpringCloudGateway ...GateWay路由转发我们不需要写任何代码, 1:添加依赖 2:修改配置文件(注入bean) 先添加GateWay的依赖 ...
  • Windows 10上开启路由转发及添加路由

    千次阅读 2020-11-11 13:20:12
    WIN10上开启转发及添加静态路由 注意:实验环境下主机B两个接口没有网关 B为华为的CT6200 操作步骤 一、主机B 开启 win10 转发功能 1、进入CMD 2、执行命令 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip...
  • VRF虚拟路由转发实例说明

    千次阅读 2020-02-15 08:40:26
    VPN路由转发表,也称VPN-instance(VPN实例),是PE为直接相连的site建立并维护的一个专门实体,每个site在PE上都有自己的VPN-instance,每个VPN-instance包含到一个或多个与该PE直接相连的CE的路由和转发表,另外...
  • win10 路由转发

    千次阅读 2020-06-17 21:08:34
    最方便的方法就是让主机A拥有路由转发功能,让主机B添加一条静态路由指向主机A的IP地址。 实现: 主机A中 以管理员身份运行 CMD 运行以下命令 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\...
  • zuul路由转发源码解析

    千次阅读 2018-10-23 09:58:17
    routeMap的类型为LinkedHashMap是有序的,路由转发时也是按照顺序进行匹配的,因此我们有必要将该路由规则放在最后匹配,防止原来排序在其后面的路由规则无效。 1.5配置了路由前缀,所有路由规则需要加上前缀 对...
  • 路由转发功能

    千次阅读 2020-01-16 10:30:24
    三、使用iptables配置网络转发功能 ifconfig eth0 192.168.100.1 echo "1" > /proc/sys/net/ipv4/ip_forward iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ...
  • Spring Cloud GateWay 路由转发规则介绍

    千次阅读 2019-04-29 15:11:00
    :过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。 Spring Cloud GateWay 工作流程如下所示 : spring-cloud-gateway-work.png 客户端向 Spring Cloud Gateway 发出请求。如果...
  • windows 路由转发配置

    千次阅读 2020-04-07 11:47:52
    将内网的2433端口转发到外网的11111端口 netsh interface portproxy add v4tov4 listenaddress=113.107.161.30 listenport=11111 connectaddress=192.168.161.30 connectport=2433 删除转发规则 netsh interface ...
  • 首先先添加网卡(网卡模式为nat模式) 配置IP地址 nat模式默认即可 在添加服务选择远程访问–>其余默认下一步–>然后选择路由(等待安装完成即可) 接下来找到工具的路由和远程访问控制台 配置并启用路由和远程访问...
  • centos 配置路由转发

    2019-12-27 17:02:24
    https://blog.csdn.net/qianye_111/article/details/78987161
  • 实现基于XDP/eBPF的快速路由转发功能

    千次阅读 2019-11-11 18:09:28
    周末用eBPF实现了学习型网桥的XDP快速转发路径之后,再来用eBPF实现一个快速路由转发。同样很有意思。 关于eBPF和XDP的前置基础知识,我在前面实现网桥转发路径前已经概览过了,所以本文不再赘述。 当我们面对各种...
  • 现在要已经通过接入internet的wlan0网卡进行上网把所有来自eth0网卡的数据包转发到wlan0通过wlan0进行internet 访问,使得接入到eth0的主机都能够上网,因为eth0只有一个网口,所以我接入了路由器,...
  • 利用linux虚拟机实现路由转发功能

    千次阅读 2019-03-31 19:21:00
    实验:路由连接与转发1、五台机器,其中三台充当路由器,剩余两台作为主机VMnet1 192.168.41.0VMnet4 192.168.141.0VMnet5 172.26.41.0VMnet6 10.41.41.0 主机1 centos6 :192.168.41.171 适配器3:VMnet1 192.168....
  • 路由转发原理(详解包括ARP解析) 按照上图,前提环境HostA知道HostB的IP地址但是不知道路由器和HostB的MAC地址,有以下几个步骤: HostA由于不知道默认网关的MAC地址,所以对路由器A的E0端口进行ARP广播(源IP...
  • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。 Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、...
  • 后渗透msf路由转发

    千次阅读 2020-02-29 13:19:19
    目录前言拿到反弹shell添加内网路由 ...MSF的跳板功能是MSF框架中自带的一个路由转发功能,其实现过程就是MSF框架在已经获取的Meterpreter Shell的基础上添加一条去往“内网”的路由,直接使用MSF去访问原本不能直...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 180,835
精华内容 72,334
关键字:

路由转发