龙空技术网

SpringCloud Gateway 介绍

调皮的狼 131

前言:

此时你们对“netty框架与spring区别”大致比较关注,小伙伴们都想要了解一些“netty框架与spring区别”的相关资讯。那么小编也在网摘上收集了一些对于“netty框架与spring区别””的相关内容,希望看官们能喜欢,我们快快来学习一下吧!

一、SpringCloud Gateway 简介

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

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

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

使用时引入

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

二、路由配置方式

1. 配置文件方式

spring:  application:    name: api-gateway  cloud:    gateway:      routes:        - id: url-proxy-1          name: API名称          uri:           predicates:            -Path=/toutiao/**          filters:          #- StripPrefix=0          - RewritePath=/oopp/phx/innter/, /phx/innter/

含义如下:

id:我们自定义的路由 ID,保持唯一

uri:目标服务地址

predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)

StripPrefix: StripPrefix参数表示在将请求发送到下游之前从请求中剥离的路径个数。【比如设置为2,当通过网关向 /toutiao/bar/foo发出请求时,对nameservice的请求将类似于。(未验证)】

RewritePath: 路径替换

2. 代码方式

package com.springcloud.gateway; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.gateway.route.RouteLocator;import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;import org.springframework.context.annotation.Bean; @SpringBootApplicationpublic class GatewayApplication {     public static void main(String[] args) {        SpringApplication.run(GatewayApplication.class, args);    }     @Bean    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {        return builder.routes()                .route("path_route", r -> r.path("/toutiao")                        .uri(";))                .build();    } }

3. 和注册中心相结合的路由配置方式

在uri的schema协议部分为自定义的lb:类型,表示从微服务注册中心(如Eureka)订阅服务,并且进行服务的路由。

一个典型的示例如下:

server:  port: 8084spring:  cloud:    gateway:      routes:      -id: seckill-provider-route        uri: lb://seckill-provider        predicates:        - Path=/seckill-provider/**      -id: message-provider-route        uri: lb://message-provider        predicates:        -Path=/message-provider/**application:  name: cloud-gatewayeureka:  instance:    prefer-ip-address: true  client:    service-url:      defaultZone: 

注册中心相结合的路由配置方式,与单个URI的路由配置,区别其实很小,仅仅在于URI的schema协议不同。单个URI的地址的schema协议,一般为http或者https协议。

三、安全认证,其他

    @Bean    public TokenAuthFilter tokenAuthFilter(TokenCheckClient tokenCheckClient) {        return new TokenAuthFilter(tokenCheckClient, whiteUri, blackUri, expireToken,                 appId);    }

通过filter校验token,两种方式,

1. implements GlobalFilter, Ordered

2. extends AbstractGatewayFilterFactory<Object>

四、Predicates匹配条件

说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。

1. Before 方式匹配转发

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

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

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

2. After 方式匹配转发

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

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

在上面配置中允许2019-04-29凌晨之后进行转发到。

3. Between 方式匹配转发

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

spring:  cloud:    gateway:      routes:        - id: blog          uri:           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凌晨之前请求转发到。

4. 通过请求参数匹配

Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            -Query=smile

这样配置,只要请求中包含 smile 属性的参数即可匹配路由。

使用 curl 测试,命令行输入:

curl localhost:8080?smile=x&id=2

经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。

还可以将 Query 的值以键值对的方式进行配置,这样在请求过来时会对属性值和正则进行匹配,匹配上才会走路由。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            -Query=keep, pu.

这样只要当请求中包含 keep 属性并且参数值是以 pu 开头的长度为三位的字符串才会进行匹配和路由。

使用 curl 测试,命令行输入:

curl localhost:8080?keep=pub

测试可以返回页面代码,将 keep 的属性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进行路由。

5. 通过 Header 属性匹配

Header Route Predicate 和 Cookie Route Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            - Header=X-Request-Id, \d+

使用 curl 测试,命令行输入:

curl -H "X-Request-Id:88"

则返回页面代码证明匹配成功。将参数-H "X-Request-Id:88"改为-H "X-Request-Id:spring"再次执行时返回404证明没有匹配。

- Path=/open/***/integration/**- Header=tt, 112

6. 通过 Cookie 匹配

Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            - Cookie=sessionId, test

使用 curl 测试,命令行输入:

curl --cookie "sessionId=test"

则会返回页面代码,如果去掉--cookie "sessionId=test",后台汇报 404 错误。

7. 通过 Host 匹配

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            - Host=**.baidu.com

使用 curl 测试,命令行输入:

curl -H "Host: ;

curl -H "Host: md.baidu.com"

经测试以上两种 host 均可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。

8. 通过请求方式匹配

可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            - Method=GET

使用 curl 测试,命令行输入:

# curl 默认是以 GET 的方式去请求

curl

测试返回页面代码,证明匹配到路由,我们再以 POST 的方式请求测试。

# curl 默认是以 GET 的方式去请求

curl -X POST

返回 404 没有找到,证明没有匹配上路由

9. 通过请求路径匹配

Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        -id: gateway-service​          uri: ​          order: 0​          predicates:​            -Path=/foo/{segment}

如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。

使用 curl 测试,命令行输入:

curl

curl

curl

经过测试第一和第二条命令可以正常获取到页面返回值,最后一个命令报404,证明路由是通过指定路由来匹配。

10. 通过请求 ip 地址进行匹配

Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。

server:  port: 8080spring:  application:​    name: api-gateway  cloud:​    gateway:​      routes:​        - id: gateway-service​          uri: ​          order: 0​          predicates:​            - RemoteAddr=192.168.1.1/24

可以将此地址设置为本机的 ip 地址进行测试。

curl localhost:8080

如果请求的远程地址是 192.168.1.10,则此路由将匹配。

11.组合使用

server:  port: 8080spring:  application:    name: api-gateway  cloud:    gateway:      routes:        - id: gateway-service          uri:           order: 0          predicates:            - Host=**.foo.org            - Path=/headers            - Method=GET            - Header=X-Request-Id, \d+            - Query=foo, ba.            - Query=baz            - Cookie=chocolate, ch.p

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

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

标签: #netty框架与spring区别