写点什么

SpringCloud-Ribbon 学习记录

作者:Geek_4df958
  • 2022 年 3 月 17 日
  • 本文字数:1284 字

    阅读完需:约 4 分钟

一、作用

负载均衡

二、使用方式

1、方式一

1、配置指定服务器地址。测试自行用 springboot 启两个项目

2、调用项目 application.properties 配置如下

# 配置服务的提供者的地址spring-cloud-order-service.ribbon.listOfServers=\  localhost:8080,localhost:8082
复制代码

3、代码使用

使用 LoadBalancerClient+RestTemplate

 @Autowired  LoadBalancerClient loadBalancerClient;
@Autowired RestTemplate restTemplate;
ServiceInstance serviceInstance=loadBalancerClient.choose("service-name"); String url=String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()+"/service");*/ restTemplate.getForObject(url,String.class);
复制代码

2、方式二

使用 @LoadBalanced

	 @Bean    @LoadBalanced    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){        return restTemplateBuilder.build();    }        //直接调用服务名     restTemplate.getForObject("http://service-name/service",String.class);
复制代码

3、方式三

cloud 中 Feign 配合 LoadBalanced 一起使用

@FeignClient("shz-server-provider")public interface FeignServiceClient {      @LoadBalanced    @GetMapping(value = "/shz/{message}")    String getString (@PathVariable String  message );
}
复制代码

三、源码流程思路

3.1、代码大致流程和类图

细节翻代码

1、装配类:org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration

  • 装配 bean:RibbonLoadBalancerClient

  • 基础 SpringClientFactory 初始化 RibbonLoadBalancedRetryFactory

2、 装配类:org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration

  • 依次装载如下类:LoadBalancerInterceptor。代码执行看这里

  • RestTemplateCustomizer:对修饰 @LoadBalanced 注解的 RestTemplate 添加拦截器

  • SmartInitializingSingleton:对 RestTemplate 包装

3、入口方法:org.springframework.web.client.RestTemplate#doExecute

类结构:


4、获取创建工厂创建 clientRequest

调用父类 org.springframework.http.client.support.InterceptingHttpAccessor#getRequestFactory

创建 InterceptingClientHttpRequestFactory

工厂创建 org.springframework.http.client.InterceptingClientHttpRequest 对象

类图


5、重点代码:response = request.execute();

步骤四里创建的对象:

最终执行到:InterceptingClientHttpRequest

org.springframework.http.client.InterceptingClientHttpRequest.InterceptingRequestExecution#execute

6、存在拦截器。就执行拦截器

这里装载了拦截器 org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor#intercept

7、追踪代码执行到

org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#execute(java.lang.String, org.springframework.cloud.client.loadbalancer.LoadBalancerRequest<T>, java.lang.Object)

8、负载策略选择

com.netflix.loadbalancer.BaseLoadBalancer#chooseServer

9、负载规则类


对应的策略代码。对应实现类阅读。

10、默认轮询策略


发布于: 刚刚阅读数: 2
用户头像

Geek_4df958

关注

还未添加个人签名 2022.03.14 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloud-Ribbon学习记录_SpringCloud_Geek_4df958_InfoQ写作平台