SpringCloud学习—Ribbon:负责均衡及Ribbon

news2024/11/17 3:28:08

ribbno是什么?

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

ribbon能干什么?

        LB,即负载均衡(Load Balance) ,在微服务或分布式集群中经常用的一种应用。
        负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用) .
        常见的负载均衡软件有 Nginx,Lvs等等
        dubbo、SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义

负载均衡简单分类:

集中式LB
        即在服务的消费方和提供方之间使用独立的LB设施,如Nginx, 由该设施负责把访问请求通过某种策略转发至服务的提供方!
进程式LB
        将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。
        

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

在的消费者客户端集成ribbon

在消费者 配置Eureka和Ribbon负载均衡依赖

pom.xml

<!--Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--Ribbon负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

修改application.yml配置

server:
  port: 8004

eureka:
  client:
    register-with-eureka: false #不向Eureka中注册自己
    service-url:
      defaultZone: http://localhost:8005/eureka/

在配置类的RestTemplate方法加上注解@LoadBalanced实现ribbon的负载均衡

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced //配置负载均衡实现RestTemplate
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }


}

配置完成后,我们就可以通过服务名来访问其他服务。把提供者的地址,改成服务名后,启动代码访问接口

private static final String REST_URL_PERFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";

当前提供方只有一个项目,当前体会不到负载均衡,所以需要创建多个提供方来实现负载均衡

再创建两个提供者以及两个数据库,新建的提供者的结构与第一个提供者的相同

添加依赖,与第一个提供者的依赖相同

新建两个提供者的application.yml如下(只是端口号不同即可)

server:
  port: 8006


mybatis:
  type-aliases-package: com.zlt.springcloud.pojo
  mapper-locations: classpath:mapper/*.xml

spring:
  application:
    name: springcloud-provider-dept
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?
    username: root
    password: 123456
    hikari:
      pool-name: DateHikariCP
      # ???????
      minimum-idle: 5
      # ???????,??600000(10??)
      idle-timeout: 1800000
      # ????????10
      maximum-pool-size: 10
      # ?????????????
      auto-commit: true
      # ?????????0???????1800000?30???
      max-lifetime: 18000000
      # ?????????30000?30??
      connection-timeout: 30000

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8005/eureka/
  instance:
    instance-id: springcloud-provider-8006 #修改eureak上默认描述的信息

info:
  app.name: springcloud02
  company.name: hahaha

添加完成后。启动服务端、三个提供者、以及消费者。

在eureka注册中心可以看到,一个服务中有三个实例

localhost:8004/consumer/dept/list 访问,多次刷新,我们这次可以直观的看到显示不同服务的数据,这次我们可直观的感受到负载均衡的应用。 这是ribbon默认的算法,通过轮询访问实例。

 

Ribbon负载均衡的算法模式

  • RoundRobinRule 轮询(默认模式)
  • RandomRule 随机
  • RetryRuke 先按轮询获取服务,如果服务获取失败,则会在指定的时间内进行重试
  • AvailabilityFilteringRule  先过滤掉跳闸的或者访问很慢的服务,对剩下的服务轮询

 如何使用其他模式呢?

在消费者的配置类里面进行配置,配置一个IRule类,里面返回需要的模式就好了,比如这里是随机模式

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced //配置负载均衡实现RestTemplate
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @Bean
    public IRule myRule(){
        return new RandomRule();
    }


}

启动服务器、提供者、消费者,然后访问3次http://localhost:8004//consumer/getlist

发现访问三个实例的顺序是随机的

 

 

 

自定义规则

在主目录外 创建myrule文件包 

在myrule下创建MyRule配置类

在myrule包下创建DiyRandomRule,双击shift搜索 RandomRule 全部复制,改为自己自定义算法负载均衡

public class DiyRandomRule extends AbstractLoadBalancerRule {
    //代码全是复制的 DiyRandomRule.class的,自定义负载均衡需要自己修改
 
    //当前自定义负载均衡:
    //每个服务访问5次。换下一个服务
    //total=0,默认=0,如果=5,指向下一个服务节点
    //index=0,默认0,如果total=5,则inedx+1
 
    private int totla=0;//被调用的次数
    private int currentIndex=0;//当前是谁在提供服务
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;
 
            while (server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
 
                List<Server> upList = lb.getReachableServers();//获得活着的服务
                List<Server> allList = lb.getAllServers();//获得全部的服务
                int serverCount = allList.size();
                if (serverCount == 0) {
                    return null;
                }
 
                //int index = this.chooseRandomInt(serverCount);//生成区间随机数
                //server = (Server) upList.get(index);//从活着的服务中,随机获取一个
 
               //================自定义负载均衡算法==================
                if(totla<5){
                    server = upList.get(currentIndex);
                    totla++;
                }else{
                    totla=0;
                    currentIndex++;
                    if (currentIndex>=upList.size()){//当前节点大于活着的数量
                        currentIndex = 0;
                    }
                    server=upList.get(currentIndex);//从活着的服务中,获取指定的服务来进行操作
                }
               //====================================================
                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }
 
                    server = null;
                    Thread.yield();
                }
            }
 
            return server;
        }
    }
 
    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }
 
    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(), key);
    }
 
    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}

在消费者启动器上添加自定义负载均衡配置引用的@RibbonClien注解

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = MyRule.class)
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}

重启服务, 访问多次http://localhost:8004//consumer/getlist

我们可看到页面每刷新五次值会更改 

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

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

相关文章

【UE4】局域网多人联机 Demo

效果 亲测可以打包后在两个电脑上联机运行&#xff08;前提是在同一个局域网内&#xff0c;互相能ping通&#xff09; 步骤 1. 首先新建一个第三人称角色模板工程 2. 在多玩家选项中&#xff0c;设置玩家数量为2 选择在新建编辑器窗口中运行 3. 新建一个父类为Character的蓝…

基于linux下的高并发服务器开发(第三章)- 3.12 生产者和消费者模型

/*生产者消费者模型&#xff08;粗略的版本&#xff09; */ #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h>// 创建一个互斥量 pthread_mutex_t mutex;struct Node{int num;struct Node *next; };// 头结点 struct…

