前言:
此时你们对“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区别