@Configuration public class MyLoadBalancerConfig { @Bean public ReactorServiceInstanceLoadBalancer reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerclientFactory){ String name = environment.getProperty(LoadBalancerclientFactOry.PROPERTY NAME); //返回随机轮询负载均衡方式 return new RandomLoadBalancer(loadBalancerClientfactory.getLazyProvider(name,ServiceInstanceListsupplier.class),name); }
System.out.println("执行自定义随机选取服务操作"); // 随机算法 int size = instances.size(); Random random = new Random(); ServiceInstance instance = instances.get(random.nextInt(size));
return new DefaultResponse(instance); } }
初始化自定义LoadBalancerConfig配置
1 2 3 4 5 6 7 8
@Configuration public class CustomLoadBalancerConfig {
@Bean public ReactorServiceInstanceLoadBalancer customLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider) { return new CustomRandomLoadBalancerClient(serviceInstanceListSupplierProvider); } }
通过@LoadBalancerClient注解指定自定义配置
1 2 3 4 5 6 7 8
@SpringBootApplication(scanBasePackages = {"org.geekbang.projects.cs"}) @MapperScan("org.geekbang.projects.cs.middleground.customer.mapper") @LoadBalancerClient(name = "integration-service", configuration = CustomLoadBalancerConfig.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
OpenFeign处理机制
通过RequestTemplate定制化请求处理机制
1 2 3 4 5 6 7 8
public class MyFeignRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate){ //Feign请求过程中,对于传输数据的各种定制化处理机制扩展 ... } }
// // 随机算法 // int size = instances.size(); // Random random = new Random(); // ServiceInstance instance = instances.get(random.nextInt(size)); // return new DefaultResponse(instance);
//直接使用Nacos提供的随机+权重算法获取实例列表 return new DefaultResponse(NacosBalancer.getHostByRandomWeight3(chooseInstances)); }
public static <T> List<T> filterList(Collection<T> from, Predicate<T> predicate) { if (CollUtil.isEmpty(from)) { return new ArrayList<>(); }