内容简介:网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.3)之 Java 自定义 RouteLocator
摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/route-locator-route-custom-java/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 Spring-Cloud-Gateway 2.0.X M4
关注**微信公众号:【芋道源码】**有福利:
- RocketMQ / MyCAT / Sharding-JDBC 所有 源码分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
- 您对于源码的疑问每条留言 都 将得到 认真 回复。 甚至不知道如何读源码也可以请教噢 。
- 新的 源码解析文章 实时 收到通知。 每周更新一篇左右 。
- 认真的 源码交流微信群。
1. 概述
本文主要分享 如何使用 Java 实现自定义 RouteLocator 。
ps :为什么这里强调 Java 呢?可以使用 Kotlin 实现自定义 RouteLocator ,在下一篇文章我们会详细分享 。
首先我们来看一段 示例 程序,代码如下 :
import static org.springframework.cloud.gateway.filter.factory.GatewayFilters.addResponseHeader; import static org.springframework.cloud.gateway.handler.predicate.RoutePredicates.host; import static org.springframework.cloud.gateway.handler.predicate.RoutePredicates.path; import static org.springframework.tuple.TupleBuilder.tuple; 1: @Bean 2: public RouteLocator customRouteLocator(ThrottleGatewayFilterFactory throttle){ 3: //@formatter:off 4: return Routes.locator() 5: // Route 6: .route("test") 7: .predicate(host("**.abc.org").and(path("/image/png"))) 8: .addResponseHeader("X-TestHeader", "foobar") 9: .uri("http://httpbin.org:80") 10: // Route 11: .route("test2") 12: .predicate(path("/image/webp")) 13: .add(addResponseHeader("X-AnotherHeader", "baz")) 14: .uri("http://httpbin.org:80") 15: // Route 16: .route("test3") 17: .order(-1) 18: .predicate(host("**.throttle.org").and(path("/get"))) 19: .add(throttle.apply(tuple().of("capacity", 1, 20: "refillTokens", 1, 21: "refillPeriod", 10, 22: "refillUnit", "SECONDS"))) 23: .uri("http://httpbin.org:80") 24: .build(); 25: ////@formatter:on 26: }
- 使用 Routes 创建了 三个 Route 。
- 使用 RoutePredicates 创建 每个 Route 的 Predicate 。
- 使用 GatewayFilters 创建 每个 Route 的 GatewayFilter 。
推荐 Spring Cloud 书籍:
- 请支持正版。下载盗版, 等于主动编写低级 BUG 。
- 程序猿DD —— 《Spring Cloud微服务实战》
- 周立 —— 《Spring Cloud与 Docker 微服务架构实战》
- 两书齐买,京东包邮。
2. Routes
rg.springframework.cloud.gateway.route.Routes
,Java 自定义 RouteLocator Builder 。
Routes 内置多个 Builder 类,用于创建 Route 相关的各个元素 :
Routes 内置 Builder 类 | 组件 |
---|---|
LocatorBuilder | RouteLocator |
RouteSpec | Route |
PredicateSpec | Predicate |
GatewayFilterSpec | GatewayFilter |
使用时,首先调用 Routes#locator()
方法,创建一个 LocatorBuilder 。代码如下 :
public static LocatorBuilder locator(){ return new LocatorBuilder(); }
LocatorBuilder ,代码如下 :
1: public static class LocatorBuilder{ 2: 3: private List<Route> routes = new ArrayList<>(); 4: 5: public PredicateSpec route(String id){ 6: return new RouteSpec(this).id(id); 7: } 8: 9: private void add(Route route){ 10: this.routes.add(route); 11: } 12: 13: LocatorBuilder uri(Route.Builder builder, String uri){ 14: Route route = builder.uri(uri).build(); 15: routes.add(route); 16: return this; 17: } 18: 19: LocatorBuilder uri(Route.Builder builder, URI uri){ 20: Route route = builder.uri(uri).build(); 21: routes.add(route); 22: return this; 23: } 24: 25: public RouteLocator build(){ 26: return () -> Flux.fromIterable(this.routes); 27: } 28: 29: }
-
routes
属性,LocatorBuilder 已创建好的 Route 数组。 -
#add()
方法,添加已创建好的 Route 。 -
#uri()
方法,使用 Route.Builder 方法,创建 Route 并添加。 -
#route()
方法, 不同于上面两个方法 ,首先创建 RouteSpec 对象,后调用RouteSpec#id(...)
方法,创建 PredicateSpec 对象。 为什么是这样的呢 ?Routes 里 创建 Route 是 有序 的 链式 过程,如下如 :- 绿线 :创建 一个 Route.Builder 。
- 红线 :调用
LocatorBuilder#uri(uri)
方法,创建 Route 并添加。后面,可以继续【 绿线 】,创建下一个 Route.Builder 。
-
#build()
方法,创建 自定义 RouteLocator 类。
RouteSpec / PredicateSpec / GatewayFilterSpec 实现上就是常见的 Builder 类,点击链接直接查看代码 :
3. RoutePredicates
org.springframework.cloud.gateway.handler.predicate.RoutePredicates
,RoutePredicates 工厂 ,其调用 RoutePredicateFactory 接口的 实现类 ,创建各种 Predicate 。代码比较易懂,点击 链接 查看实现。
4. GatewayFilters
org.springframework.cloud.gateway.filter.factory.GatewayFilters
,GatewayFilter 工厂 ,其调用 GatewayFilterFactory 接口的 实现类 ,创建各种 GatewayFilter 。代码比较易懂,点击 链接 查看实现。
666. 彩蛋
原先还在纠结 Routes 怎么解释合适,画了个图,满意。
胖友,分享一波朋友圈可好!
以上所述就是小编给大家介绍的《网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.3)之 Java 自定义 RouteLocator》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring cloud(5)-路由网关(Zuul)
- 网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.2)之 RouteDefinitionRouteLocator 路由配置
- SpringCloud学习系列之六 ----- 路由网关Zuul使用教程
- 网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.1)之 RouteLocator 一览
- 网关 Spring-Cloud-Gateway 源码解析 —— 路由(1.1)之 RouteDefinitionLocator 一览
- 网关 Spring-Cloud-Gateway 源码解析 —— 路由(1.2)之 PropertiesRouteDefinitionLocator 配置文件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Sovereign Individual
James Dale Davidson、William Rees-Mogg / Free Press / 1999-08-26 / USD 16.00
Two renowned investment advisors and authors of the bestseller The Great Reckoning bring to light both currents of disaster and the potential for prosperity and renewal in the face of radical changes ......一起来看看 《The Sovereign Individual》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
XML 在线格式化
在线 XML 格式化压缩工具