Spring 将SCLB与SCG中的多个服务器列表一起使用
我目前正在使用SCG访问我的服务器 没有服务发现,我直接获取主机名和端口 我的小豆:Spring 将SCLB与SCG中的多个服务器列表一起使用,spring,spring-cloud,spring-cloud-gateway,netflix-ribbon,spring-cloud-loadbalancer,Spring,Spring Cloud,Spring Cloud Gateway,Netflix Ribbon,Spring Cloud Loadbalancer,我目前正在使用SCG访问我的服务器 没有服务发现,我直接获取主机名和端口 我的小豆: @Bean public RouteLocator gateWayRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p.header(INSTANCE_TYPE, athenaProperties.getData().getPath())
@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
}
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);
}
}
有人在github上问了同样的问题:
但我看不出给出了任何动态的答案(答案是使用configurationspring.cloud.discovery.client.simple.instances.lbid1[I]
),虽然它确实有效,但我正在寻找使用代码的动态lb配置
我怎么做
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);
}
}
"lbid1": <list of servers>
"lbid2": <other list of servers>