⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/route-definition-locator-properties/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Spring-Cloud-Gateway 2.0.X M4


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

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

阅读源码最好的方式,是使用 IDEA 进行调试 Spring Cloud Gateway 源码,不然会一脸懵逼。

胖友可以点击「芋道源码」扫码关注,回复 git019 关键字
获得艿艿添加了中文注释的 Spring Cloud Gateway 源码地址。

阅读源码很孤单,加入源码交流群,一起坚持!

1. 概述

本文主要对 PropertiesRouteDefinitionLocator 的源码实现

  • 蓝色部分 :PropertiesRouteDefinitionLocator 。

推荐 Spring Cloud 书籍

2. PropertiesRouteDefinitionLocator

org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator ,从配置文件( 例如,YML / Properties 等 ) 读取路由配置。代码如下 :

public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator {

private final GatewayProperties properties;

public PropertiesRouteDefinitionLocator(GatewayProperties properties) {
this.properties = properties;
}

@Override
public Flux<RouteDefinition> getRouteDefinitions() {
return Flux.fromIterable(this.properties.getRoutes());
}
}

  • #getRouteDefinitions() 方法,从 GatewayProperties 获取路由配置数组。

3. GatewayProperties

org.springframework.cloud.gateway.config.GatewayProperties ,从配置文件读取

  • 路由配置
  • 默认过滤器配置。当 RouteDefinition => Route 时,会将过滤器配置添加到每个 Route 。

GatewayProperties 代码如下 :

@ConfigurationProperties("spring.cloud.gateway")
@Validated
public class GatewayProperties {

/**
* List of Routes
*/
@NotNull
@Valid
private List<RouteDefinition> routes = new ArrayList<>();

/**
* List of filter definitions that are applied to every route.
*/
private List<FilterDefinition> defaultFilters = loadDefaults();

private ArrayList<FilterDefinition> loadDefaults() {
ArrayList<FilterDefinition> defaults = new ArrayList<>();
FilterDefinition definition = new FilterDefinition();
definition.setName(normalizeFilterName(RemoveNonProxyHeadersGatewayFilterFactory.class));
defaults.add(definition);
return defaults;
}
}

  • routes 属性,路由配置。通过 spring.cloud.gateway.routes 配置。以 YAML 配置文件举例子 :

    spring:
    cloud:
    gateway:
    routes:
    # =====================================
    - host_example_to_httpbin=${test.uri}, Host=**.example.org

    # =====================================
    - id: host_foo_path_headers_to_httpbin
    uri: ${test.uri}
    predicates:
    - Host=**.foo.org
    - Path=/headers
    - Method=GET
    - Header=X-Request-Id, \d+
    - Query=foo, ba.
    - Query=baz
    - Cookie=chocolate, ch.p
    - After=1900-01-20T17:42:47.789-07:00[America/Denver]
    filters:
    - AddResponseHeader=X-Response-Foo, Bar

    # =====================================
    - id: add_request_header_test
    uri: ${test.uri}
    predicates:
    - Host=**.addrequestheader.org
    - Path=/headers
    filters:
    - AddRequestHeader=X-Request-Foo, Bar

  • defaultFilters 属性,默认过滤器配置。通过 spring.cloud.gateway.default-filters 配置。以 YAML 配置文件举例子 :

    spring:
    cloud:
    gateway:
    default-filters:
    - AddResponseHeader=X-Response-Default-Foo, Default-Bar
    - PrefixPath=/httpbin

666. 彩蛋

知识星球

TODO 【3017】 与 Spring Cloud Config 结合

胖友,分享一波朋友圈可好!

文章目录
  1. 1. 1. 概述
  2. 2. 2. PropertiesRouteDefinitionLocator
  3. 3. 3. GatewayProperties
  4. 4. 666. 彩蛋