当传统的服务(例如数据库、消息队列、搜索引擎)在Cloud Foundry生态系统中广泛的应用和交易,有两种你可能不知道的服务发现方式。卷(Volume)服务[1]允许你做一个持久挂载的系统到你的应用。路由服务[2]允许拦截到你应用的所有HTTP流量。
路由服务
路由服务可以被用于很多目的,例如日志、限流、认证,从而做到应用无感知。
首先,让我们了解一下路由服务的工作原理。当路由服务绑定到应用,路由器将拦截到应用的所有请求,添加一些HTTP头以及保证请求完整性的签名,并将请求路由到对应服务(或者修改URL,或者仅仅返回一个错误的响应)。路由服务能做的事情请查看路由服务文档。
简单日志服务
这一节,我们学习如何使用Spring Cloud团队推出的API网关Spring Cloud Gateway构建一个简单的路由服务。这是一个简单的服务,它仅仅在日志中记录请求的详细信息,然后将请求转发到目标地址(类似路由服务文档中的Spring Boot实例[3])。
创建项目
首先,创建一个新的Spring项目。你必须保证使用Spring Boot 2.x版本(当前最新版本2.0.0 RC1),并且包含Gateway和Reactive Web的依赖。在这个例子中,我根据自己的偏爱使用Gradle,当然你也可以使用Maven。
路由谓词
接下来,我们需要设置网关路由,用于处理请求。如路由服务文档在Headers部分提到的,这里有3个header用于标识一个路由服务请求:
-
X-CF-Forwarded-Url:请求的目标URL
-
X-CF-Proxy-Signatur:验证请求用的token
-
X-CF-Proxy-Metadata:解析和验证X-CF-Proxy-Signature的帮助信息
上面这个Spring Cloud Gateway路由服务围绕谓词构建。在这个例子中,有3个基于Predicate的简单Header。如果一个请求,这3个谓词全都匹配,那我们转发该请求到http://google.com:80(很明显真实的场景不能这么做,后面我们将使用filter更新目标地址)。我们使用./gradlew bootRun命令启动服务,并且使用http客户端验证服务是否正常工作。
如你所见,路由服务处理了这3个Header,并且如我们所期待的将请求转发到google了(google返回了301作为响应)。
日志Filter
接下来,我们构建一个简单的Filter,用于记录进来的请求的一些信息。
最后调用chain.filter(exchange),表明这个Filter已经处理完成,并且将请求传给Filter链中的下一个Filter进行处理,或者如果这是链中最后一个Filter,则对请求放行。接下来,我们需要确保当路由服务处理请求时会调用Filter。
如你所见,我们使用filters()方法增加了日志过滤器。f是GatewayFilterSpec[4]类的实例,包含了常用filters的简便方法,例如添加Header、转发,或者开启Hystrix[5]。
如果我们使用HTTP客户端再次测试,我们将看到我们日志中的详细信息:
转发到目标URL
最后,我们需要确保请求被转发到了目标URI,而不是google。我们能使用另外的Filter完成这个目的。
这个值从X-CF-Forwarded-Url中获取,并且存储在Spring Cloud Gateway的特殊属性中,用于发送最终的请求。如果产生了异常,网关将停止处理请求,并且返回一个500。注意,和其他类型的路由服务一样,这是用于拒绝请求的通用模式。如果你需要拒绝请求,你可以仅仅返回500状态码,同时停止处理请求。
现在,在路由中写一个新的Filter:
ROUTE_TO_URL_FILTER_ORDER是一个常量,表明RouteToRequestUrlFilter类型的Filter在运行。我们需要确保我们前面定义的Filter 在它之后运行,这样我们的GATEWAY_REQUEST_URL_ATTR就不会被覆盖。另外,你可能要注意,我们从f.add换成了f.filter。这是因为当前版本的Spring Cloud Gateway不允许通过add方法进行设置。
我们通过HTTP客户端再验证一次:
注意,我们通过X-CF-Forwarded-Url的Header属性使用reddit替换掉了google。
部署
到这里,路由服务就可以部署了。你应该构建应用(Gradle用户使用./gradlew build命令),参照路由服务文档中的教程[6]部署。
总结
Spring Cloud Gateway刚出来不是很久,但是对于那些想在Cloud Foundry应用前面做一层处理的Java开发者来说,是非常有用的选择。如果你想看简单路由服务的最终源代码,在这里[7]。另外,有必要看看Spring Gloud Gateway的文档,包含了很多当前教程没有提到的有用的谓词和Filter。
文中链接
[1] https://docs.cloudfoundry.org/devguide/services/using-vol-services.html
[2] https://docs.cloudfoundry.org/services/route-services.html
[3] https://github.com/nebhale/route-service-example
[4] https://github.com/spring-cloud/spring-cloud-gateway/blob/v2.0.0.M6/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java
[5] https://github.com/Netflix/Hystrix
[6] https://docs.cloudfoundry.org/services/route-services.html#tutorial
[7] https://github.com/Fitzoh/simple-gateway-route-service
本文作者Andrew Fitzgerald,由邓启明翻译
https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653549994&idx=1&sn=5e8b7479dda44ce4376df435682c73b0&chksm=813a6432b64ded24f00f6e351ab62ae0c7d41d583a4fb5ac168d7d919e4fcff8506f8e5c0731&mpshare=1&scene=1&srcid=0725iWhTXnZxH3lTsqEF87dF#rd
相关推荐
Spring Cloud Gateway 是一款基于Spring生态系统构建的API网关,它主要设计用于提供一种简单而有效的方式来路由API,并为API提供核心关注点,如安全性、监控/度量和弹性。在3.1.3版本中,它利用了Spring Boot 2.x、...
在构建分布式系统时,Spring Cloud Gateway 作为微服务架构中的边缘服务或 API 网关,扮演着至关重要的角色。它负责路由请求到相应的微服务,并可以提供过滤器功能,如限流、熔断等。而Spring Security 则是 Java ...
在IT行业中,Spring Cloud Gateway作为Spring Cloud生态体系中的一个关键组件,被广泛用于构建微服务架构中的API网关。这个框架允许我们集中处理各种请求,包括路由、过滤、安全等,极大地简化了服务间的通信。而...
SpringCloud Gateway作为一款现代化的微服务网关,它在企业级分布式系统中扮演着至关重要的角色。这个名为"springcloud Gateway网关-压测用.zip"的压缩包包含了一个用于性能测试的配置,目的是评估和优化Gateway的...
在Spring Cloud Gateway中,全局过滤器(Global Filter)是一种强大的机制,用于在请求路由到具体的服务之前或之后执行通用的处理逻辑。在这个场景中,我们关注的是如何利用全局过滤器来实现统一的签名验证,这在...
### Spring Cloud Gateway全局异常处理详解 #### 一、引言 在微服务架构中,网关作为服务入口,承担着路由转发、限流熔断、鉴权认证等职责。Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor...
项目中包含的SpringCloud中文文档将为开发者提供详细的指导,帮助他们理解和使用这些组件。文档通常会涵盖安装配置、基本使用、高级特性以及最佳实践等内容,是学习和实施微服务架构的重要参考资料。 总之,Spring ...
Spring Cloud Gateway是Spring Cloud生态中的一个新组件,它是Spring Cloud的下一代API网关。它的主要功能包括路由转发、过滤器链处理、动态路由、熔断、限流等。作为一个高性能、易用的API网关,Spring Cloud ...
详解 SpringCloud Finchley Gateway 统一异常处理 SpringCloud Finchley Gateway 统一异常处理是指在使用 SpringCloud Finchley 版本的 Gateway 时,如何统一处理系统级异常的方法。默认情况下,SpringCloud ...
在Spring Cloud生态体系中,Spring Cloud Gateway作为新一代的API网关,被广泛应用于微服务架构中,用于统一处理请求路由、过滤器链、限流、熔断等核心功能。本篇将详细介绍Spring Cloud Gateway的配置文件相关知识...
这个项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括:Spring 5,Spring ... Spring Cloud Gateway 旨在提供一种简单而有效的 API 路 由方式,并为其提供横切关注点,例如:安全,监控/指标和弹性。
Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云原生微服务网关,它旨在提供一种简单而有效的方式来对 API 进行路由,同时提供了过滤器功能,可以进行权限验证、限流、日志记录等...
赠送jar包:spring-cloud-gateway-server-3.1.1.jar; 赠送原API文档:spring-cloud-gateway-server-3.1.1-javadoc.jar; 赠送源代码:spring-cloud-gateway-server-3.1.1-sources.jar; 赠送Maven依赖信息文件:...
Spring Cloud Gateway 配置 Hystrix 熔断、限流、后台调用注意点 Spring Cloud Gateway 是一种基于 Spring Boot 框架的 API 网关解决方案,提供了许多实用的功能来管理和保护微服务架构中的 API。其中,Hystrix ...
Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的现代化微服务路由网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。在本示例 "spring-cloud-gateway-demo.zip" 中...
Spring Cloud Gateway是新一代的API网关,它替代了Zuul,提供了更强大的路由规则、过滤器等功能,能够更灵活地处理请求和响应。 此外,Spring Cloud OpenFeign是声明式服务调用的组件,简化了服务之间的调用,使得...
根据提供的文件信息,我们可以深入探讨与Spring Cloud相关的知识点。尽管文档标题和描述较为简单,但可以从这些信息中提炼出关于Spring Cloud项目的源码下载、Spring Cloud的基本概念、用途及其核心组件等方面的内容...
赠送jar包:spring-cloud-gateway-server-3.1.1.jar; 赠送原API文档:spring-cloud-gateway-server-3.1.1-javadoc.jar; 赠送源代码:spring-cloud-gateway-server-3.1.1-sources.jar; 赠送Maven依赖信息文件:...
Spring官方博客发布了一篇关于Spring Cloud Gateway的CVE报告,据公告描述,当启用和暴露 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序可受到代码注入攻击。攻击者可以发送特制的恶意请求,从而...
9. **Spring Cloud Gateway**: Spring Cloud Gateway 是新一代的 API 网关,取代了 Zuul,提供更高效、更灵活的路由、过滤器等功能,同时具备更好的性能和扩展性。 10. ** Sleuth 和 Zipkin**: Sleuth 是一个分布式...