我们知道spring cloud中restTemplate可以通过服务名调接口,加入@loadBalanced标签就实现了负载均衡的功能,那么spring cloud内部是如何实现的呢?

通过@loadBalanced我们进入标签

注释解释这个标签是标记为restTemplate,作为loadBalancerClient,接着去看loadBalancerClient

loadBalancerClient通过继承serviceInstanceChooser,主要包含以下几个抽象方法:

1、choose抽象方法,作用是通过serviceId获取到服务实例;

2、execute方法是执行请求;

3、reconstructURI方法是通过服务实例转换成ip:port的形式

通过loadBalancerClient所在包,我们发现LoadBalancerAutoConfiguration为自动配置类,该类主要作用:

1、创建LoadBalancerInterceptor拦截器

2、创建restTemplateCustomizer,用于增加拦截器

接着,我们看LoadBalancerInterceptor拦截器

通过这里我们可以看出,当一个restTemplate被@loadBalance标签注释时,调用请求的时候会被拦截,通过获取请求中的服务名,传入loadBalancer的执行方法,我们点击这个execute进入RibbonLoadBalancerClient的具体实现

可以看出通过传入的serverId获取server,进入ILoadBalancer可以看到这几个抽象方法

可以看到server类中有host和port,chooseServer有以下几个实现类

通过RibbonClientConfiguration,可以知道使用zoneAwareLoadBalancer来实现负载均衡

通过chooseServer获取到server后,下面,我们再回到RibbonLoadBalancerClient

可以看出通过request的apply发送实际的请求,从而实现从服务名变成host:port的请求转变

spring cloud ribbon源码解析(一)的更多相关文章

  1. spring cloud ribbon源码解析(二)

    在上一篇文章中主要梳理了ribbon的执行过程,这篇主要讲讲ribbon的负载均衡,ribbon的负载均衡是通过ILoadBalancer来实现的,对ILoadBalancer有以下几个类 1.Abs ...

  2. Feign 系列(05)Spring Cloud OpenFeign 源码解析

    Feign 系列(05)Spring Cloud OpenFeign 源码解析 [TOC] Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/ ...

  3. api网关揭秘--spring cloud gateway源码解析

    要想了解spring cloud gateway的源码,要熟悉spring webflux,我的上篇文章介绍了spring webflux. 1.gateway 和zuul对比 I am the au ...

  4. Spring Cloud Ribbon 源码分析---负载均衡算法

    上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现. 负载均衡整体是从IRule进去的: public interface IRule{ /* ...

  5. Spring Cloud Ribbon源码分析---负载均衡实现

    上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...

  6. Spring Security 解析(七) —— Spring Security Oauth2 源码解析

    Spring Security 解析(七) -- Spring Security Oauth2 源码解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...

  7. spring boot @Value源码解析

    Spring boot 的@Value只能用于bean中,在bean的实例化时,会给@Value的属性赋值:如下面的例子: @SpringBootApplication @Slf4j public c ...

  8. 异步任务spring @Async注解源码解析

    1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...

  9. Spring Security 访问控制 源码解析

    上篇 Spring Security 登录校验 源码解析  分析了使用Spring Security时用户登录时验证并返回token过程,本篇分析下用户带token访问时,如何验证用户登录状态及权限问 ...

随机推荐

  1. Win2003+apache+PHP+SqlServer2008 配置

    Win2003+apache+PHP+SqlServer2008 配置     安装前的准备: 1.Apache2.2.2 2.PHP5.2.17 3.SqlServer2008 4.sqlncli. ...

  2. gd库已打开,验证码不显示

    ob_start(); ob_clean();

  3. strops()

    <?php echo strpos("You love php, I love php too!","php"); ?>

  4. 我大中华微软MVP中国区人才库(转)

    出处:http://www.genshuixue.com/i-cxy/p/15349735 刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的asp.net从业经验,微软MSDN特约讲师 ...

  5. 基于swoole搭建聊天室程序

    1. 创建websocket服务器 swoole从1.7.9版本开始, 内置了websocket服务器功能,我们只需几行简单的PHP代码,就可以创建出一个异步非阻塞多进程的WebSocket服务器. ...

  6. nohup、&、setsid、fork和fg、bg究竟有啥区别?

    目录 目录 1 1. 名词解释 1 2. 什么是守护进程? 2 2.1. 后台运行 2 2.2. 解释关系 2 3. 以"&"方式运行有何问题? 2 4. fork 2 5 ...

  7. SpringMVC源码解析 - HandlerAdapter - HandlerMethodArgumentResolver

    HandlerMethodArgumentResolver主要负责执行handler前参数准备工作. 看个例子,红色部分的id初始化,填充值就是它干的活: @RequestMapping(value ...

  8. swift学习之UITabelView ----使用xib定义cell

    // //  TwoViewController.swift //  tab // //  Created by su on 15/12/7. //  Copyright © 2015年 tian. ...

  9. IntelliJ IDEA 2016.1.3(64) license server 与汉化

    license server:http://idea.iteblog.com/key.php 汉化:将resources_cn.jar 复制到安装IDEA安装目录下的lib文件夹中.重新打开即可. r ...

  10. 从数据池中捞取的存储过程控件使用完以后必须unprepare

    从数据池中捞取的存储过程控件使用完以后必须unprepare,否则会造成输入参数是仍是旧的BUG. 提示:动态创建的存储过程控件无此BUG.此BUG只限于从数据池中捞取的存储过程控件. functio ...