springcloud gateway自定義route代碼配置內置Filter


本章簡單介紹了如何使用java代碼配置springcloud gateway的route,已及集成gateway內置的限流組件。

起因

因為有需求需要自定義route,完成自定義后route后發現不知道怎么添加內置的RequestRateLimiter限流組件,網上大多都是yml配置的。

解決辦法

廢話不多先直接上代碼

@Bean
public RouteLocator routes(RouteLocatorBuilder builder, 
		RequestRateLimiterGatewayFilterFactory requestRateLimiterGatewayFilterFactory, 
		HystrixGatewayFilterFactory hystrixGatewayFilterFactory) {
    HystrixGatewayFilterFactory.Config hystrixConfig = new HystrixGatewayFilterFactory.Config();
    hystrixConfig.setFallbackUri("forward:/fallback");
    hystrixConfig.setName("openApiFallback");
    RequestRateLimiterGatewayFilterFactory.Config config = new RequestRateLimiterGatewayFilterFactory.Config();
    config.setRateLimiter(openApiRedisRateLimiter()).setKeyResolver(hostAddrKeyResolver());
    return builder.routes()
            .route("openApi", r -> r.path("/openApi")
                    .and()
                    .readBody(JSONObject.class, requestBody -> true)
                    .filters(f -> f.filter(new OpenApiFilter())
					.filter(requestRateLimiterGatewayFilterFactory.apply(config))
					.filter(hystrixGatewayFilterFactory.apply(hystrixConfig)))
                    .uri("lb://openApi"))
                    .build();
}

@Bean
public RedisRateLimiter openApiRedisRateLimiter() {
    return new RedisRateLimiter(1, 200);
}

/**
    * 用戶ip限流
    * @return
    */
@Bean
public KeyResolver hostAddrKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

效果與yml中類似

spring:
    cloud:
        gateway:
              globalcors:
                  corsConfigurations:
                    '[/**]':
                      allowedOrigins: "*"
                      exposedHeaders:
                      - content-type
                      allowedHeaders:
                      - content-type
                      allowCredentials: true
                      allowedMethods: "*"
              routes:
              - id: main
                uri: lb://main
                predicates:
                - Path=/main/**
                filters:
                - RemoveRequestHeader=from
                - StripPrefix=1
                - name: CustomRequestRateLimiter
                  args:
                    #用於限流的鍵的解析器的 Bean 對象的名字,使用 SpEL 表達式根據#{@beanName}獲取Bean對象
                    key-resolver: '#{@hostAddrKeyResolver}'
                    #令牌桶填充速率
                    redis-rate-limiter.replenishRate: 1
                    #令牌桶總容量
                    redis-rate-limiter.burstCapacity: 200

其中RedisRateLimiter中的參數分別與redis-rate-limiter.replenishRate、redis-rate-limiter.burstCapacity相同。
而RequestRateLimiterGatewayFilterFactory與HystrixGatewayFilterFactory都是springcloud gateway內置的filter。還有更多內置Filter請看下圖。
許多Filter源碼看起來並不是很困難,用到可以多了解了解。


gateway源碼相關也可以在 芋道源碼 了解學習。多了解了解可以解決很多問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM