[Spring Cloud] Ribbon介绍与定义负载均衡

news2025/1/18 2:12:03

✨✨个人主页:沫洺的主页

📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                           📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

💖💖如果文章对你有所帮助请留下三连✨✨

 衔接上篇: [Spring Cloud] nacos作为服务中心_沫洺的博客-CSDN博客

🌿Ribbon介绍

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。

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

🍂Ribbon使用

创建子模块spring-cloud-ribbon(c服务)

添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--<version>2.2.1.RELEASE</version>-->
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

application.properties 创建c服务

server.port=8072
spring.application.name=nacos-c

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

Feign客户端调用a服务

@FeignClient(name="nacos-a")
public interface AServiceClient extends IUserService {
}

测试接口c服务调用a服务

@RestController
public class TestController {

    @Autowired
    private AServiceClient aServiceClient;
    @GetMapping("/test")
    public String callA(){
        return aServiceClient.getName(100);
    }
    @GetMapping("/test2")
    public String callA2(@RequestParam Integer time){
        return aServiceClient.getSleep(time);
    }
}

修改子模块user-api,然后打包package,安装install(目的放到本地仓库)

public interface IUserService {
    //通过用户Id返回用户名称   /user/name?id=12
    @GetMapping("/user/name")
    String getName(@RequestParam Integer id);

    //通过用户Id返回用户金额  /user/amount?id=12
    @GetMapping("/user/amount")
    Integer getAmount(@RequestParam Integer id);

    //通过Id返回动态睡眠  /user/sleep?time=12
    @GetMapping("/user/sleep")
    String getSleep(@RequestParam Integer time);
}

修改子模块spring-cloud-nacos-a,然后打包package,运行jar包,并指定两个端口(8069/8070)

@RestController
public class UserServiceController implements IUserService {
    @Value("${server.port}")
    private String port;

    @Override
    public String getName(Integer id) {
        return StrUtil.format("nacos a({}) 返回的id: {}" ,this.port,id);
    }
    @Override
    public Integer getAmount(Integer id) {
        return id*100;
    }
    @Override
    public String getSleep(Integer time) {
        //模拟time秒后读取数据资源
        ThreadUtil.sleep(time*1000);
        return StrUtil.format("nacos a({}) 睡眠了 {} 秒",this.port ,time);
    }
}

 开始访问c服务test接口,可以看到调用一次就换一个端口

 其实这就是Ribbon实现的客户端负载均衡算法和服务调用,默认是轮询规则

🍁Ribbon负载均衡规则

Ribbon负载均衡有7种规则,默认轮询。

参考文章: Spring Cloud Ribbon 中的7种负载均衡策略

🌾修改负载均衡规则 

建立自定义配置类

如下定义随机策略,那么调用一次就会随机换一个端口

@RestController
public class MyRuleConfig {
    @Bean
    public IRule rule(){
        //定义随机策略
        //return new RandomRule();
    }
}

需要什么策略就new什么策略的,当然了除了这7种外我们也可以自定义策略

自定义规则类

修改权重

要想自定义规则,只需要继承AbstractLoadBalancerRule类即可,然后安装自定义的规则定义choose方法

public class MyRule extends AbstractLoadBalancerRule {

    //注入Nacos提供的NacosDiscoveryProperties,来获取Nacos服务的属性(例如ip,权重等)
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    //juc包下,线程安全的Integer
    private static AtomicInteger count = new AtomicInteger(0);

