spring-cloud-gateway - 基于自定义请求标头值,我们可以设置 spring-cloud-gateway 路径,如果有任何示例,请告知
问题描述
我正在尝试使用 Spring Cloud Gateway 进行小型概念验证。我有 5 个微服务要调用。从前端 ui 我正在尝试调用我使用 java config 配置的 spring-cloud-gateway 服务。这一切都适用于简单的情况,但是我计划根据自定义标题字段动态设置路径:例如:如果 Journey-type=train 然后 predicate.path 需要设置 train-service 并且如果 Journey-type=car 然后 predicate.path 需要设置 car-service 。是否可以动态设置。
我们可以在这里实现哪些模式,是全局过滤器更好还是网关过滤器。
@Configuration
public class BeanConfig {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r
.path("/abc/v1.0/train/**")
.filters(f->f.filter(new TrainFilter()))
.uri("http://localhost:8082/")
.id("addressModule"))
.route(r -> r.path("/abc/v1.0/car/**")
.uri("http://localhost:8083/")
.id("consumerModule"))
.build();
}
}
Filter code
@Slf4j
public class TrainFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("BEFORE in SimpleFilter.....called");
HttpHeaders headers = exchange.getRequest().getHeaders();
List<String> journeyKey = headers.get("JOURNEY-TYPE");
System.out.println(journeyKey);
if(!journeyKey.isEmpty() && journeyKey.get(0).equals("CAR")) {
System.out.println("its train..journey type ");
return chain.filter(exchange);
}
else {
org.springframework.http.server.reactive.ServerHttpResponse serverHttpResponse =exchange.getResponse();
serverHttpResponse.setStatusCode(HttpStatus.OK);
byte[] response = "{\"status\":error\",\"message\":\"error occured\"}".getBytes(StandardCharsets.UTF_8);
org.springframework.core.io.buffer.DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(response);
return exchange.getResponse().writeWith(Flux.just(buffer));
}
}
不确定..最好的方法是什么,请建议..根据标题字段值我们可以动态设置路径吗?比如抽象级别,在此先感谢您对此进行调查
解决方案
推荐阅读
- mysql - MariaDb / Mysql Rank 函数 - 一个分区排在另一个之前
- javascript - 如何在一秒间隔内获取字符
- swift - 如何在其他控制器中使用 UIlabel.text?
- video - 节点媒体服务器:在视频流上强制 480p
- reactjs - 单击按钮时尝试在反应js中显示模式
- android - baseadapter中的保存值按钮增量
- python - Python - 如何在列表中保持最小数字(从字符串转换为整数)?
- javascript - 在回调函数中访问全局变量
- system.reactive - 有没有告诉订阅观察者数量的 Rx.Net Operator?
- python - ValueError: int() 的无效文字,基数为 16