028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Ribbon是否能被spring-cloud-loadbalancer替代

今天就跟大家聊聊有关Ribbon是否能被spring-cloud-loadbalancer替代,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

专注于为中小企业提供成都网站建设、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业依兰免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

背景

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.
  1. 2017年spring 开始尝试开发新的项目 spring-cloud-loadbalancer 替代ribbon,项目托管在 spring-cloud-incubator 孵化器 (多提一嘴,spring cloud alibaba 等顶级的项目大多从此孵化出来的,代表着 spring cloud 的发展方向)

  2. 经过N个月的不维护,还以为spring 放弃此项目时,突然把此项目标记成归档迁移到spring-cloud-commons

  3. 发布2.2.0.M2 版本

如何使用


	
		
			org.springframework.cloud
			spring-cloud-dependencies
			Hoxton.M2
			pom
			import
		

	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery
	
		
			org.springframework.cloud
			spring-cloud-starter-netflix-ribbon
		
	

	org.springframework.cloud
	spring-cloud-loadbalancer
@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);
}

源码解析

LoadBalancerClient 实现

Ribbon是否能被spring-cloud-loadbalancer替代

// 删除只保留了核心代码注意
public class BlockingLoadBalancerClient implements LoadBalancerClient {

	@Override
	public  T execute(String serviceId, LoadBalancerRequest request)
			throws IOException {
		// 根据 服务名称去查询可用实例
		ServiceInstance serviceInstance = choose(serviceId);
		return execute(serviceId, serviceInstance, request);
	}

	@Override
	public ServiceInstance choose(String serviceId) {
	    // 获取负载均衡策略
		ReactiveLoadBalancer loadBalancer = loadBalancerClientFactory
				.getInstance(serviceId);
		// 执行负载均衡策略获取可以实例
		Response loadBalancerResponse = Mono.from(loadBalancer.choose())
				.block();
		return loadBalancerResponse.getServer();
	}

}

loadBalancer 负载均衡策略实现

Ribbon是否能被spring-cloud-loadbalancer替代

public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {
	public Mono> 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);
		});
	}

}

和ribbon 比较

默认负载均衡比较

配置方面丰富性

看完上述内容,你们对Ribbon是否能被spring-cloud-loadbalancer替代有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


网页题目:Ribbon是否能被spring-cloud-loadbalancer替代
网站链接:http://www.tsicrk.com/article/gccecc.html

其他资讯

让你的专属顾问为你服务

2.9442s