• 【微服务~原始真解】Spring Cloud —— 实现负载均衡


    在这里插入图片描述

    ??这里是【秒懂·云原生】,关注我学习云原生不迷路
    ??如果对你有帮助,给博主一个免费的点赞以示鼓励
    欢迎各位??点赞??评论收藏

    ??专栏介绍

    【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。

    ??本期介绍

    主要介绍Spring Cloud —— Ribbon 实现负载均衡

    文章目录

    Ribbon 实现负载均衡

    Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的。

    Spring Cloud Ribbon 提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。

    序号

    实现类

    负载均衡策略

    1

    RoundRobinRule

    按照线性轮询策略,即按照一定的顺序依次选取服务实例

    2

    RandomRule

    随机选取一个服务实例

    3

    RetryRule

    按照RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回null 。

    4

    WeightedResponseTimeRule

    WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。

    根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。

    5

    BestAvailableRule

    继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。

    6

    AvailabilityFilteringRule

    先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。

    7

    ZoneAvoidanceRule

    默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。

    下面我们就来通过一个实例来验证下,Ribbon 默认是使用什么策略选取服务实例的。

    一、 在 MySQL 数据库中执行以下 SQL 语句,准备测试数据。

    DROP DATABASE IF EXISTS spring_cloud_db2;
    
    CREATE DATABASE spring_cloud_db2 CHARACTER SET UTF8;
    
    USE spring_cloud_db2;
    
    DROP TABLE IF EXISTS `dept`;
    CREATE TABLE `dept` (
      `dept_no` int NOT NULL AUTO_INCREMENT,
      `dept_name` varchar(255) DEFAULT NULL,
      `db_source` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`dept_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    INSERT INTO `dept` VALUES ('1', '开发部', DATABASE());
    INSERT INTO `dept` VALUES ('2', '人事部', DATABASE());
    INSERT INTO `dept` VALUES ('3', '财务部', DATABASE());
    INSERT INTO `dept` VALUES ('4', '市场部', DATABASE());
    INSERT INTO `dept` VALUES ('5', '运维部', DATABASE());
    
    #############################################################################################
    DROP DATABASE IF EXISTS spring_cloud_db3;
    
    CREATE DATABASE spring_cloud_db3 CHARACTER SET UTF8;
    
    USE spring_cloud_db3;
    
    DROP TABLE IF EXISTS `dept`;
    CREATE TABLE `dept` (
      `dept_no` int NOT NULL AUTO_INCREMENT,
      `dept_name` varchar(255) DEFAULT NULL,
      `db_source` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`dept_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    INSERT INTO `dept` VALUES ('1', '开发部', DATABASE());
    INSERT INTO `dept` VALUES ('2', '人事部', DATABASE());
    INSERT INTO `dept` VALUES ('3', '财务部', DATABASE());
    INSERT INTO `dept` VALUES ('4', '市场部', DATABASE());
    INSERT INTO `dept` VALUES ('5', '运维部', DATABASE());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    二、参考 micro-service-cloud-provider-dept-8001,再创建两个微服务 Moudle :micro-service-cloud-provider-dept-8002 和 micro-service-cloud-provider-dept-8003。

    三、在 micro-service-cloud-provider-dept-8002 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。

    server:
      port: 8002  #端口号修改为 8002
    spring:
      application:
        name: microServiceCloudProviderDept  #微服务名称,不做修改,与 micro-service-cloud-provider-dept-8001 的配置保持一致
      datasource:
        username: root        #数据库登陆用户名
        password: root        #数据库登陆密码
        url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db2       #数据库url
        driver-class-name: com.mysql.jdbc.Driver                  #数据库驱动
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四、在 micro-service-cloud-provider-dept-8003 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。

    server:
      port: 8003  #端口号修改为 8003
    spring:
      application:
        name: microServiceCloudProviderDept  #微服务名称,不做修改,与 micro-service-cloud-provider-dept-8001 的配置保持一致
      datasource:
        username: root        #数据库登陆用户名
        password: root        #数据库登陆密码
        url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db3      #数据库url
        driver-class-name: com.mysql.jdbc.Driver                  #数据库驱动
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    五、依次启动 micro-service-cloud-eureka-7001/7002/7003(服务注册中心集群)、micro-service-cloud-provider-dept-8001/8002/8003(服务提供者集群)以及 micro-service-cloud-consumer-dept-80(服务消费者)。

    六、使用浏览器连续访问“http://eureka7001.com/consumer/dept/get/1”,结果如下图。

    在这里插入图片描述

    在这里插入图片描述

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【Vue3】Vue3中监视watch和watchEffect使用(图文+代码)
    瑞吉外卖学习笔记2
    MR直播(混合现实直播)做一场高品质企业培训
    Node.js 入门教程 16 npm 将软件包安装到哪里
    docker学习入门篇
    指挥中心实战指挥平台-通信指挥类装备多链路聚合设备解决方案实例
    8/23 网络流、最大流+hungary算法
    说说你对js作用域的理解 相关题
    收银系统源码-智慧新零售,ERP进销存功能详解
    Excel - VBA实例: 遍历若干cell的值
  • 原文地址:https://blog.csdn.net/m0_67393828/article/details/126080791