spring cloud 后面版本默认使用LoadBalancer为负载均衡器
全局负载均衡器设置
@LoadBalancerClients(defaultConfiguration = {LbConfig.class})
public class xxxxxxServerApplication {
public static void main(String[] args) {
SpringApplication.run(xxxxxxServerApplication .class, args);
}
}
在启动类上增加注解LoadBalancerClients以及相关配置
LbConfig 配置Bean
public class LbConfig {
// 配置负载均衡策略
@Bean
public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new MyLB(loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId);
}
}
自定义负载均衡策略实现
/**
* Created by IntelliJ IDEA.
* 自定义负载均衡策略
* @Author :
* @create 2023/4/25 9:24
*/
public class MyLB implements ReactorServiceInstanceLoadBalancer {
private String serviceId;
@Value("${spring.profiles.active}")
private String active;
private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
/**
* @param serviceInstanceListSupplierProvider a provider of
* {@link ServiceInstanceListSupplier} that will be used to get available instances
* @param serviceId id of the service for which to choose an instance
*/
public MyLB(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId) {
this.serviceId = serviceId;
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
}
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
.getIfAvailable(NoopServiceInstanceListSupplier::new);
return supplier.get(request).next().map(p -> getInstanceResponse(p));
}
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances){
if (instances.isEmpty()) {
return new EmptyResponse();
}
NacosServiceInstance instanceResult = null;
//开发环境执行 将特定应用的请求路由到指定实例
if ("dev".equals(active) && "xxxxxx".equals(serviceId)) {
instanceResult = new NacosServiceInstance();
instanceResult.setServiceId(serviceId);
//新地址ip
instanceResult.setHost("xxxxxx");
//新地址端口
instanceResult.setPort(8080);
//是否https
instanceResult.setSecure(false);
}
// 如果指定的实例不可用,则随机取一个可用的服务
if (instanceResult == null) {
return new DefaultResponse(instances.get(0));
}
return new DefaultResponse(instanceResult);
}
}
初级使用综上所述。
问题1:在此处只能修改新地址的ip加端口,不能修改路由
箭头位置为负载均衡之后得到的实例对象,上面的url已经在这之前从request中获取出来了,并且是final的,所以此处不能修改路由。