Ribbon负载均衡(二)Ribbon负载均衡策略

2023-10-27

Ribbon负载均衡策略


Ribbon默认的是轮询策略,那么还有其他策略么?该如何使用其他策略
Ribbon 一共7 种策略

  1. 轮询策略 RoundRobinRule
  2. 随机策略 RandomRule
  3. 轮询重试策略 RetryRule
  4. 响应速度决定权重 WeightedResponseTimeRule
  5. 最优可用 BestAvailableRule, 采用并发连接数判断最优,连接数最小的节点
  6. 可用性过滤规则 AvailabilityFilteringRule
  7. 区域内可用性能最优 ZoneAvoidanceRule

如果需要一些前置配置的比如服务创建及Eureka使用,可以看下上一篇文章
Ribbon负载均衡(一)Ribbon实战
我使用的版本如下

本文使用的版本是 Springboot-2.6.7 ,Spring Cloud -2021.0.2 , Eureka 版本3.1.2

在这里插入图片描述这坑爹玩意,这里面在Eureka 下面的jar包中是没有ribbon的, 没IRule接口,如何定义负载均衡策略 ?推荐使用 Springcloud LoadBalancer 替换Ribbon

Springcloud LoadBalancer只有两种负载均衡策略+自定义负载均衡策略
在这里插入图片描述


springcloud 2020.0.1 版本之后 删除了eureka中的ribbon,替代ribbon的是spring cloud自带的LoadBalancer
Spring-cloud-starter-loadbalancer 的jar 这个应该是和Ribbon的功能一样,但是他就提供了RandomLoadBalancer 随机 和RoundRobinLoadBalancer 轮询的方式,默认使用的是轮询的方式
在这里插入图片描述

1.默认-轮询策略

我们改造一下

1.1 修改User服务,使用Ribbon默认轮询策略

增加config/RestTemplateConfig 配置文件, 引入RestTemplate便于访问http接口

1.2 RestTemplate配置

RestTemplateConfig.java

package com.ribbon.user.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

        //如果不加上面的注释 @LoadBalanced 就不会从eureka上获取 order服务地址, 也就不会使用负载均衡,
        // 你访问的 http://order/order order服务的host就会找不到
        @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

1.3 RestTemplate访问Order订单服务
package com.ribbon.user.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class UserController {


    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/user")
    public String test() {
        log.info("client 发起UserController");
        return "user";
    }


    @GetMapping("/testribbon")
    public String testRibbon() {

        //restTemplate 请求访问 order订单服务的 order URL ,
        // 参数URL   http://order/order   第一个order 就是服务名字 就是注册在Eureka上的 服务名字 第二个order就是 controller 入口
        // 第二个参数String.class 就是 访问返回值
        String result = restTemplate.getForObject("http://order/order", String.class);
        log.info("user 发起UserController 测试ribbon 调用 :{} ", result);
        return result;
    }

}

1.4 重启user服务

访问 localhost:8088/testribbon
如果报错, 看下你的RestTemplate种的@LoadBalanced 注解是否加上,不加上默认是使用正常的restTemplate 访问IP+PORT ,你的URL是 http://order/order 不会去Eureka上获取order服务的地址及端口的

没有@LoadBalanced 注解 会报如下错误
nested exception is java.net.UnknownHostException: order] with root cause
java.net.UnknownHostException: order

2022-05-15 21:51:03.169 ERROR 6216 --- [nio-8088-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://order/order": order; nested exception is java.net.UnknownHostException: order] with root cause

java.net.UnknownHostException: order
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_181]

服务正常启动

1.5 测试Ribbon轮询访问

访问testribbon接口,看看RestTemplate访问的是否是轮询访问三个节点中的一个
可以看到顺序那都是 two,one,three,的确是轮询访问三个服务
在这里插入图片描述

2.随机策略

如何实现Ribbon对order服务随机策略?我们只要定制规则即可? 但是我们已经没了Ribbon 所以你是引入不了 IRule 接口去重新定义Rule负载均衡策略的,咋办?????

SpringCloud重新定义了一套 ReactorLoadBalancer 策略
在这里插入图片描述

2.1 定义RandomLoadBalancer 随机负载均衡策略

定义随机策略

package com.ribbon.user.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;


/**
 * 这里不需要 @configuration注解  不需要 不需要!!!!
 * 它可以在RestTemplateConfig中指定 Configuration CustomLoadBalancerConfiguration
 */
