再不看就删了!超详细的Ribbon源码解析

本文详细介绍了Ribbon作为Spring Cloud的客户端负载均衡器的工作原理和核心功能,包括从Eureka获取服务提供者列表、轮询算法及其实现,以及Ribbon如何与Eureka交互保持服务列表的更新。通过对源码的分析,揭示了Ribbon的负载均衡策略如RetryRule、ZoneAvoidanceRule等,并探讨了服务健康检查和更新机制。
摘要由CSDN通过智能技术生成

Ribbon简介

什么是Ribbon?

Ribbon是springcloud下的客户端负载均衡器,消费者在通过服务别名调用服务时,需要通过Ribbon做负载均衡获取实际的服务调用地址,然后通过httpclient的方式进行本地RPC远程调用。

Ribbon原理

Ribbon负载均衡算法主要是轮询算法,分为以下几步:

  1. 根据服务别名,从eureka获取服务提供者的列表
  2. 将列表缓存到本地
  3. 根据具体策略获取服务提供者

Ribbon的核心是负载均衡管理,另还有5个大功能点。如下图:

源码分析

事前准备

  1. 先搭建一个SpringCloud的项目,也可以从我的github上下载。地址:https://github.com/mmcLine/spring-cloud-study

  2. 拷贝以下代码

    @Configuration
    public class RestTemplateConfiguration {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return  new RestTemplate();
        }
    }
     @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/testRibbon/{id}")
        public User getTodayStatistic(@PathVariable("id") Integer id){
            String url  ="http://STUDY-USER/user/getUserById?id="+id;
            return restTemplate.getForObject(url, User.class);
        }

     

    代码都准备好了,可以开始分析了。

  3. 执行调用
  4. http://localhost:8005/trade/testRibbon/2

    为什么这么就能调用到服务提供者的方法?

    打断点,可以看到restTemplate里有两个拦截器,根据名字可以推断RetryLoadBalancerInterceptor是关键。

    跟踪到RetryLoadBalancerInterceptor类

    @Override
    	public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
    										final ClientHttpRequestExecution execution) throws IOException {
    		final URI originalUri = request.getURI();
    		//获取到service的name
    		final String serviceName = originalUri.getHost();
    		Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
    		//根据serviceName和LoadBalancerClient,LoadBalancedRetryPolicy里面包含了RibbonLoadBalancerContext和ServiceInstanceChooser
    		final LoadBalancedRetryPolicy retryPolicy = lbRetryFactory.createRetryPolicy(serviceName,
    				loadBalancer);
    		RetryTemplate template = createRetryTemplate(serviceName, request, retryPolicy);
    		//执行方法会进入到doExecute方法
    		return template.execute(context -> {
    			ServiceInstance serviceInstance = null;
    			if (context instanceof LoadBalancedRetryContext) {
    				LoadBalancedRetryContext lbCo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值