微信小程序授权登录时先判断是否勾选协议再弹出获取手机号的弹窗

思路&#xff1a;设置两个一样的按钮&#xff0c;一个用来判断是否已勾选&#xff1b;另一个是授权登录的按钮&#xff0c;用来获取用户信息 <button class"btn1" wx:if"{{ checked1}}" open-type"getPhoneNumber" bindgetphonenumber"g…

【每日一题】2050. 并行课程 III

【每日一题】2050. 并行课程 III 2050. 并行课程 III题目描述解题思路 2050. 并行课程 III 题目描述 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[j] [prevCoursej, nextCour…

Jetson全系列平台升级命令合集

进入刷机模式: NVIDIA Jetson是通过Micro-USB/USB TYPE-C接口升级系统(具体参考不同载板说明),更新前需让Jetson进入Recovery 模式。Recovery 模式下可以进行文件系统更新包含: 内核Kernel,启动Bootloader,文件系统Filesystem等。 进入 Recovery 模式的步骤: 1)关闭系…

WEB APIs day4 (2)

三、M端事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

数据安全:DataSecurity Plus

随着数字化时代的来临&#xff0c;数据成为了企业和个人生活中不可或缺的一部分。然而&#xff0c;数据的增长和广泛应用也带来了许多安全挑战。数据泄露、黑客攻击和恶意软件成为了威胁数据安全的主要因素。在这个充满风险的环境中&#xff0c;DataSecurity Plus作为一种强大的…

计算机二级Python基本操作题-序号42

1. 根据斐波那契数列的定义&#xff0c;F(0)0&#xff0c;F(1)1&#xff0c;F(n)F(n-1)F(n-2)(n>2)&#xff0c;输出不大于50的序列元素。 例如&#xff1a;屏幕输出示例为&#xff1a; 0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;…&#xff08;略…

docker部署vue项目

材料&#xff1a; 1.打包好的vue的dist文件夹 2.docker环境 运行环境结构图&#xff1a; dist&#xff1a;打包的项目 default.conf: nginx的配置文件 gzip on; #开启或关闭gzip on off gzip_disable "msie6"; gzip_buffers 4 16k; gzip_comp_level 8; gzip_typ…

