如何解决将 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
任何帮助将不胜感激
更新
我在
中找到了解决方案在跨服务器实例负载均衡
首先注册一个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 举报,一经查实,本站将立刻删除。