public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

为什么这个类上不加 @Configuration 让Spring 扫描到它? 因为官方文档中给除了明确说法 不要加注释@Configuration 或者你可以在Spring 包扫描外 新建这个配置
在这里插入图片描述

2.2 LoadBalancerClients指定使用策略

修改RestTemplateConfig 配置文件 ,很重要!!!!!
配置LoadBalancerClients 指定你的 service服务 及使用的负载均衡策略

package com.ribbon.user.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;


@Configuration

//在这里配置我们自定义的LoadBalancer策略
// 如果扩展算法 需要自己去实现ReactorServiceInstanceLoadBalancer接口
// 标准@LoadBalancerClients(defaultConfiguration = {name = "CLOUD-PAYMENT-SERVICE", configuration = CustomLoadBalancerConfiguration.class})
//注意这里的name属性 需要和eureka页面中的服务提供者名字保持一致
@LoadBalancerClient(name = "order", configuration = CustomLoadBalancerConfiguration.class)
public class RestTemplateConfig {

    //如果不加上面的注释 @LoadBalanced 就不会从eureka上获取 order服务地址, 也就不会使用负载均衡,
    // 你访问的 http://order/order order服务的host就会找不到
    @Bean
    @LoadBalanced
    //使用这个     @LoadBalanced 注解给restTemplate赋予了负载均衡的能力
    RestTemplate restTemplate() {
        return new RestTemplate();
    }


}

2.3 重启user服务,验证随机策略

访问 http://localhost:8088/testribbon 接口 可以看到 随机取调用某台节点
实现了随机访问的负载均衡模式
在这里插入图片描述


至此我们已经简单的可以使用 SpringCloud LoadBalancer了 , 这两种都是基本的负载均衡策略,下一篇 我们介绍下 如何用 SpringCloud LoadBalancer 取自定义负载均衡策略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ribbon负载均衡(二)Ribbon负载均衡策略 的相关文章

