网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.3)之 Java 自定义 RouteLocator

栏目: Java · 发布时间: 6年前

内容简介:网关 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

网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.3)之  <a href='https://www.codercto.com/topics/22013.html'>Java</a>  自定义 RouteLocator

关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有 源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言 将得到 认真 回复。 甚至不知道如何读源码也可以请教噢
  4. 新的 源码解析文章 实时 收到通知。 每周更新一篇左右
  5. 认真的 源码交流微信群。

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 书籍:

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 是 有序链式 过程,如下如 :

    网关 Spring-Cloud-Gateway 源码解析 —— 路由(2.3)之 Java 自定义 RouteLocator

    • 绿线 :创建 一个 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-Gateway 源码解析 —— 路由(2.3)之 Java 自定义 RouteLocator》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

维多利亚时代的互联网

维多利亚时代的互联网

[英] 汤姆·斯丹迪奇 / 多绥婷 / 后浪丨江西人民出版社 / 2017-8 / 38.00元

人类历史上的第一次大连接 回顾互联网的前世 预言互联网的未来 ……………… ※编辑推荐※ ☆《财富》杂志推荐的75本商务人士必读书之一 ☆ 回顾互联网的前世,颠覆你的思维,升级你对互联网的认知 ☆ 人类历史上一次全球大连接是维多利亚时期的电报时代,那时候也有疯狂的资本、 巨大的泡沫、网络新型犯罪、网络亚文化崛起……现在的互联网时代就是电报时代的重演;回顾那......一起来看看 《维多利亚时代的互联网》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具