微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将 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 举报,一经查实,本站将立刻删除。