随机推荐

  • 线性代数-向量,矩阵,线性变换

    一 向量 向量要求具有两个条件 长度 大小 方向 二维 三维 计算机中 向量可看做列表 图中第一个列表有两行 我们说它是二维向量 第二个列表有四行 我们说他是四维向量 向量的运算 向量加法 向量加法 将对应的行相加 将向量w的起点平移到向量
  • Java基础(2)面向对象的理解

    面向对象学习 面向对象与面向过程的区别 面向过程思想适合简单 不需要协作的任务 面向对象需要很多协作才能完成 面向对象就应运而生了 object 对象 instance 实例 都是解决问题的思维模式 都是代码组织的方式 解决简单问题可以使用
  • 通过文件夹文件获取文件夹大小

    思路就是便利文件夹下的每个文件 碰到子文件夹递归进去继续找文件 所有的文件大小累加起来 int GetFolderSize LPCTSTR szPath TCHAR szFileFilter 512 TCHAR szFilePath 512
  • mysql的sql语句没错但是报错,sql语句可以正常执行,但是报错:【merge sql error, dbType mysql, sql :】...

    错误信息如下 2017 09 06 19 03 41 186 ERROR method com alibaba druid filter stat StatFilter mergeSql StatFilter java 147 merge
  • 基于有道API的命令行词典(golang版)

    Godict 本项目地址 近期一直再使用golang语言开发一些工具 相关的后端技术链 golang orm postgresql gin jwt logrus 和对应前端的技术链 vue iview axios vue router 基本
  • matlab逆变器原理,MATLAB中的单相全桥逆变器电路建模与仿真

    电子技术设计和应用电子设计和应用电子技术O 3969 j issn 1000 0755 201 5 03 020 MATLAB中的单相全桥逆变器电路建模与仿真杨露容军刘凯周雷李仁贵 湖南工学院信息与通信工程学院 湖南岳阳 描述了全桥逆变器电
  • 什么是MapReduce,MapReduce的工作流程和原理是什么

    一 MapReduce的概念 MapReduce是一种编程模型 用于大规模数据集 大于1TB 的并行运算 概念 Map 映射 和 Reduce 归约 和它们的主要思想 都是从函数式编程语言里借来的 还有从矢量编程语言里借来的特性 它极大地方
  • 对拦截器的小小理解

    对于初学架构的 color red 小白 color 来讲 拦截器绝对是一把需要掌握的 color red 利器 color 那么自己从以下几个方面 谈谈对拦截器的小小思考 拦截器的方法在Action执行前或执行后自动执行 从而将通用的操作
  • 吐血解决磁盘占用率100%

    吐血解决磁盘占用率100 问题简述 解决步骤 吐血解决 磁盘利用率高的建议 问题简述 一次偶然使用电脑后 发现每次开机后 磁盘长时间占用率达到100 带来的影响是打开浏览器 打开本地电脑磁盘特别卡 解决步骤 1 尝试了网络上提供的绝大部分方
  • 常用的范数求导

    矢量范数的偏导数 L1范数不可微 但是存在次梯度 即是次微分的 L1范数的次梯度如下 x x 1 sign x begin equation begin aligned frac partial partial mathbf x mathb
  • 【CV with Pytorch】第 8 章 :图像超分辨率

    随着高分辨率图像捕获代理的出现 图像中捕获的信息是巨大的 技术已经从超高清转向 4K 和 8K 分辨率 如今 电影正在使用高分辨率帧 但是 在某些情况下 他们需要将低分辨率图像增强为高分辨率图像 想象这样一个场景 电影的主角正试图确定从一张
  • 第一站:探索JavaWeb的神秘世界

    欢迎来到 JavaWeb的奇妙冒险 教学系列 在这里 我们将探索Web开发的奥秘 让你在学习的过程中不仅轻松愉快 还能掌握高质量的知识 JavaWeb的奇妙冒险 第一站 探索JavaWeb的神秘世界 1 什么是JavaWeb 2 为什么学习
  • 2022-03-03JAVA面试笔试题记录

    最近在学习JAVA技术基础 也尝试练习一些JAVA面试中的编程题来巩固相关的知识点 具体的问题和代码如下 问题1 package com interview demo 利用条件运算符的嵌套来完成此题 学习成绩 gt 90分的同学用A表示 6
  • 决策树(Decision Tree,DT)(ID3、C4.5、剪枝、CART)

    目录 1 算法简介 2 特征选择 3 生成决策树 ID3 C4 5 4 修剪决策树 5 CART算法 CART回归树的生成 CART分类树的生成 CART剪枝 1 算法简介 决策树模型是树形结构 既可以用于分类 也可以用于回归 一颗决策树由
  • Mysql数据库基础(四)—— 表的字段类型(Mysql数据类型)

    Mysql的数据类型是一种约束 为了确保数据插入和存储的一致性 一旦我们插入的数据不合法 比如插入与字段类型不符的数据 Mysql会直接终止 这一点上和C语言就有区别 C语言存在隐式类型转换 即便类型不一致 编译器也不会报错 除此之外 虽然
  • 语义分割模型LinkNet介绍

    语义分割模型LinkNet 模型提出的背景 网络结构 实验结果 结论 GitHub代码链接 LinkNet是2017年CVPR上的一篇论文 论文地址 https arxiv org abs 1707 03718 由于网上的论文笔记以及讲解不
  • 推荐收藏

    本文将对数据竞赛的 技巧 进行全面的总结 同时还会分享下个人对比赛方法论的思考 前者比较客观 总结了不同数据类型下涉及到的比赛技巧 后者稍微主观 是我个人对解决比赛思路的总结 2019年下半年对我触动很大的两个知识分享是 志峰现场讲解的 T
  • VLAN是什么,我们为什么需要它?

    VLAN是一组逻辑上的设备和用户 这些设备和用户并不受物理位置的限制 可以根据功能 部门及应用等因素将它们组织起来 相互之间的通信 任何典型的LAN环境都包括各种各样的设备和计算机系统 它们都有各自的用途 有些设备应用是特有的 语音 数据
  • ABAP 新语法记录(一)

    主要内容 内联声明 构造表达式 内表操作 Open SQL 其他 本文列出了ABAP新语法的一些使用方式 供大家学习参考 内联声明 代码实现 pre amp 主题一 内联声明 语法 DATA FILED SYMBOL 1 定义变量 2 定义
  • Ribbon负载均衡(二)Ribbon负载均衡策略

    Ribbon负载均衡策略 文章目录 Ribbon负载均衡策略 1 默认 轮询策略 1 1 修改User服务 使用Ribbon默认轮询策略 1 2 RestTemplate配置 1 3 RestTemplate访问Order订单服务 1 4