Nuclei漏洞扫描工具

Nuclei漏洞扫描工具&#xff1a; Nuclei 是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发&#xff0c;具有很强的可配置性、可扩展性和易用性。 提供 TCP、DNS、HTTP、FILE 等各类协议的扫描&#xff0c;通过强大且灵活的模板&#xff0c;可以使用 Nucl…

电商运营的方法

1、以后干,不如现在干 1.1 做代理,搞研发 1.2 自建店铺,去看其他店铺的设计样板 1.3 记住网店挣钱三要点:装修,物流,产品资源 1.4 记住你的职责,让别人明白怎么做,仔细看资料,搞清楚细节 2、如何打开机器人 3.设置自动回复 Ctrl + tab 4.如何做基础销量,做一个刷…

查看8080端口会不会被占用

相关命令 查看8080端口会不会被占用 netstat -ano | findstr 8080 查看 终止占用端口xxx的进程 taskkill /f /pid xxx 具体步骤 第一步&#xff1a;点击起始菜单&#xff08;或是通过winR快捷键&#xff09;&#xff0c;在输入框中输入cmd&#xff0c;点击确定&#x…

十七章:FickleNet:使用随机推理进行弱监督和半监督语义图像分割

0.摘要 弱监督语义图像分割的主要障碍在于从粗糙的图像级注释中获取像素级信息的难度。大多数基于图像级注释的方法使用从分类器获得的定位地图&#xff0c;但这些地图仅关注对象的小区别部分&#xff0c;不捕捉精确的边界。FickleNet探索由通用深度神经网络创建的特征图上的各…

环境搭建-Ubuntu20.04.6系统TensorFlow BenchMark的GPU测试

1. 下载Ubuntu20.04.6镜像 登录阿里云官方镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2. 测试环境 Server OS&#xff1a;Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version&#xff1a;24.0.5, build ced0996 docker-com…

MSP432自主开发笔记5:IIC通信移植与驱动AT24Cxx存储芯片

今日学习移植MSP432的IIC总线协议&#xff0c;并用此驱动AT24C02芯片实现写入以及读取的功能&#xff0c;然后实现打印开机复位次数的效果。 文章贴出测试工程&#xff0c;测试截图&#xff0c;测试代码~ 其实是实在看不懂MSP432有关于FLASH存储操作相关的英文手册与例程&…

怎么学习Java并发编程相关技术? - 易智编译EaseEditing

学习Java并发编程可以通过多种方式进行&#xff0c;包括但不限于以下几种&#xff1a; 在线教程和学习平台&#xff1a; 网上有许多免费和付费的Java并发编程教程和学习平台&#xff0c;如Coursera、Udemy、edX、Codecademy等。这些平台提供结构化的课程和练习&#xff0c;适…

Goby 漏洞发布|Metabase JDBC 远程代码执行漏洞(CVE-2023-38646)

漏洞名称&#xff1a;Metabase JDBC 远程代码执行漏洞&#xff08;CVE-2023-38646&#xff09; English Name&#xff1a;Metabase JDBC Remote Code Execution Vulnerability (CVE-2023-38646) CVSS core: 9.8 影响资产数&#xff1a;66604 漏洞描述&#xff1a; Metabas…

初识计算机系统

计算机系统是由硬件和系统软件组成的&#xff0c;它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化&#xff0c;但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件&#xff0c;它们又执行着相似的功能。 一、信息就是位上下文 我们通…

Python基础入门教程(上)

目录 一、你好Python 1.1、Python安装 win版 Linux版 1.2、第一个Python程序 二、Python基本语法 2.1、字面量 2.2、注释 2.3、变量 2.4、数据类型 type()函数 字符串类型的不同定义方式 2.5、数据类型转换 ​编辑 2.6、标识符 2.7、运算符 2.8、字符串扩展 …

教育机构视频播放时观看行为分析有哪些应用?

教育机构视频播放时观看行为分析有哪些应用&#xff1f; 观看行为分析 观看行为分析是指我们平台基于视频大数据分析&#xff0c;能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示&#xff0c;我们平台云点播视频的每一次播放&#xff0…