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

问题描述

我目前正在使用 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();
}

我使用动态过滤器修改代码中的网址

@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 知道它应该在它们之间循环的服务器列表?

我找到的最接近的是以下答案,但它使用的是功能区而不是 SCLB

Solution using ribbon

任何帮助将不胜感激

更新

我在

中找到了解决方

spring-cloud-loadbalancer

跨服务器实例负载均衡

首先注册一个ServiceInstanceListsupplier bean

    @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 上有人问了同样的问题:question

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

我该怎么做?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)