Ribbon负载均衡器

news2024/11/19 13:30:09

两种:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-9-22 没有上司的舞会

题目链接&#xff1a;没有上司的舞会 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 6010;int n; int happy[N]; int h[N], e[N], ne[N], idx; bool has_father[N];// 两个状态&#xff0c;选该节点或不选该…

李航老师《统计学习方法》第2章阅读笔记

感知机&#xff08;perceptron&#xff09;时二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1和-1二值。感知机对应于输入空间&#xff08;特征空间&#xff09;中将实例划分为正负两类的分离超平面 想象一下在一个平面…

spring:实现初始化动态bean|获取对象型数组配置文件

0. 引言 近期因为要完成实现中间件的工具包组件&#xff0c;其中涉及要读取对象型的数组配置文件&#xff0c;并且还要将其加载为bean&#xff0c;因为使用了spring 4.3.25.RELEASE版本&#xff0c;很多springboot的相关特性无法支持&#xff0c;因此特此记录&#xff0c;以方…

阿里云服务器u1和经济型e实例有什么区别?

阿里云服务器经济型e实例和云服务器u1有什么区别&#xff1f;同CPU内存配置下云服务器u1性能更强&#xff0c;u1实例价格也要更贵一些。经济型e实例属于共享型云服务器&#xff0c;不同实例vCPU会争抢物理CPU资源&#xff0c;并导致高负载时计算性能波动不稳定&#xff0c;而云…

实时更新进度条:JavaScript中的定时器和异步编程技巧

前言 在Web开发中&#xff0c;有许多场景需要实时地更新页面上的进度&#xff0c;例如上传文件、数据处理等。本文将介绍如何利用JavaScript中的定时器和异步编程技巧来实现实时更新进度&#xff0c;并探讨一些其他解决方案。 处理进度实时更新&#xff1a; 利用异步编程实现实…

可转债长期持有策略——收益与风险、利息收入、案例研究

可转债投资策略——长期持有策略 一、收益与风险的权衡 长期持有可转债是一种投资策略&#xff0c;旨在实现稳定的收益&#xff0c;并在投资期限内从可转债中获得利益。在采用这种策略时&#xff0c;投资者需要平衡可转债的收益和风险&#xff0c;以满足其财务目标。以下是关…

尝试访问启动磁盘设置时出错怎么办?

当出现“尝试访问启动磁盘设置时出错”这样的错误提示&#xff0c;而且启动转换控制面板打不开了时&#xff0c;是无法开启触摸板功能的。我们可以使用以下方法来解决问题。 1. 在Windows桌面左下角搜索框输入“计算机管理”后点击“打开”。 2. 点击“本地用户与组”&#xff…

树结构数据在table中回显 treeselect disabled

<el-table-column label"产业认定" align"center" prop"industryIdentification"><template slot-scope"scope"><treeselectv-if"scope.row.industryIdentification"v-model"scope.row.industryIdentif…

Zookeeper系统模型_客户端命令行

创建 创建ZK节点 语法结构&#xff1a; create [-s] [-e] path data acl 参数&#xff1a; -s&#xff1a;顺序节点-e&#xff1a;临时节点 默认情况下&#xff0c;不添加-s或者-e参数的&#xff0c;创建的是持久节点。 示例&#xff1a; [zk: localhost:2181(CONNECTED) …

Spring Cloud Alibaba Gateway全局token过滤、局部过滤访问时间超过50ms日志提示

文章目录 Spring Cloud Alibaba Gateway验证token在前篇的基础上加入依赖在filter包中创建tokenFilter Spring Cloud Alibaba Gateway局部过滤1.继承AbstractGatewayFilterFactory2.仿照AddRequestHeaderGatewayFilterFactory Spring Cloud Alibaba Gateway验证token 基础搭建…

linux上gitlab备份与还原

三 Gitlab备份 1.gitlab安装 1.1 添加镜像地址 添加镜像地址的目的是为了提高国内用户软件下载的速度&#xff0c;编辑(新建)文件gitlab-ce.repo&#xff0c;指令&#xff1a; vi /etc/yum.repos.d/gitlab-ce.repo复制 输入&#xff1a; [gitlab-ce] namegitlab-ce # 清华…

基于SSM+Vue的亿互游在线平台的设计与开发

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

LeetCode01

LeetCode01 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和 为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…

Unity制作射击游戏案例01

整理逻辑思路&#xff1a; //【业务逻辑】这个脚本用来1.控制物体移动旋转&#xff08;WASD&#xff09;、 2.发射子弹&#xff08;空格键&#xff09; //【程序逻辑2】 首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数 3.克隆子弹 4.让克隆的子弹往前跑 搭…

Seata 基于改良版雪花算法的分布式 UUID 生成器分析

一般来说&#xff0c;除了“全局唯一”这个基本属性之外&#xff0c;还会要求生成出来的 ID 具有“递增趋势”&#xff0c;这样的好处是能减少 MySQL 数据页分裂的情况&#xff0c;从而减少数据库的 IO 压力&#xff0c;提升服务的性能。 雪花算法&#xff0c;就是一个能生产全…

浅谈霍尔电流传感器在汽车电池管理系统中的应用

摘要&#xff1a; 随着电动汽车和混合动力汽车的需求和产量正在增加&#xff0c;两种类型的车辆都需要高电流容量的电池来运行50kW 或更高功率的电机&#xff0c;并且这些都使用高压系统。汽车电池管理系统中对于电流的测量检测需要隔离测量的方式&#xff0c;而霍尔电流传感器…

【DLL修复工具下载】一键修复电脑丢失d3dcompiler_47.dll问题方法

在我们使用电脑的过程中&#xff0c;有时候会遇到一些错误提示&#xff0c;其中“缺失 d3dcompiler_47.dll”就是比较常见的一种。那么&#xff0c;d3dcompiler_47.dll 到底是什么呢&#xff1f;为什么会出现缺失的情况&#xff1f;丢失 d3dcompiler_47.dll 又会对电脑产生什么…

电压放大器如何选型号和参数配置

选择适合的电压放大器型号和配置参数是设计电子系统中至关重要的一步。电压放大器是一种关键的电子器件&#xff0c;用于将输入电压信号放大到所需的输出电压级别。下面西安安泰将详细介绍如何选择电压放大器的型号和配置参数。 确定应用需求&#xff1a;首先&#xff0c;需要明…

MyBatis 日志模块

文章目录 前言LogLogFactory日志应用JDBC 日志BaseJdbcLoggerConnectionLogger应用实现 总结 前言 日志在我们开发过程中占据了一个非常重要的地位&#xff0c;是开发和运维管理之间的桥梁&#xff0c;在Java中的日志框架也非常多&#xff0c;Log4j、Log4j2、slf4j等&#xff…

孙宇晨:稳定币支付交易具百倍增长潜力 后FTX时代行业仍需修炼内功

9月14日,波场TRON创始人、火币HTX全球顾问委员会成员孙宇晨受邀出席于新加坡举办的TOKEN 2049,并参加了“生态系统和行业增长:展望加密货币的未来十年”主题板块的讨论。孙宇晨在发言中表示,接下来的 10 年里,加密货币和区块链的最大日常应用场景仍然是稳定币支付交易,预计将有…