Ribbon负载均衡器

2023-11-02

两种:

1.1 集中式负载均衡,服务端负载均衡

硬件

nginx 轮询、负载、哈希、随机、权重

为什么要做负载均衡?

1.2 客户端负载均衡器

用客户端 负载均衡器 很多机制可以自定义

小知识:不想让别人调自己,只想用别人的,怎么做?

只需要不注册

spring.cloud.nacos.discovery.register-enabled = false

2.Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时机制,重试配置等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。

spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。

3.常见的负载均衡算法

如果使用的RestTemplate进行服务调用,那么创建RestTemplate的方法上面加@LoadBalanced注解就会开启Ribbon的负载均衡,Ribbon负载均衡有以下7中规则,默认轮询

  • 随机,通过随机选择服务进行执行,一般这种方式使用较少;

  • 轮询,负载均衡默认实现方式,请求来之后排队处理;

  • 加权轮询,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;

  • 地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。 ip --->hash

  • 最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。 最小活跃数

4.Nacos中使用Rabbion

nacos-discovery已经包含Ribbon的依赖,不需要再单独引入Ribbon

@LoadBalanced注解

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
//    负载器LoadBalance
    //如果使用了注册中心,必须加@LoadBalanced
    //作用:RestTemplate 就会把url上面的一级目录最为服务名,去注册中心找到对应的ip列表
    //根据算法使用其中一个ip,调用该ip对应的接口
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

5.Ribbon负载均衡策略

6.修改默认负载均衡策略

使用自己的规则-使用注解配置

//@Configuration
//@RibbonClient(name = "nacos-a",configuration = MyRule.class)
//@RibbonClients(defaultConfiguration = RoundRobinRule.class)//全局定义负载规则
public class RibbonConfig {

    //@Bean //全局定义负载规则
    public IRule rule(){
//        return new NacosRule();
//        return new RandomRule();
        return new RoundRobinRule();//默认轮询
//        return new MyRule();
    }
}

自定义规则

//@Component//需要注入,所以需放在组件里
@Slf4j
public class MyRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;
//    NacosDiscovery 相关的属性
    @Autowired
    private NacosServiceManager nacosServiceManager;

//    JUC包 AtomicInteger高并发情况下保证原子性的类
    private static AtomicInteger cout  = new AtomicInteger(0);
   @Override
   @SneakyThrows
//   直接帮我们生成异常程序的,简化代码
//   key:default key指的是集群名称
    public Server choose(Object key) {
/*自定义规则流程:1.先找group
       2.通过group找到namingService
       3.通过namingService找到目前相关用的实例
         3.1 实例为空,做出一个报警
         3.2 实例不为空,找到拿出最大和最小权重,通过算法(逢5过)

*/
//            获取集群,然后加载
//            String clusterName = this.nacosDiscoveryProperties.getClusterName();
            String group = this.nacosDiscoveryProperties.getGroup();
            DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer)this.getLoadBalancer();
            String name = loadBalancer.getName();
//                 name 是服务名
            NamingService namingService = this.nacosServiceManager.getNamingService(this.nacosDiscoveryProperties.getNacosProperties());
//           可用的服务列表
            List<Instance> instances = namingService.selectInstances(name, group, true);
            if (CollectionUtils.isEmpty(instances)) {
                log.warn("no instance in service {}", name);
                return null;
            }
//                List<Instance> instancesToChoose = instances;
//                if (StringUtils.isNotBlank(clusterName)) {
//                    List<Instance> sameClusterInstances = (List)instances.stream().filter((instancex) -> {
//                        return Objects.equals(clusterName, instancex.getClusterName());
//                    }).collect(Collectors.toList());
//                    if (!CollectionUtils.isEmpty(sameClusterInstances)) {
//                        instancesToChoose = sameClusterInstances;
//                    } else {
//                        log.warn("A cross-cluster call occurs,name = {}, clusterName = {}, instance = {}", new Object[]{name, clusterName, instances});
//                    }
//                }

       Instance maxInstance = instances.stream().max(Comparator.comparing(Instance::getWeight)).get();
       Instance minInstance = instances.stream().min(Comparator.comparing(Instance::getWeight)).get();

       int count2 = cout.incrementAndGet();
//       数量加1
//       取余
       int mod = count2 % 5;
       if ((mod == 0)) {
           log.debug("count={},mod={},使用min",count2,mod);
           return new NacosServer(minInstance);
       }else {
           log.debug("count={},mod={},使用max",count2,mod);
           return new NacosServer(maxInstance);
       }
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }
}

基于配置文件配置,调用指定微服务提供的服务时,使用对应的负载均衡算法

#配置全局的负载均衡规则(不生效)
default.ribbon.NFLoadBalancerRuleClassName = com.netflix.loadbalancer.RandomRule
#配置具体某一个服务个性化规则
nacos-a.ribbon.NFLoadBalancerRuleClassName = com.zxy.rule.MyRule

如果同时应用了以上两种方式去配置负载均衡,注解的优先级更高,则以注解为准.

因为配置文件的加载顺序在注解之前,后加载的配置会覆盖先前配置。

推荐使用配置文件,可以放进nacos,比较灵活

7.饥饿加载

在进行服务调用的时候,如果网络情况不好,第一次调用会超时。

Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。

开启饥饿加载,解决第一次调用慢的问题

#ribbon.eager-load.enabled=true
#开启ribbon饥饿加载
#ribbon.eager-load.clients=nacos-a
#配置order-service使用ribbon饥饿加载,多个使用逗号分隔

