四、Spring Cloud Alibaba-Ribbon

news2024/11/25 16:34:09

一、什么是Ribbon

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx) 。
  • 客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。例spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请前通过负载均街算法选择一个服务器,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。

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

二、常见负载均衡算法

  • 随机,通过随机选择服务进行执行,一般这种方式使用较少。
  • 轮询,负载均衡默认实现方式,请求来之后排队处理。
  • 加权轮询,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力。
  • 地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。 ip-hash。
  • 最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。

三、Nacos使用Ribbon

nacos-discovery已经依赖了ribbon,可以不用再引入。
自行引用为:

<!--添加ribbon的依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

1、通过配置@LoadBalanced开启客户端负载均衡。

@Component
public class RestConfig {
    @Bean("RestTemplate")
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }
}

2、Controller请求其他服务是用服务名替换之前写死的地址。
如http://stock-service替换http://localhost:8816。

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    RestTemplate restTemplate;
    @RequestMapping("add")
    public String add(){
        System.out.println("新增订单");
        #String forObject = restTemplate.getForObject("http://localhost:8816/stock/reduce", String.class);
        String forObject = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);  
        return "新增订单,"+forObject;
    }

}

四、Ribbon负载均衡策略

这些策略统一的实现接口——iRule。我们可以用spring注入Bean(自行写iRule接口实现的策略)修改默认策略。
在这里插入图片描述

  • RandomRule: 随机选择一个服务实例。(后续案例使用该策略)
  • RoundRobinRule: 线性轮询选择。
  • RetryRule: 在轮询的基础上进行重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。
  • WeightedResponseTimeRule根据一个服务对的响应时间进行加权,响应时间越长,权重越小,被选中的可能性越低。
  • AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
  • BestAvailableRule过滤掉失效的服务实例,找出并发请求最小的服务实例来使用。
  • NacosRule: 一个nacos的权重策略,可以在nacos界面配置权重。(后续案例使用该策略和Nacos配合使用)
  • ZoneAvoidanceRule: 默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下(区域就近原则),类似于轮询(RandomRule)。

五、修改默认的负载均衡机制

两种方式进行修改,一种是基于配置类,一种是配置文件进行修改。

方法一、配置类方式实现

(1)复制出一个模块来重命名为使用,

复制出现问题解决办法:http://t.csdn.cn/m6L79。
特殊说明:需要找到复制源删除有问题的原文件,我找复制后的进行删除,搞了好一会才发现要删除复制源的。

(2)写一个配置类RuleConfig。放在ComponentScan自动扫描不到的地方。如图:

@Configuration
public class RuleConfig {

    //方法名一定要叫iRule
    @Bean
    public IRule iRule(){
        //返回一个随机的负载均衡策略
        return new RandomRule();
    }
}

在这里插入图片描述

说明:
1、自定义的配置类不能放在ComponentScan能够扫描的地方。
2、ComponentScan没有指定路径则默认SpringBootApplication所在的目录为扫描包。
3、 如果放在能够扫描的地方,会变成全局配置,会被所有服务提供方进行使用,就不能根据服务单独指定不一样的负载均衡机制。

(3)在启动类上加上RibbonClients注解

@RibbonClients(value = {
        @RibbonClient(name = "stock-service",configuration = RuleConfig.class)
})

说明:

  • value 是一个数组。可以配置多个RibbonClient,根据需要调用的服务,配置不一样的负载均衡策略。
  • name 是调用的服务名。
  • configuration 对应服务的策略,即配置成刚刚写的RuleConfig配置类,随机策略。

(4)测试 8830的ribbon服务请求stock-service服务(8816和8817端口)。
在这里插入图片描述

@RestController
@RequestMapping("/order")
public class OrderController {

    // http://localhost:8830/order/addNacos
    @RequestMapping("addNacos")
    public String addByNacos(){
        System.out.println("新增订单");
        String forObject = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
        return "新增订单,"+forObject;
    }

}

访问http://localhost:8830/order/addNacos。观察页面返回的端口,确实是8816和8817随机。

在这里插入图片描述

方法二、配置文件的方式实现—建议使用

(1)找到需要的策略类,
比如配置NacosRule-根据Nacos权重调用,全局搜索,Scope中找到路径。
在这里插入图片描述
(2)配置文件中新增Ribbon配置,NFLoadBalancerRuleClassName中策略路径需完整路径。去掉方法一中启动类上的RibbonClients注解,使用配置文件重启测试。

