web*_*ich 5 spring-cloud spring-cloud-gateway
我是 spring-cloud-gateway 的新手,如果我按预期方式解决了我的问题,我无法回答这个问题。我希望有人能给我指出正确的方向,提供建议或提供一些示例性示例代码。
要求:我的 spring-cloud-gateway 服务的传入请求应转发到正确的后端服务(有 X 个这样的后端服务,每个后端服务负责特定任务)。请求本身不包含足够的信息来决定路由到哪个后端服务。
存在附加的 REST 服务,可将任意 URL 映射到负责后端服务名称。响应格式是一些小的 JSON,包含要转发到的后端服务的名称。
使用 spring-cloud-gateway 实现此功能的最简单/最佳/最智能/预期的解决方案是什么?
我尝试实现一个GatewayFilter首先调用映射服务并取决于GATEWAY_REQUEST_URL_ATTR交换结果集的方法。这工作正常。但我还有其他问题。
.uri("not://needed"))路线设置中的部分 可以省略吗?
为什么订单金额需要高于9999?(参见代码示例)
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes().route(r -> r
.alwaysTrue()
.filters(f -> f.filter(new CustomRequestFilter()))
.uri("not://needed")) // how to omit ?
.build();
}
public static class CustomRequestFilter implements GatewayFilter, Ordered {
@Override
public int getOrder() {
return 10000; // why order > 9999 ? (below 10000 does not work)
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return getBackendServiceMappingResult(exchange.getRequest().getURI().toString()) //async call to REST service mapping URL->backend service name
.flatMap(mappingResult -> {
URI uri = mapServiceNameToBackendService(mappingResult.getServiceName());
exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, uri);
return chain.filter(exchange);
});
}
private URI mapServiceNameToBackendService(String serviceName) {
try {
switch (serviceName) {
case "serviceA": return new URI("http://httpbin.org:80/get");
case "serviceB": return new URI("https://someotherhost:443/");
}
} catch (URISyntaxException e) {
//ignore
}
return null;
}
}
static class MappingResult {
String serviceName;
public String getServiceName() {
return serviceName;
}
}
static Mono<MappingResult> getBackendServiceMappingResult(String uri) {
WebClient client = WebClient.create("http://localhost:8080");
return client.get().uri(uriBuilder -> uriBuilder.path("/mapping").queryParam("uri", uri).build()).retrieve().bodyToMono(MappingResult.class);
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法(使用 spring-cloud-gateway)来解决需求?
Raj*_*eev -1
你可以用这个
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes().route(r ->
r.alwaysTrue()
.filters(f-> {
f.changeRequestUri(serverWebExchange -> buildRequestUri(serverWebExchange, CustomRequestFilter));
return f;
})
.uri(env.getProperty("birdeye.platform.url")))
.build();
Run Code Online (Sandbox Code Playgroud)
私有可选的buildRequestUri(ServerWebExchange交换,CustomRequestFilter customRequestFilter){
boolean updateuri = true;
if(updateuri) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().pathWithinApplication().value();
try {
uriBiulder = UriComponentsBuilder.fromUri(new URI(backendUri)).path(backendPath)
} catch (URISyntaxException e) {
e.printStackTrace();
}
}else {
uriBiulder = new URI("https://paytm.com:8080/category/create")
}
return Optional.of(uriBiulder);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |