一、Spring Cloud Gateway 简介:
该项目提供了一个用于在Spring MVC之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的途径来发送API,并向他们提供交叉关注点,例如:安全性,监控/指标和弹性。
二、Spring Cloud Gateway 特点:
Built on Spring Framework 5, Project Reactor and Spring Boot 2.0(构建于Spring Framework 5,项目反应器和Spring Boot 2.0。)
Able to match routes on any request attribute.(能够在任何请求属性上匹配路由。)
Predicates and filters are specific to routes.(谓词和过滤器是特定于路由的。)
Hystrix Circuit Breaker integration.(Hystrix断路器集成。)
Spring Cloud DiscoveryClient integration(Spring Cloud DiscoveryClient集成)
Easy to write Predicates and Filters(易于编写谓词和过滤器)
Request Rate Limiting(请求速率限制)
Path Rewriting(路径重写)
三、需要的依赖如下:
四、暴露接口方式:
@RestController
@RequestMapping("blacklist")
public class BlacklistController {
@RequestMapping(value ="/remove",method = RequestMethod.DELETE)
public RespMsg remove(@Valid @RequestBody BlacklistReq req) {
RespMsg respMsg =new RespMsg(RespStatus.OK);
return respMsg;
}
暴露blacklist/remove接口,返回RespMsg 信息。
五、API网关服务
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public RouteLocatorcustomRouteLocator(RouteLocatorBuilder builder) {
RouteLocator routeLocator = builder.routes()
.route("path_route",r -> r.order(999).path("/**")
.uri("http://www.baidu.com")
)
.build();
return routeLocator;
}
}
输入localhost:8080/search/error.html跳转到http://www.baidu.com/search/error.html页面
六、API网关限流
RequestRateLimiterGatewayFilterFactory有三个参数:replenishRate,burstCapacity和keyResolverName。
replenishRate 您希望允许用户每秒处理多少个请求。
burstCapacity :最大处理请求上限。
keyResolver是一个实现KeyResolver接口的bean ,通过实现 KeyResolver 接口,实现获得不同的请求的限流键。
注意:使用限流必须依赖spring-boot-starter-data-redis-reactive
自定义KeyResolver接口实现类:RemoteAddrKeyResolver
public class RemoteAddrKeyResolver implements KeyResolver {
@Override
public Monoresolve(ServerWebExchange exchange) {
String path = exchange.getRequest().getPath().value();//用户访问的接口地址
return Mono.just(path);
}
}
自定义限流器:CustomRedisRateLimiter
public class CustomRedisRateLimiter extends RedisRateLimiter {
public CustomRedisRateLimiter(int defaultReplenishRate, int defaultBurstCapacity) {
super(defaultReplenishRate, defaultBurstCapacity);
}
}
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Autowired
ApplicationContextapplicationContext;
@Bean(name ="remoteAddrKeyResolver")
public RemoteAddrKeyResolver remoteAddrKeyResolver() {
return new RemoteAddrKeyResolver();
}
@Bean(name ="customRedisRateLimiter")
public CustomRedisRateLimiter customRedisRateLimiter() {
CustomRedisRateLimiter customRedisRateLimiter =new CustomRedisRateLimiter(2,3);
customRedisRateLimiter.setApplicationContext(applicationContext);
return customRedisRateLimiter;
}
@Bean
public RouteLocatorcustomRouteLocator(RouteLocatorBuilder builder,
@Qualifier("remoteAddrKeyResolver") RemoteAddrKeyResolver remoteAddrKeyResolver,
@Qualifier("customRedisRateLimiter") CustomRedisRateLimiter customRedisRateLimiter) {
RouteLocator routeLocator = builder.routes()
.route("limit_route",r -> r.order(10000).path("/**")
.filters(f ->
f.requestRateLimiter(config -> {
config.setRateLimiter(customRedisRateLimiter);
config.setKeyResolver(remoteAddrKeyResolver);
})
).uri("http://www.baidu.com")
).build();
return routeLocator;
}
}
以上定义了用户对于每个接口每秒2个处理请求的速率限制,remoteAddrKeyResolver用于获取用户请求接口地址作为请求限流键,到此API网关及限流构建完毕,下期将对网关及限流源码进行分析。