#调用的服务
stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

(3)登录nacos,将stock-service中的8817服务权重设置为5。

在这里插入图片描述
(4)同样访问http://localhost:8830/order/addNacos测试。观察确实8817请求次数更多。

六、自定义负载均衡器Ribbon

案例实现一个简易的随机负载均衡策略。

IRule是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个LadBalancer,这里定义它的目的主要是辅助负责均衡策略选取合活的服务端实例

1、写一个CustomRule 类,实现choose方法

//继承AbstractLoadBalancerRule,实现choose方法
public class CustomRule extends AbstractLoadBalancerRule {

    public Server choose(Object key) {
        //获取当前请求服务的实例
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        //获取到多个服务实例
        List<Server> reachableServers = loadBalancer.getReachableServers();

        //ThreadLocalRandom线程安全获取一个随机数
        int random = ThreadLocalRandom.current().nextInt(reachableServers.size());

        //返回一个服务实例
        return reachableServers.get(random);
    }


    //参数实例化
    public void initWithNiwsConfig(IClientConfig clientConfig) {

    }

}

2、修改配置文件为自定义的类即可。然后重启测试。

#调用的服务
stock-service:
  ribbon:
    #NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    NFLoadBalancerRuleClassName: com.tc.ribbon.CustomRule

3、默认CustomRule是调用时才去加载策略,可能比较慢,修改为项目启动时就加载好策略。
加入Ribbon配置即可。

#调用的服务
stock-service:
  ribbon:
    #NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    NFLoadBalancerRuleClassName: com.tc.ribbon.CustomRule

ribbon:
  eager-load:
    #开启ribbon饥饿加载
    enabled: true
    #配置需要饥饿加载的服务,多个用逗号隔开
    clients: stock-service

七、负载均衡器LoadBalancer介绍

Spring Cloud LoadBalancer是spring cloud官方自己提供的客户端负载均衡器,用来代替Ribbon。目前支持的负载均衡策略还是很少,难以替代。
新版本spring cloud 已经移除了Ribbon,使用LoadBalancer。
1、引入依赖
如果需要替换,只需要在pom中移除即可。


  <!--loadbalancer-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

    <!--提供RestTemplate支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <!--移除ribbon-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-start-netflix-ribbon</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

或者在配置文件中配置loadbalancer:

spring:
  application:
    name: order-service
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
    nacos:
      #nacos地址
      server-addr: 127.0.0.1:8848
      discovery:

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

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

相关文章

2023年全国硕士研究生入学统一考试英语(一)试题

2023年全国硕士研究生入学统一考试英语&#xff08;一&#xff09;试题 Section I Use of Englis Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B , C or D on the ANSWER SHEET.(10 points) Caravanserais were roads…

【P9】JMeter 用户定义的变量(User Defined Variables)

一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设计 &#xff08;1&#xff09;、Test Plan 右键 <<…

Linux cgroup

前言 Cgroup和namespace类似&#xff0c;也是将进程进程分组&#xff0c;但是目的与namespace不一样&#xff0c;namespace是为了隔离进程组之前的资源&#xff0c;而Cgroup是为了对一组进程进行统一的资源监控和限制。 Cgroup的组成 subsystem 一个subsystem就是一个内核模…

【HCIP】VLAN实验(Hybrid模式)

目录 需求&#xff1a; 一、设计 二、VLAN配置 三、交换机间实现trunk的功能 四、路由器配置 五、验证 需求&#xff1a; 1、PC1和PC3所在接口为access 2、PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC…

ARM嵌入式编译器-volatile关键字对编译器优化的影响

volatile限定符告知计算机&#xff0c;其他agent&#xff08;而不是变量所在的程序&#xff09;可以改变该变量的值。通常它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。要求编译器不要对其描述的对象作优化处理&#xff0c;对它的读写都需要从内存中访问。 使用…

文献阅读:LLaMA: Open and Efficient Foundation Language Models

文献阅读&#xff1a;LLaMA: Open and Efficient Foundation Language Models 1. 文章简介2. 模型训练 1. 训练数据2. 模型结构3. 模型训练 1. Optimizer2. 效率优化 3. 效果评估 1. 经典任务下效果 1. Commen Sense Reasoning2. Closed-book Question Answering3. Reading Co…

数据分析03——矩阵常用计算方法和函数

