Ribbon负载均衡器

2023-09-19 11:49:16

两种:

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

更多推荐

Github上1.1KFork的C++笔记

编程语言(C/C++)原文链接,如果觉得本文对你有所帮助,欢迎去原地址点个Star⭐。侵删https://github.com/linw7/Skill-Tre目录Chapter1Chapter2Chapter3Chapter4编程基础面向对象基础标准模板库编译及调试内容Chapter1:编程基础C/C++的内容又多又杂

结构型设计模式

结构型设计模式结构型设计模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、亨元模式。1.代理模式实现方式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是为了控制访问,而非加强功能

HTML实现移动端布局与页面自适应

我们所说的布局方式,这里我们通常指的是width和height在不同页面情况下面的改变。常见页面的布局方式有静态布局(px布局,就是固定其高宽,不论页面怎样放大缩小,其占领的依旧是,使用px固定了的高宽)流式布局(LiquidLayout)主要的划分区域的尺寸使用百分数(100%)(搭配min-*、max-*属性使用)

【Intel 黑客松大赛】基于YOLO的杂草-农作物检测分类系统

目录一、赛题简介:计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端四、InteloneAP

认识 AIGC ,浅淡 AIGC 的那些事—— AIGC:用 AI 创造万物

文章目录🎨关于封面🔥关于活动📋前言🎯什么是AIGC?🧩AIGC:用AI创造万物🧩AIGC的意义与发展🎯AIGC的发展历程🧩人工智能生成内容的发展历程与概念🧩早期萌芽阶段(1950s-990s)🧩沉淀积累阶段(1990s-2010s)🧩快速发展阶段(1990s-2010s)🎯AIGC峰会分享🧩A

极客时间:深入浅出计算机组成原理【文章笔记 & 思考总结】

本篇博客是学习过程中的笔记、思考和总结。原文链接:https://time.geekbang.org/column/intro/100026001?tab=catalog开篇词|为什么你需要学习计算机组成原理?01|冯·诺依曼体系结构:计算机组成的金字塔计算机的基本硬件组成冯·诺依曼体系结构总结延伸推荐阅读课后思考开篇

腾讯云AI绘画:探究AI创意与技术的新边界

目录一、2023的“网红词汇”——AI绘画二、智能文生图1、智能文生图的应用场景2、风格和配置的多样性3、输入一段话,腾讯云AI绘画给你生成一张图4、文本描述生成图像,惊艳全场三、智能图生图:重新定义图像美学1、智能图生图的多元应用场景2、试试看,上传大黄的照片会变成什么?3、支持辅助文本描述4、“打油诗”也能出图?四

PHP实践:用Yconf配置扩展为项目插上性能的翅膀

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。🏆本文已收录于PHP专栏:PHP进阶实战教程。🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。🎉欢迎

ThreeJS-3D教学一基础场景创建

Three.js是一个开源的JS3D图形库,用于创建和展示高性能、交互式的3D图形场景。它建立在WebGL技术之上,并提供了丰富的功能和工具,使开发者可以轻松地构建令人惊叹的3D可视化效果。Three.js提供了一套完整的工具和API,用于创建和管理3D场景、几何体、纹理、光照、材质和相机等方面。它具有强大的渲染引擎,

分享一下蛋糕店在微信小程序上可以实现什么功能

蛋糕店在微信小程序上可以实现的功能微信小程序作为一种新型的商业模式,正逐渐成为各行各业拓展线上业务的重要手段。对于蛋糕店来说,开发微信小程序可以实现以下功能:一、展示产品和服务微信小程序可以作为蛋糕店的产品展示平台,展示店内的蛋糕品种、价格、口味、配料等信息。同时,小程序还可以提供预订服务,用户可以通过小程序提前预定蛋

Direct3D纹理映射

借助纹理映射技术,我们可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感,例如创建一个立方体然后为其每个面映射一个板条纹理,从而将该立方体变为一个板条箱,在Direct3D中纹理用接口IDirect3DTexture9来表示,纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单

热文推荐