和nginx一样提供请求路由功能,但它和spring colud深度整合,自动发现服务自动路由调用,最重要的一点提供统一认证授权,旧方案是通过单点登录的cas项目,各个web项目都需要接入cas客户端引入复杂的固定流程,重复配置。

1.5.1:Route:根据Predicate判断是否该路线处理,处理过程中需经过过滤器Filter集合(过滤器有pre前置和post后置方式);

        1:cookie匹配方式,可选java正则表达式;

        2:某时间前、后、之间三种方式;

        3:根据请求头匹配:- Header=X-Request-Id, \d+;

        4:根据host匹配: Host=**.xueleyun.com,{sub}.xueleyun.com,sub具体的值可以在后续的过滤器获取使用;

        5:Method方式:- Method=GET,POST

        6:Path方式:- Path=/member/{segment},/circle/{segment} ,segment可以在后续的过滤器获取使用

        7:url参数方式:- Query=green,{值表达式可选},Post方式应该不支持,暂无需求不深究;

        8:来源ip方式:- RemoteAddr=192.168.1.1/24,ip默认通过XForwardedRemoteAddressResolver获取请求头X-Forwarded-For方式获取,暂不确定使用场景不深入研究;

        9:weight route:权重分组,- Weight=group1, 8;

        1.5.2 Filter:在某route下增加过滤器链

        1:增加请求头:

filters:
        - AddRequestHeader=X-Request-red, blue

请求头可以带上url参数或路径,即route上面定义的{segment};

        2:增加请求参数:- AddRequestParameter=foo, bar-{segment};

        3:增加响应头:- AddResponseHeader=X-Response-Red, Blue-{segment};

        4:重复请求头合并: - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin,默认保留第一个;

        5:断路器:- CircuitBreaker=myCircuitBreaker,断路器规则需另外研究:Spring Cloud Circuit Breaker

        6:断路器失败后回调FallbackHeaders过滤器,和5断路器过滤器配合使用;

        7: 请求头转换:- MapRequestHeader=Blue, X-Request-Red,将发起方的请求头Blue=abc转成X-Request-Red=abc;

        8:路径前缀:- PrefixPath=/mypath,比如url为/hello 到后面的服务会变成 /mypath/hello

        9:- PreserveHostHeader:保持客户端的Host信息不变;

        10:RequestRateLimiter:速度限制过滤器,定义了一些方式,具体要依赖实现方如:Redis RequestRateLimiter:依赖spring-boot-starter-data-redis-reactive

- name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20
            redis-rate-limiter.requestedTokens: 1

        代表一秒内最多20个请求,在同一时刻最多10个请求,最后一个参数代表时间维度,如果是60,则代表60秒内可以最多20个请求;

        rate-limiter和key-resolver都可以通过bean方式指定如:#{@myRateLimiter};

   11:重定向:

- RedirectTo=302, https://acme.org

        某服务返回302状态码,则跳转到配置的地址;

        12:删除请求头:

- RemoveRequestHeader=X-Request-Foo

        13:删除响应头:

- RemoveResponseHeader=X-Response-Foo

        14:删除响应参数:

- RemoveRequestParameter=red

       15:重写路径:

RewritePath=/red/?(?<segment>.*), /$\{segment}

        16:RewriteLocationResponseHeader,响应头Location替换,


boolean doStrip = RewriteLocationResponseHeaderGatewayFilterFactory.StripVersion.ALWAYS_STRIP.equals(stripVersion) || RewriteLocationResponseHeaderGatewayFilterFactory.StripVersion.AS_IN_REQUEST.equals(stripVersion) && !VERSIONED_PATH.matcher(path).matches();
Pattern pattern = doStrip ? hostPortVersionPattern : hostPortPattern;
return pattern.matcher(location).replaceFirst(host);


        30:TokenRelayGatewayFilterFactory,依赖org.springframework.boot:spring-boot-starter-oauth2-client

示例:GitHub - spring-cloud-samples/sample-gateway-oauth2login: Sample application integrating Spring Cloud Gateway and Spring Security OAuth2

        31:全局过滤器列表:spring.cloud.gateway.default-filters

    12.4:spring.cloud.gateway.discovery.locator.enabled=true