ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ribbon

2022-04-18 08:01:23  阅读:165  来源: 互联网

标签:负载 服务 netflix import com Ribbon


概述

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供 客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

负载均衡 + RestTemplate 调用

集中式与进程内

集中式 LB

即在服务的消费方和提供方之间使用独立的 LB 设施(可以是硬件,如 F5,也可以是软件,如 Nginx),又该设施负责把访问请求通过某种策略转发至服务的提供方。

进程内

将 LB 逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon 就属于进程内 LB,他只是一个类库,集成于消费方进程,消费方通过他来获取到服务提供方的地址。

工作步骤

  • 第一步:选择 EurekaServer,他优先选择在同一区域内负载较少的 server。
  • 第二步:再根据用户指定的策略,从 server 取到服务注册列表中选择一个地址。
    • 策略:轮询、随机和根据响应时间加权。

Ribbon核心组件IRule

IRule:根据特定算法中从服务列表中选取一个要访问的服务。

  • com.netflix.loadbalancer.RoundRobinRule:轮询;
  • com.netflix.loadbalancer.RandomRule:随机;
  • com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务;
  • WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务 ,然后选择一个并发量最小的服务;
  • AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

更改默认的负载均衡算法

官方文档明确给出了警告:

这个自定义配置类不能放在 @ComponentScan(启动类的同级或子级) 所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。

自定义配置类

package com.atguigu.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule() {
        // 定义为随机
        return new RandomRule();
    }

}

启动类上加注解

package com.atguigu.springcloud;

import com.atguigu.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }

}

@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)

主要就是这一行注释:

name:客户端的名称,也就是需要请求的地址;

configuration:功能区客户端的自定义;

负载均衡算法

原理

负载均衡算法:rest 接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后 rest 接口计数从 1 开始。

List<ServiceInstance> instances = discobveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

如:
    List[0] instances = 127.0.0.1:8002;
	List[1] instances = 127.0.0.1:8001;

8001 + 8002 组合成为集群,他们共计 2 台机器,集群总数为 2,按照轮询算法原理:

当总请求数为 1 时:1 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;

当总请求数为 2 时:2 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;

当总请求数为 3 时:3 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;

当总请求数为 4 时:4 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;

如此类推.......

标签:负载,服务,netflix,import,com,Ribbon
来源: https://www.cnblogs.com/lhnstart/p/16158103.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有