Spring 将SCLB与SCG中的多个服务器列表一起使用

Spring 将SCLB与SCG中的多个服务器列表一起使用,spring,spring-cloud,spring-cloud-gateway,netflix-ribbon,spring-cloud-loadbalancer,Spring,Spring Cloud,Spring Cloud Gateway,Netflix Ribbon,Spring Cloud Loadbalancer,我目前正在使用SCG访问我的服务器 没有服务发现,我直接获取主机名和端口 我的小豆: @Bean public RouteLocator gateWayRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p.header(INSTANCE_TYPE, athenaProperties.getData().getPath())

我目前正在使用SCG访问我的服务器

没有服务发现,我直接获取主机名和端口

我的小豆:

@Bean
public RouteLocator gateWayRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p.header(INSTANCE_TYPE, athenaProperties.getData().getPath())
                        .filters(f -> f.filter(dataFilter))
                        .uri(NO_OP))
                         //more routing
                .build();
}
我正在使用动态过滤器修改代码中的URL

@Component
public class DataFilter implements GatewayFilter, Ordered {

    public DataFilter(AthenaProperties athenaProperties) {
        this.athenaProperties = athenaProperties;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String host = getHost(request);
        Integer port = athenaProperties.getData().getPort();
        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, 
               createUri(exchange.getRequest().getURI(), host, port));
        return chain.filter(exchange);
    }
//additional methods 
}
CustomServiceInstanceListSupplier
返回服务器列表中的第二个


class CustomServiceInstanceListSupplier implements ServiceInstanceListSupplier {

    private final String serviceId;
    private final ServersData serversData;

    public CustomServiceInstanceListSupplier(String serviceId, ServersData serversData) {
        this.serviceId = serviceId;
        this.serversData = serversData;
    }

    @Override
    public String getServiceId() {
        return serviceId;
    }

    @Override
    public Flux<List<ServiceInstance>> get() {
        return Flux.just(serversData.getHosts().entrySet().stream()
                .map(this::createDefaultServiceInstance).collect(Collectors.toList()));
    }

    private ServiceInstance createDefaultServiceInstance(Map.Entry<String, String> assetToHostEntry) {
        return new DefaultServiceInstance(assetToHostEntry.getKey(), serviceId, assetToHostEntry.getValue(), serversData.getPort(), true);
    }

}

有人在github上问了同样的问题:

但我看不出给出了任何动态的答案(答案是使用configuration
spring.cloud.discovery.client.simple.instances.lbid1[I]
),虽然它确实有效,但我正在寻找使用代码的动态lb配置

我怎么做


class CustomServiceInstanceListSupplier implements ServiceInstanceListSupplier {

    private final String serviceId;
    private final ServersData serversData;

    public CustomServiceInstanceListSupplier(String serviceId, ServersData serversData) {
        this.serviceId = serviceId;
        this.serversData = serversData;
    }

    @Override
    public String getServiceId() {
        return serviceId;
    }

    @Override
    public Flux<List<ServiceInstance>> get() {
        return Flux.just(serversData.getHosts().entrySet().stream()
                .map(this::createDefaultServiceInstance).collect(Collectors.toList()));
    }

    private ServiceInstance createDefaultServiceInstance(Map.Entry<String, String> assetToHostEntry) {
        return new DefaultServiceInstance(assetToHostEntry.getKey(), serviceId, assetToHostEntry.getValue(), serversData.getPort(), true);
    }

}

"lbid1": <list of servers>

"lbid2": <other list of servers>