0、前言&#xff1a; 数组&#xff1a;计算机领域的概念矩阵&#xff1a;数学领域的概念对于Numpy而言&#xff0c;矩阵是数组的分支 1、创建矩阵&#xff1a; 字符串创建矩阵&#xff1a;mat1 np.matrix(‘1 2;3 4’)列表形式创建矩阵&#xff1a;mat2 np.matrix([[5, 6],…

MySQL基础(八)聚合函数

上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1. 聚合函数介绍 什么是聚合函数 聚合函数作…

深度学习目标检测项目实战(五)—基于mobilenetv2和resnet的图像背景抠图及其界面封装

深度学习目标检测项目实战(五)—基于mobilenetv2和resnet的图像背景抠图及其界面封装 该项目很有意思&#xff0c;也是比较前沿&#xff0c;项目主要参考了开源代码&#xff1a; https://github.com/PeterL1n/BackgroundMattingV2 环境搭建 kornia0.4.1 tensorboard2.3.0 to…

图像修复_criminis算法及改进算法学习小结

摘要 对图像修复专题学习情况的一个总结&#xff0c;学习内容包括&#xff1a; &#xff08;1&#xff09;综述文献的阅读及对图像修复的理解。 &#xff08;2&#xff09;criminis算法的仿真情况。 &#xff08;3&#xff09;criminis算法的改进算法的仿真 一、 前言 1&…

【leetcode】138.复制带随机指针的链表

《力扣》138.复制带随机指针的链表 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设…

[羊城杯 2020]a_piece_of_java

首先jd-gui进行反编译 简单查看发现有用的类就两个一个是 MainContrller.class和InfoInvocationHandler.class public class MainController {GetMapping({"/index"})public String index(CookieValue(value "data", required false) String cookieDa…

【C++】类和对象(初阶认识)#上篇#

目录 对面向过程和面向对象的初步认识 类的引入 封装 和 类的访问限定符 所以祖师爷在类中还引入了访问权限 用类定义变量 类的理解和对象的实例化 sizeof 计算类对象的大小 类对象的成员函数在公共代码区 this 指针 对面向过程和面向对象的初步认识 什么&#xff0c;是…

分片集群-搭建

分片集群 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。 为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。 垂直扩展&#xff1a;增加更多的…

阿里云服务器地域和可用区怎么选择合适?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

ROHM常见的电冰箱控制电路图,轻松了解冰箱工作原理

​冰箱是我们日常生活中使用频率非常高的电器&#xff0c;它可以将食物和饮料保存在低温下&#xff0c;以延长它们的保质期。冰箱的工作原理主要基于制冷循环和温度控制。 先看电路图&#xff1a; 1. 单门直冷式电冰箱重锤式控制电路 电路的基本组成&#xff1a;采用重锤式启…

win10安装pytorch全网最好用的教程[2023.5.7更新]

目录 0.关于pytorch a. 什么是 PyTorch &#xff1f; b. 为何选择 PyTorch &#xff1f; 1.安装pytorch 1.1确定关联性 1.2下载最新版本的pytorch 1.3.pytorch历史版本下载 1.4 避坑 1.4.1、猜测 1.4.2、验证 1.4.3、解决方案 1.5、检验 0.关于pytorch a. 什么是…

前端学习----webpack入门学习

webpack是前端项目工程化的具体解决方案 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及 代码压缩(将空格和注释全部消除&#xff0c;变成一行代码)、 处理浏览器端JavaScript的兼容性(只管写高级语法&#xff0c;自动向下兼容。例如ie8不支持let 语法…

【Shell】一天快速入门

1 Shell解析器 Linux提供的shell解析器有6种&#xff1a; /bin/sh /bin/bash /sbin/nologin /bin/csh /bin/dash /bin/tashsh是bash的软连接。 2 Shell脚本 2.1 hello.sh脚本 #!/bin/bash echo hello world!#! 告诉系统这个脚本需要什么解释器来执行&#xff1b; 脚本以#!…

NCNN----Monodepthv2单目深度估计 小米手机部署

题目要求&#xff1a;学习了解单目深度估计模型MonoDepthv2&#xff0c;基于NCNN推理框架部署到小米手机 MonoDepthv2 论文&#xff1a;Digging Into Self-Supervised Monocular Depth Estimation MonoDepthv2 源码&#xff1a;Monodepth2 GitHub 分析&#xff1a; 1&#xff0…