早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,随手发布到了个人知识星球,过了会有个朋友过来以下问题。 抽取半天时间学习spring-cloud-loadbalancer 的源码,整理出此文总结
git
Spring Cloud Hoxton.M2 是第一个整合新的loadbalancer实现来替代Ribbon的版本github
Spring Cloud Hoxton.M2 is the first release containing both blocking and non-blocking load balancer client implementations as an alternative to Netflix Ribbon which has entered maintenance mode.
spring-cloud-loadbalancer
替代ribbon,项目托管在<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.M2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencyManagement>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
@Configuration public class LbConfiguration { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } @GetMapping("/demo") public String doOtherStuff() { return restTemplate.getForObject("http://big-provider-server/demo", String.class); }
// 删除只保留了核心代码注意 public class BlockingLoadBalancerClient implements LoadBalancerClient { @Override public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException { // 根据 服务名称去查询可用实例 ServiceInstance serviceInstance = choose(serviceId); return execute(serviceId, serviceInstance, request); } @Override public ServiceInstance choose(String serviceId) { // 获取负载均衡策略 ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory .getInstance(serviceId); // 执行负载均衡策略获取能够实例 Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose()) .block(); return loadBalancerResponse.getServer(); } }
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { public Mono<Response<ServiceInstance>> choose(Request request) { ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable(); return supplier.get().collectList().map(instances -> { if (instances.isEmpty()) { log.warn("No servers available for service: " + this.serviceId); return new EmptyResponse(); } // TODO: enforce order? int pos = Math.abs(this.position.incrementAndGet()); ServiceInstance instance = instances.get(pos % instances.size()); return new DefaultResponse(instance); }); } }
ZoneAvoidanceRule
复合判断server所在区域的性能和server的可用性选择serverspring-cloud-loadbalancer
仅支持 重试操做的配置老老实实用 ribbon
spring
以上源码 https://github.com/pigxcloud/bigapp
欢迎关注 基于Spring Boot 2.1.七、 Spring Cloud Greenwich.SR二、 OAuth2 的RBAC 权限管理系统负载均衡
欢迎关注咱们得到更多的好玩JavaEE 实践maven
项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注ide