8.内核原理

代码详情springcloud: springcloud

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ribbon负载均衡器 的相关文章

随机推荐

  • VMware认证专家(VCP)详细介绍

    VMware认证专家 VCP 适合对象 系统管理员 系统工程师 IT架构师 VMware ESX ESXi vCenter Server 操作员 VMware认证专家 VCP 课程介绍 VMware vSphere安装 配置 管理 包括VM
  • hdoj-1069-Monkey and Banana【动态规划】

    Monkey and Banana Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 9489 Acc
  • 安装vmware tools不能复制粘贴解决方案

    根据网上大部分教程安装tools结果没办法使用 解决方案 先将之前安装的tools卸载干净 sudo apt get autoremove open vm tools 然后将虚拟机联网在网上去重新下载vmware tools sudo ap
  • selenium小项目实践

    1 斗鱼爬虫 爬取斗鱼直播平台的所有房间信息 https www douyu com directory all 1 1 思路分析 数据的位置 每个房间的数据都在id live list contentbox的ul中 实现翻页和控制程序结束
  • FileInputStream 读取文件内容

    public class Test public static void main String args throws IOException final String path D 1 txt 1 得到数据文件 File file ne
  • 用Java实现阶乘

    阶乘在高中时都学过 比如说5的阶乘用数学表示就是5 在写的通俗一点就是5 4 3 2 1 用一个数学公式表示就是n 1 2 3 n 阶乘也可以用代码实现 Java中有三中循环结构 先看for循环的 import java util Scan
  • Unity光照渲染设置

    先看效果图 下面是设置 1 将 Edit gt Player gt Other Settings Color Space这个调成Linear模式 有更好的阴影效果 2 光照Lighting的设置 Window gt Rendering gt
  • 论文阅读链接

    中文期刊 英文期刊 问题 中文期刊 机械工程学报 自动化学报 计算机学报 机器人 中国科学 系列 中国科学信息科学 中国科学技术科学 英文期刊 IEEE Xplore 出版 IEEE Transactions on Artificial I
  • Redis 查看value大小

    线上会经常遇到大key问题 这时候就需要通过 bigkeys来找出最大的key 但是往往和最大的key前缀相同的一类key都会比较大 所以打算一次性获取此类key中比较大的key 官方文档中查看获取value大小的时间成本较高 于是查看有关
  • docker镜像 ubuntu:22.04 21.04 apt-get update 报错 Problem executing scripts APT::Update::Post-Invoke ‘rm

    docker镜像 ubuntu 22 04 21 04 apt get update 报错 Problem executing scripts APT Update Post Invoke rm f var cache apt archiv
  • 因果推断学习笔记三——Uplift模型

    一 Uplift模型 因果推断在互联网界应用主要是基于Uplift model来预测额外收益提升ROI Uplift模型帮助商家计算人群营销敏感度 驱动收益模拟预算和投放策略制定 促成营销推广效率的最大化 同时如何衡量和预测营销干预带来的
  • 低功耗技术(一)动态功耗与静态功耗

    原创 AndyICer Andy的ICer之路 1月5日 低功耗技术 一 动态功耗与静态功耗 一 动态功耗 翻转功耗 Switching Power 翻转功耗是由充放电电容引起的动态功耗 其推导过程很简单 但是这个最终的结果却十分重要 sw
  • Jedis使用java连接Redis

    Maven创建 创建一个maven的项目 其中pom xml依赖为
  • 在Ubuntu中安装eclipse

    1 下载JDK和eclipse jdk下载网址 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html eclipse下载网址 ht
  • AD20铺铜操作及设置

    AD20铺铜方法 首先 建议铺铜前 先滴泪 提高信号完整性 1 铺铜 放置 gt 铺铜 2 铺铜时 先设置属性 如果以前设置过 不用重设 点键盘上的 Tab 键 调出 属性 界面 3 操作 沿着四个点 到第4点时 点鼠标左键 完成划区域 如
  • stm32同芯片但不同flash工程更换Device出现报错

    目录 1 问题描述 2 解决方案 1 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2 解决方案 更换Device 我是从ZE换为C8 把这个从HD更换为MD 解决
  • Three.js - 透视相机(PerspectiveCamera)(三)

    简介 在three js中 摄像机的作用就是不断的拍摄我们创建好的场景 然后通过渲染器渲染到屏幕中 想通过不同的角度观看场景 就需要修改摄像机的位置来拍摄场景 本文详细介绍的是透视相机 PerspectiveCamera 它是用来模拟人眼所
  • OpenWrt自定义luci页面来修改配置文件

    在使用OpenWrt路由器的过程中 经常需要根据需要改改配置文件然后重新启动服务什么的 一般的做法是SSH登录路由器后台 使用vi编辑器修改文件 然后使用 etc init d xxxx restart 来重启服务 次数多了就会觉得很繁琐
  • 一步步写嵌入式操作系统 中断处理

    简单的中断处理程序 简单的中断处理程序 1 获取被中断模式的将要执行的指令的地址到LR 2 将LR压入中断模式栈 3 将pc置为公共的中断服务函数入口地址 并记录下一条指令地址到LR 4 从公共的中断服务函数返回 5 从spsr恢复被中断模
  • Ribbon负载均衡器

    两种 1 1 集中式负载均衡 服务端负载均衡 硬件 nginx 轮询 负载 哈希 随机 权重 为什么要做负载均衡 1 2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识 不想让别人调自己 只想用别人的 怎么做 只需要不注