SpringCloud之Ribbon客户端负载原理分析(二)-RibbonLoadBalancerClient原理分析

SpringCloud之Ribbon客户端负载应用及原理分析
SpringCloud之Ribbon客户端负载原理分析(一)-LoadBalancerInterceptor原理分析
SpringCloud之Ribbon客户端负载原理分析(二)-RibbonLoadBalancerClient原理分析
SpringCloud之Ribbon客户端负载原理分析(三)-ILoadBalancer原理分析

本文主要内容:

了解RibbonLoadBalancerClient的处理流程及部分功能实现原理

  1. RibbonLoadBalancerClient如何存储和获取到LoadBalancer的
  2. 如何通过LoadBalancer获取Server实例(简略)
  3. 如何包装请求数据,并发送到目标服务器

一、前述

1.1、前文提要

上篇文章对LoadBalancerInterceptor原理分析:Spring Cloud Ribbon会为每一个增加了@LoadBalanced的Restemplate,设置一个LoadBalancerInterceptor负载均衡拦截器。

当restemplate发送请求时,LoadBalancerInterceptor会拦截请求数据,并封装成一个LoadBalancerRequest后,交由LoadBalancerClientt(即:RibbonLoadBalancerClient)进行处理。

二、RibbonLoadBalancerClient源码分析

LoadBalancerInterceptor调用LoadBalancerClient.execute()方法,实际会进入RibbonLoadBalancerClient..execute()方法,此方法会完成以下内容:

  1. getLoadBalancer(serviceId)方法:根据serviceId获取一个loadBalancer负载均衡器
  2. getServer(loadBalancer, hint)方法:通过loadBalancer负载均衡器,获得一个Server服务实例,Server中会存储一个服务节点的元数据,比如:host、port、isAliveFlag等属性
  3. new RibbonServe方法:将Server包装成RibbonServer(即:ServiceInstance)
  4. execute()方法:将Request请求数据发送到RibbonServer(ServiceInstance)服务器端
@Override
public <T> T execute(String serviceId, LoadBalancerRequest<T> request)
		throws IOException {
   
	return execute(serviceId, request, null);
}

public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint)
		throws IOException {
   
    // 1、获取一个ILoadBalancer负载均衡器
	ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
    // 2、从ILoadBalancer获取一个Server服务实例
	Server server = getServer(loadBalancer, hint);
	if (server == null) {
   
		throw new IllegalStateException("No instances available for " + serviceId);
	}
	// 3、将Server包装成RibbonServer(即:ServiceInstance)
    RibbonServer ribbonServer = new RibbonServer(serviceId, server,
			isSecure(server, serviceId),
			serverIntrospector(serviceId).getMetadata(server));
	// 4、将Request请求数据发送到RibbonServer服务端
	return execute(serviceId, ribbonServer, request);
}

下面我们来逐一分析这四个方法

2.1、getLoadBalancer(serviceId)方法

getLoadBal

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值