我正在使用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配置使用代码。
我该怎么做?
暂无答案!
目前还没有任何答案,快来回答吧!