学习基于记录,而不止于记录。
希望自己能坚持下去~
0.写在前面
首先贴上官网地址
撰写本文时Gateway版本:3.1.3
1.场景分析
微服务集群服务隐藏在网关之后,出入口统一,结合注册中心实现通信,加入负载均衡,并且和客户端与微服务之间实现解耦。
gateway支持定制化匹配规则实现网关路由,同时拥有过滤器链,可以管理和调度微服务网关,对请求进行过滤、流控和精准指向。如下图所示:
架构演示图
2.过滤器
过滤器
3.核心代码
3.1 自定义路由
第一个路由:根据请求url匹配,将/get
请求,路由向http://httpbin.org
第二个路由:根据host,并且开头有通配符*
匹配
第三个路由:依旧是根据host匹配,额外加入了路径重写
后续就不具体解释,基本顾名思义。
@SpringBootApplication
public class DemogatewayApplication {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.route("host_route", r -> r.host("*.myhost.org")
.uri("http://httpbin.org"))
.route("rewrite_route", r -> r.host("*.rewrite.org")
.filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}"))
.uri("http://httpbin.org"))
.route("hystrix_route", r -> r.host("*.hystrix.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
.uri("http://httpbin.org"))
.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
.uri("http://httpbin.org"))
.route("limit_route", r -> r
.host("*.limited.org").and().path("/anything/**")
.filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter())))
.uri("http://httpbin.org"))
.build();
}
}
3.2 过滤器
只需要重写GlobalFilter
,组件化过滤器,实现Ordered
可以做到过滤器排序。
/**
* token过滤器
*/
@Component
@Slf4j
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 此处可以加入各种校验,比如token校验等
return chain.filter(exchange);
}
/**
* 设置过滤器的执行顺序
*
* @return
*/
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
}
4.总结
之前微服务架构路由管理是交给traefik实现的,后来换成Gateway。traefik