Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,比如:Eureka、Zuul、Feign、Ribbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的网关组件,可以实现限流、安全认证、支持长连接等新特性。
Spring Cloud Gateway
Spring Cloud Gateway是SpringCloud的全新子项目,该项目基于Spring5.x、SpringBoot2.x技术版本进行编写,意在提供简单方便、可扩展的统一API路由管理方式。
概念解释:
Spring Cloud GateWay 工作流程如下所示:
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。
开始使用
Spring Cloud Gateway目前有两种方式进行配置:
在本章会侧重针对配置文件方式进行讲解,当然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内部提供的所有谓语、断言,这样我们才能目标性的进行学习,我整理出来了一个脑图,如下所示:
每一个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的组成部分:
在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。
访问效果如下所示:
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 Gateway的Before断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。
After 方式匹配转发
After Predicate与Before配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:
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 方式匹配转发
那如果是一个时间段内允许请求转发,通过Before、After组合配置也可以完成,不过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 // 不匹配
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
总结
本章节讲解了Spring Cloud Gateway的相关谓词、断言基本使用方式,GateWay内部提供了很多种灵活的路由转发规则,在同一个路由内存在多个Predicate时,同时满足规则后请求才会被路由转发。
源码位置
Gitee:https://gitee.com/hengboy/spring-cloud-chapter/tree/master/SpringCloud/spring-cloud-gateway
ApiBoot:https://gitee.com/hengboy/api-boot、https://github.com/hengboy/api-boot
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
英文原文:http://emberjs.com/guides/routing/ 路由 当用户使用你的应用时, 应用可能要在不同的状态之间进行切换。 Ember.js为你提供了许多帮助工具用于管理那些随着应用规模变化而变化的状态 为了说明它的重要性,设想一下我们在编写一个管理博客的web应用。 在任何时刻,我们都应该能回答类似这样的问题: 当前的访问者已经登陆了吗?他是管理员吗?他在看哪一篇文章?开
在此查看老版本路由规则(2.6.x or before) 路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。 条件路由。支持以服务或Consumer应用为粒度配置路由规则。 标签路由。以Provider应用为粒度配置路由规则。 后续我们计划在2.6.x版本的基础上继续增强脚本路由功能,老版本脚本路由规则配置方式请参见开篇链接。
在BeX5中,功能树上会出现类似$UI/…/…/xx.a的url, 其中“.a”是一种特殊的url,“.a”通过以下规则,最终定位到具体的.w文件: 1. 如果登录的门户是5.3之前的门户 如果客户端是手机: 查找.w文件的顺序是 第一步:查找/mobileUI下相应的.w文件; 第二步:查找/UI2下相应的.m.w文件; 第三步:查找/UI2下相应的.w文件; 如果客户端是PC: 查找.w文件的
注意:本书中的 Service Mesh 章节已不再维护,请转到 istio-handbook 中浏览。 在上一节安装istio中我们创建BookInfo的示例,熟悉了Istio的基本功能,现在我们再来看一下istio的高级特性——配置请求的路由规则。 使用istio我们可以根据权重和HTTP headers来动态配置请求路由。 基于内容的路由 因为BookInfo示例部署了3个版本的评论微服务,
本文向大家介绍vue-router路由简单案例介绍,包括了vue-router路由简单案例介绍的使用技巧和注意事项,需要的朋友参考一下 官方文档: 旧版:https://github.com/vuejs/vue-router/tree/1.0/docs/zh-cn 新版:http://router.vuejs.org/(2.0版本) 此文是旧版 文件结构图: 基本用法: <router-view>
本文向大家介绍Android NDK开发详细介绍,包括了Android NDK开发详细介绍的使用技巧和注意事项,需要的朋友参考一下 Android之NDK开发 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能
如果安装vuejs eslint插件并将其配置为使用“强烈推荐”规则集,linter将告诉您更改以下代码: 进入这个 问题是,当您这样做时,您的
仅支持 pathInfo 模式的 URL,且与控制器名称(方法)保持一致,控制器搜索规则为优先完整匹配模式。 路由规则 内置路由支持无限层级的路由,即Controller可以无限嵌套目录,如: http://127.0.0.1:9501/api/auth/login 执行的方法为:AppControllerApiAuth::login() http://127.0.0.1:9501/a/b/c/d