负载均衡的原理

SpringCloud 中负载均衡的原理

前情 : 启动了两个 UserService 客户端和一个 OrderService 客户端,且都已经注册到 Eureka 中。

服务消费者OrderService,使用注册中心的名字代替 ip 和端口,设置负载均衡策略,直接调用了其中
之一的服务提供者。

    /**
     *  创建 RestTemplate 并注入 Spring 容器
     *  RestTemplate 是Spring Cloud框架中的一个HTTP客户端工具,
     *  用于发送HTTP请求并与远程服务进行通信。
     *  它封装了常见的HTTP操作,使得在微服务架构中进行服务间通信更加方便。
     */
    @Bean
    @LoadBalanced   
    // order-service(服务消费者) 在调用多个 user-service(服务提供者) 时,使用负载均衡算法
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  1. 通过LoadBalancerInterceptor 负载均衡拦截器拦截到请求
@Override
   public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
   		final ClientHttpRequestExecution execution) throws IOException {
   	final URI originalUri = request.getURI();
   	String serviceName = originalUri.getHost();
   	Assert.state(serviceName != null,
   			"Request URI does not contain a valid hostname: " + originalUri);
   	return this.loadBalancer.execute(serviceName,
   			this.requestFactory.createRequest(request, body, execution));
   }
  1. 通过 RibbonLoadBalancerClient 获取url 中的服务 id
public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint)
			throws IOException {
	ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
	Server server = getServer(loadBalancer, hint);
	if (server == null) {
		throw new IllegalStateException("No instances available for " + serviceId);
	}
	RibbonServer ribbonServer = new RibbonServer(serviceId, server,
			isSecure(server, serviceId),
			serverIntrospector(serviceId).getMetadata(server));
	
	return execute(serviceId, ribbonServer, request);
}
  1. 从 eureka 注册中心拉取 user-service,返回服务列表
  2. 通过 IRule 接口选择一种负载均衡策略,拉取某个服务
public Server chooseServer(Object key) {
    if (this.counter == null) {
        this.counter = this.createCounter();
    }
    this.counter.increment();
    if (this.rule == null) {
        return null;
    } else {
        try {
            return this.rule.choose(key);
        } catch (Exception var3) {
            logger.warn("LoadBalancer [{}]:  Error choosing server for key {}", new Object[]{this.name, key, var3});
            return null;
        }
    }
}
  1. 修改 url 发起请求
    在这里插入图片描述

相关推荐

  1. Kong工作原理 - 负载均衡 - 基于DNS负载均衡

    2024-03-21 20:52:02       54 阅读
  2. 负载均衡原理和算法

    2024-03-21 20:52:02       37 阅读
  3. 负载均衡原理及其算法详解

    2024-03-21 20:52:02       28 阅读
  4. DNS负载均衡底层实现原理

    2024-03-21 20:52:02       36 阅读
  5. 负载均衡原理|算法

    2024-03-21 20:52:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 20:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 20:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 20:52:02       82 阅读
  4. Python语言-面向对象

    2024-03-21 20:52:02       91 阅读

热门阅读

  1. jsp基本语法

    2024-03-21 20:52:02       48 阅读
  2. C语言例3-40:减少不必要的数据类型转换的例子

    2024-03-21 20:52:02       45 阅读
  3. 动态规划 Leetcode 139 单词拆分

    2024-03-21 20:52:02       38 阅读
  4. pycharm专业版破解亲测可用记录一下

    2024-03-21 20:52:02       39 阅读
  5. 安卓面试题多线程 121-125

    2024-03-21 20:52:02       41 阅读
  6. C 练习实例83-求0—7所能组成的奇数个数

    2024-03-21 20:52:02       43 阅读
  7. 【vue自定义指令touch-move】

    2024-03-21 20:52:02       37 阅读
  8. 收集一些PostgreSQL的题目

    2024-03-21 20:52:02       46 阅读
  9. VHDL设计实现数字扫雷游戏及仿真

    2024-03-21 20:52:02       33 阅读
  10. 【ceph】配置 ceph dashboard 详细配置过程

    2024-03-21 20:52:02       35 阅读