实用篇-Ribbon负载均衡

news/2024/7/10 0:19:45 标签: ribbon, 负载均衡, java

一、负载均衡原理

回想一下上面的 '服务发现',order-service微服务向user-service微服务发送请求,但是user-service有两个,也就是开启了两个user-service实例,且端口不同,一个是8081,另一个是8082,下面我们将详细学一下请求在过程中经历了什么,如下图

其中负载均衡的各种策略是在IRule接口里面,下面将会深入学习这个IRule接口

二、负载均衡策略

Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则,IRule有很多实现类,如下继承关系图

每一个实现类都是一种规则,上图只是简单标注一下,下图是详细的

如何修改负载均衡策略。负载均衡策略默认是轮询,如何修改为随机呢。有两种方式如下

第一种: 代码方式(作用于全局即order服务访问任何微服务都是遵循这个规则的)。在order-service中的OrderApplication类中,定义一个新的IRule。简单理解就是在项目的引导类创建一个类型为IRule的bean

java">    /**
     * 配置负载均衡规则为随机
     * 注入spring容器
     * @return
     */
    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }

第二种: 配置文件方式(只作用于某个服务)。在order-service的application.yml文件中,添加新的配置也可以修改规则

针对某个微服务而言的

# UserService是你注册到Eureka时的服务名称。注意顶格写就行,不用写在spring:属性里面
UserService:
  ribbon:
    # 负载均衡策略。不一定是RandomRule,还可以是其它,如上图那些都可。RandomRule表示把负载均衡策略修改为随机
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

测试

http://localhost:8080/order/104访问这个路径,并把参数设置为101,102,103,104,分别进行访问,可以看到8081端口访问到了3次,而8082端口只访问到了1次,可见,在访问次数较少的时候,确实是随机策略,但是当访问次数增多时,可以预见,还是均衡的

三、Ribbon饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建Ribbon的LoadBalancerClient客户端,请求时间会很长(第一次访问时间长)

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置就可以开启饥饿加载。在order-service微服务的application.yml添加如下

ribbon:
  eager-load:
    enabled: true  # 开启饥饿加载
    # 指定对UserService这个服务开启饥饿加载
    #UserService是你注册到Eureka时的服务名称。如果有多个服务需要做饥饿加载,就-往下写
    clients:
     - UserService
     - xxService

由于这里我们的调用服务只有一个,所以我们添加后配置如下

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver

      # Eureka相关配置
  application:
        # order的服务名称。也就是这个order-service注册到Eureka之后,这个order-service会叫什么名字
   name: OrderService

mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

eureka:
  client:
    service-url:
      # eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个order-service微服务注册给哪个Eureka
      defaultZone: http://localhost:8686/eureka
ribbon:
  eager-load:
    enabled: true  # 开启饥饿加载
    # 指定对UserService这个服务开启饥饿加载
    #UserService是你注册到Eureka时的服务名称。如果有多个服务需要做饥饿加载,就-往下写
    clients:
     - UserService

配置完后,重启OrderService的启动类 


http://www.niftyadmin.cn/n/5128122.html

相关文章

进程和多线程

目录 进程 1. 如何管理进程 2. 进程调度 3. 内存管理 4. 进程间通信 多线程 线程和进程的关系: 线程安全问题 进程 一个正在运行的程序,就是一个 进程,进程是一个重要的 "软件资源",是由操作系统内核负责管理的。每个进程都对应一些资源,在上图中…

【算法练习Day30】无重叠区间 划分字母区间合并区间

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 无重叠区间划分字母区间合并…

基于机器视觉的车道线检测 计算机竞赛

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…

C++学习 day--21 地震监测系统实现、内存泄漏检测工具

1、项目需求 地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以 及强度。 预测方法 地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测 系统会从文件中读取相应的能量数据&…

接口自动化测试实操

实现思路 使用excel管理用例用例信息,requests模块发送http请求,实现了记录日志,邮件发送测试报告的功能 目录结构如下: 下面直接上代码: 统筹脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24…

AI与Prompt:解锁软件开发团队的魔法咒语,在复杂任务上生成正确率更高的代码

AI与Prompt:解锁软件开发团队的魔法咒语 写在最前面论文:基于ChatGPT的自协作代码生成将团队协作理论应用于代码生成的研究自协作框架原理1、DOL任务分配2、共享黑板协作3、Instance实例化 案例说明简单任务:基本操作,生成的结果1…

ubuntu扩大运行内存, 防止编译卡死

首先查看交换分区大小 grep SwapTotal /proc/meminfo 1、关闭交换空间 sudo swapoff -a 2、扩充交换空间大小,count64就是64G 1G x 64 sudo dd if/dev/zero of/swapfile bs1G count64 3、设置权限 sudo chmod 600 /swapfile 4、指定交换空间对应的设备文件 …

构建客户门户的痛点及低代码工具解决方案

企业如何做好数字化转型呢? 如果笼统地说起“数字化转型”,这个概念太大了,它涉及到了企业管理中的方方面面。数字化转型是一个持续不断的过程,既要在整体上进行数字规划,也需要从细节入手,将每一个步骤进…