由于我们的类型通过Base类实现 RoutePredicateFactory ,因此它将在上下文初始化时由Spring选择并提供给Spring Cloud Gateway。

在这里,我们将使用*@Configuration*类创建bean :

@Configuration

public class CustomPredicatesConfig {

@Bean

public GoldenCustomerRoutePredicateFactory goldenCustomer(

GoldenCustomerService goldenCustomerService) {

return new GoldenCustomerRoutePredicateFactory(goldenCustomerService);

}

}

我们假定这里 在Spring的上下文中有一个合适的 _GoldenCustomerService_实现。在我们的例子中,我们只有一个虚拟的实现,该实现将_customerId_值与固定值进行比较 -不现实,但对演示有用。

使用自定义谓词


现在我们已经实现了“黄金客户”谓词,并且可用于Spring Cloud Gateway,我们可以开始使用它来定义路由。首先,我们将使用流畅的API定义路由,然后使用YAML以声明的方式进行操作。

1.使用Fluent API定义

当我们必须以编程方式创建复杂对象时,Fluent API是一种流行的设计选择。在我们的例子中,我们在*@Bean_中定义路由,该_@Bean_使用_RouteLocatorBuilder_和我们的自定义谓词工厂创建一个_RouteLocator*对象 :

@Bean

public RouteLocator routes(RouteLocatorBuilder builder, GoldenCustomerRoutePredicateFactory gf ) {

return builder.routes()

.route(“golden_route”, r -> r.path(“/api/**”)

.uri(“https://fastserver”)

.predicate(gf.apply(new Config(true, “customerId”))))

.route(“common_route”, r -> r.path(“/api/**”)

.uri(“https://slowserver”)

.predicate(gf.apply(new Config(false, “customerId”))))

.build();

}

注意我们在每个路由中如何使用两个不同的_Config_配置。在第一种情况下,第一个参数为_true_,因此当我们收到黄金客户的请求时,谓词也将评估为_true_。至于第二条路线,我们在构造函数中传递 false,因此对于非黄金客户,我们的谓词将返回 true

2.在YAML中定义

我们可以使用属性或YAML文件以声明的方式获得与以前相同的结果。在这里,我们将使用YAML,因为它更易于阅读:

spring:

cloud:

gateway:

routes:

  • id: golden_route

uri: https://fastserver

predicates:

  • Path=/api/**

  • GoldenCustomer=true

  • id: common_route

uri: https://slowserver

predicates:

  • Path=/api/**

  • name: GoldenCustomer

args:

golden: false

customerIdCookie: customerId

在这里,我们使用两个可用的选项来定义谓词,从而定义了与以前相同的路由。第一个,golden_route_使用紧凑的表示形式,形式为_Predicate = [param [,param] +]。 _谓词_是谓词的名称,它是通过删除_RoutePredicateFactory_后缀从工厂类名称中自动得出的 。在“ =”符号之后,我们有用于填充关联的_Config_实例的参数。

当我们的谓词只需要简单的值时,这种紧凑的语法就可以了,但是并非总是如此。对于这些情况,我们可以使用第二种方法中描述的长格式。在这种情况下,我们为对象提供两个属性: _name_和 args。_name_包含谓词名称,而_args_用于填充 Config 实例。由于这次_args_是一个对象,因此我们的配置可以根据需要复杂。

测试


现在,让我们使用_curl_测试我们的网关来检查一切是否按预期工作 。对于这些测试,我们已经像之前显示的那样设置了路由,但是我们将使用公共可用的*httpbin.org*服务作为我们的虚拟后端。这是一项非常有用的服务,我们可以使用它来快速检查我们的规则是否按预期运行,既可以在线使用又可以作为我们可以在本地使用的docker映像使用。

我们的测试配置还包括标准的_AddRequestHeader_过滤器。我们使用它向 请求添加自定义_Goldencustomer_标头,该标头的值与谓词结果相对应。我们还添加了 _StripPrefix_过滤器,因为我们想 在调用后端之前从请求URI中删除/ api

首先,让我们测试“普通客户”方案。在网关启动并运行后,我们使用curl调用_httpbin_的 _标头_API,该API将简单地回显所有接收到的标头:

$ curl http://localhost:8080/api/headers

{

“headers”: {

“Accept”: “/”,

“Forwarded”: "proto=http;host=“localhost:8080”;for=“127.0.0.1:51547"”,

“Goldencustomer”: “false”,

“Host”: “httpbin.org”,

“User-Agent”: “curl/7.55.1”,

“X-Forwarded-Host”: “localhost:8080”,

“X-Forwarded-Prefix”: “/api”

}

}

如预期的那样,我们看到_Goldencustomer_ 标头是用_错误的_值发送的。现在让我们与“金”客户一起尝试:

$ curl -b customerId=baeldung http://localhost:8080/api/headers

{

“headers”: {

“Accept”: “/”,

“Cookie”: “customerId=baeldung”,

“Forwarded”: "proto=http;host=“localhost:8080”;for=“127.0.0.1:51651"”,

“Goldencustomer”: “true”,

“Host”: “httpbin.org”,

“User-Agent”: “curl/7.55.1”,

“X-Forwarded-Host”: “localhost:8080”,

“X-Forwarded-Prefix”: “/api”

}

}

这次,Goldencustomer 为_true_,因为我们发送了一个_customerId_ cookie,其值被我们的虚拟服务识别为对黄金客户有效。

翻译于:

https://www.baeldung.com/spring-cloud-gateway-routing-predicate-factories

Spring Cloud 相关系列文章目录

==============================================================================================================================================

网关服务


Spring Cloud Gateway

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

美团面试
字节面试经验
字节面试
菜鸟面试经验
菜鸟面试
蚂蚁金服面试经验
蚂蚁金服
唯品会面试经验
唯品会

因篇幅有限,图文无法详细发出

滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

[外链图片转存中…(img-M1l6uLHB-1711189013832)]
字节面试经验
[外链图片转存中…(img-9bAhJAvU-1711189013833)]
菜鸟面试经验
[外链图片转存中…(img-HMrG7JCu-1711189013833)]
蚂蚁金服面试经验
[外链图片转存中…(img-ha1dp0Y1-1711189013834)]
唯品会面试经验
[外链图片转存中…(img-yE9XYHWR-1711189013834)]

因篇幅有限,图文无法详细发出

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