在scg中使用带有多个服务器列表的sclb

jrcvhitl  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(233)

我正在使用scg访问我的服务器,
没有服务发现,我直接获取主机名和端口
我的路线bean:

@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 
}

但在某些情况下,我想在所有可能的主人之间围攻 getHost 可以返回(通常我使用请求头来查找主机),
所以对于那些案子,我会回来的 createUri 以…的形式 lb://lbid1... ,但我似乎找不到如何将lb链接到服务器列表
我的问题是,如何在配置文件中使用sclb来实现这一点我需要添加什么?以便lb知道它应该在哪些服务器之间进行循环?
我发现最接近的是下面的答案,但它使用的是ribbon而不是sclb
使用功能区解决方案
任何帮助都将不胜感激
更新
我找到了解决办法
spring云负载均衡器
跨服务器示例的负载平衡不足
首先,注册ServiceInstanceListSupplierbean

@Bean
    @Primary
    public ServiceInstanceListSupplier serviceInstanceListSupplier() {
        return new CustomServiceInstanceListSupplier("lbid1", athenaProperties.getEngine());
    }

第二名 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);
    }

}

但现在我有另一个问题,我如何定义几个 ServiceInstanceListSupplier 在scg中(因为它只有1个 serviceId )? ServiceInstanceListSupplier 是一个bean,因此我只能创建一个。
例如,我想创建以下2磅:

"lbid1": <list of servers>

"lbid2": <other list of servers>

有人在github上问了同样的问题:问题
但我没有看到任何动态的答案(答案是使用配置) spring.cloud.discovery.client.simple.instances.lbid1[i] ),虽然它确实工作,我正在寻找一个动态的lb配置使用代码。
我该怎么做?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题