    @Override
    //自动抛异常
    @SneakyThrows
    public Server choose(Object o) {
        //获取负载均衡器
        BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
        //获取服务名
        String serverName = loadBalancer.getName();
        //命名服务实例
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        //根据服务名获取所有服务实例,开启订阅
        List<Instance> allInstances = namingService.getAllInstances(serverName, true);
        //获取权重最大的实例
        Instance maxInstance = allInstances.stream().max(Comparator.comparing(Instance::getWeight)).get();
        //获取权重最小的实例
        Instance minInstance = allInstances.stream().min(Comparator.comparing(Instance::getWeight)).get();
        //初始化服务器
        Server server = null;
        //访问次数
        int count2 = count.addAndGet(1);
        //对访问次数取模
        int mod = count2 % 5;
        //余数为0时,选择端口为8069的服务器,否则选择8070服务器
        if (mod == 0) {
            //8069 权重3
            server = new Server(minInstance.getIp(), minInstance.getPort());
        } else {
            //8070 权重9
            server = new Server(maxInstance.getIp(), maxInstance.getPort());
        }
        return server;
    }
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

配置类添加注解@RibbonClients

@RestController
//@RibbonClients(defaultConfiguration = MyRule.class) //全局服务设置负载规则
//@RibbonClient(name = "nacos-a",configuration = MyRule.class) //某个服务,设置负载规则
//默认轮询
public class MyRuleConfig {
    @Bean
    public IRule rule(){
        //定义随机策略
        //return new RandomRule();

        //自定义策略:可以new,也可以用@RibbonClient注解
        return new MyRule();
    }
}

🍃设置超时时间 

application.properties

#Ribbon相关配置
##建立连接的超时时间
ribbon.ConnectionTimeout=5000
##连接成功后,读取资源数据时的超时配置
ribbon.ReadTimeout = 3000

访问c服务test2接口,测试读取资源数据超时配置

可以看到超过配置时间,就会报错

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

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

相关文章

QXlsx 使用

QXls使用分两种方式&#xff1a; 1 直接加载pri文件&#xff0c;就可以使用&#xff1b;2 编译后作为Qt的模块加载使用&#xff1b; 此文章主要针对第二种使用方式做记录&#xff0c;该方式又分为两种编译器进行说明&#xff1a; 第一种&#xff0c;使用MinGW64位编译器&…

nginx部署web项目(跟着搞不出来,来砍我)

前端打包成dist&#xff0c;详情可以参考我的vue博客 vue速学_我要用代码向我喜欢的女孩表白的博客-CSDN博客 nginx下载地址:nginx1.16.1离线安装包_nginx1.16.1依赖-Web服务器文档类资源-CSDN下载 &#xff08;如果报错缺少依赖&#xff0c;可以参考我的nginx-rtmp直播流博客…

文献阅读01_基于深度学习的个性化新闻推荐方法研究_20221114

论文信息 Subjects:新闻推荐;长短期用户表示;多视角学习;联合学习; &#xff08;1&#xff09;题目&#xff1a;Attention Is All You Need &#xff08;你需要的就是关注&#xff09; &#xff08;2&#xff09;文章下载地址&#xff1a;https://kreader.cnki.net/Kreader/Ca…

行业安全解决方案|腾讯打造汽车一体化安全防护,助力车企数字化安全

随着汽车智能化的发展&#xff0c;车联网、自动驾驶、车路协同等应用快速落地&#xff0c;汽车作为智能终端所产生的数据成指数级增长态势。然而&#xff0c;当汽车行业数字化转型正如火如荼进行时&#xff0c;新的安全挑战也接踵而至&#xff0c;车企甚至可能因忽视安全建设&a…

(八)centos7案例实战——docker仓库Harbor服务安装部署

前言 Harbor &#xff08;港口&#xff0c;港湾&#xff09;是一个用于存储和分发Docker镜像的企业级Registry服务器。我们可以使用dockerhub仓库或者阿里云docker仓库等第三方仓库管理我们的docker镜像。对于企业来说&#xff0c;条件允许&#xff0c;可以搭建自己的docker镜…

FEDformer 代码分析(1)

参数设置如下&#xff0c; --seq_len 是 96 --label_len 是 48 --pred_len 是 96 也就是说&#xff0c;输入是96的&#xff0c;预测96. batch_x 是 &#xff08;1,96,7&#xff09;的维度的。 batch_x_mark 是&#xff08;1,96,4&#xff09;的维度的。 batch_y的维度是…

嵌入式系统开发笔记107:层次化软件设计思想

文章目录前言一、嵌入式系统设计的本质二、基于寄存器结构的程序设计三、嵌入式系统优良程序的评判标准四、计算机上的软件分层五、嵌入式程序的分层设计前言 本文以思维导图的形式介绍层次化软件设计思想。 一、嵌入式系统设计的本质 二、基于寄存器结构的程序设计 三、嵌入式…

Java 内存溢出(一)原因、复现、排查

目录一、内存溢出原因二、内存溢出实例1、堆溢出2.虚拟机栈和本地方法栈溢出3.方法区和运行时常量池溢出4.本机直接内存溢出三、内存溢出排查内存溢出&#xff1a; 是指应用系统中存在无法回收的内存或使用的内存过多&#xff0c;最终使得程序运行要用到的内存大于虚拟机能提供…

[附源码]计算机毕业设计JAVA基于新高考模式下的排课系统

[附源码]计算机毕业设计JAVA基于新高考模式下的排课系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

强化学习论文分析5---多基站_强化学习_联邦学习_计算卸载

目录一、文章概述二、理论模型1.系统目标2.约束条件3.公式推导(1)任务量(2)卸载率(3)本地能耗(4)传输能耗(5)MEC计算能耗(6)总述三、算法架构----多基站联合强化学习1.网络结构图2.算法总述3.Actor网络(1).输入状态(2).输出动作4.Critic网络(1).环境奖励5.伪代码四、算法架构--…

信号线多长算长呢——之上升沿与时延的爱恨情仇

忆往昔岁月&#xff0c;看着PCB上弯弯曲曲的走线&#xff0c;看着书中所说的端接&#xff0c;想象着日后自己也可以这么牛逼&#xff0c;能够设计出这么复杂的电路。“过来焊板子啦”一句话又将我拉回了现实&#xff0c;哎&#xff0c;过来吸一会我们硬件攻城狮的精神鸦片——松…

实验四 软中断信号及处理

1.利用sleep、pause、alarm函数设定闹钟&#xff0c;定时显示信息。 #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<signal.h> int main(){int ret;alarm(50);sleep(30);retalarm(10);printf("%d\n",ret);pause();pri…

C++11

1. C11简介 相比于 C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更…

玩机搞机---脱离电脑 用手机给手机刷机 解锁bl 获取root的方法教程

友友们有时候手机出问题需要刷机而手头缺没有电脑的情况下该如何解决呢&#xff0c;今天的话题就聊聊 这方面的常识。其实类似手机给手机刷机的方法有很多&#xff0c;但原理都是一样的&#xff0c;有时候可以起到应急解决方法&#xff0c; 一 需要的工具与准备工作; 手机A …

长尾词挖掘免费工具-长尾关键词挖掘词

什么是关键词&#xff1f;在 SEO&#xff0c;搜索引擎优化的范畴里&#xff0c;关键词指的是用户输入到搜索框内的那一个&#xff0c;或者几个词&#xff0c;目的是为了找到他要的答案。搜索引擎收到用户发送的这几个词&#xff0c;或者说关键词后&#xff0c;就会试图找到最合…

同惠TH9310耐压测试仪应用举例

TH9310交直流耐压绝缘测试仪是一款小功率经济型智能安规测试仪器。体积小、重量轻、外形美观、操作简便。TH9320产品可广泛应用于家用电器、变压器、电气设备、元器件的安全性能检查。 应用举例&#xff1a; ■ 自动化测试系统 ■ 家用电器 ■ 变压器、电机 ■ 电气设备 …

Postman高频面试题及答案汇总(接口测试必备)

Postman在软件测试的面试中&#xff0c;可以说是必考题了&#xff0c;既然是高频考题&#xff0c;当然得为粉丝宝宝们整理一波题库喽~ 一、Postman在工作中使用流程是什么样的&#xff1f; 二、你使用过Postman的哪些功能&#xff1f; 三、Postman如何管理测试环境&#xff…

【改进灰狼优化算法】基于协调探索和开发能力的改进灰狼优化算法求解单目标优化问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

1.QML Hello world

目录1. 如何显示HelloWorld&#xff1f;2. QML工程如何创建&#xff1f;3. QML HelloWorld工程里有什么文件&#xff1f;1. 如何显示HelloWorld&#xff1f; 本系列文章基于Windows11Qt6.3&#xff0c;GUI开发第一步&#xff0c;显示一个Hello world。 import QtQuick //Qt5 需…

数据结构与算法是什么?

人们常说&#xff1a; 程序 数据结构 算法 当遇到一个问题&#xff0c;或者有一个需求时&#xff0c;要设计程序来解决问题&#xff0c;重要的一步就是设计算法&#xff0c;并选择或者说设计相应数据结构来实现算法。 一、数据结构 数据结构在问题解决中主要用来&#xf…