Ribbon 负载均衡|学习笔记

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 快速学习 Ribbon 负载均衡

开发者学堂课程【微服务框架 Spring Cloud 快速入门Ribbon负载均衡】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/614/detail/9355


Ribbon负载均衡

 

内容介绍

一、 前言

二、 架构说明

三、 具体内容

四、 测试

五、 总结

 

一、前言

上节课讲解了 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端,负载均衡的工具。通过添加@LoadBalanced 注解实现负载均衡,如下:

@LoadBalanced

Public RestTemplate get RestTemplate()

本节课主要讲解 Ribbon 的负载均衡

 

二、架构说明

架构图如下:

image.png

上图包含了集群 Eureka Server,微服务提供者实例1,微服务提供者实例2,微服务提供者实例3。所以要新建 mincroservicecloud-provider-dept-8002和8003,这就是多集群多维服务。之后服务消费者这里指80,发起负载均衡请求。Ribbon 和 Eureka 整合,上图虚线表示 Ribbon和 Eureka 有联系。在 Ribbon 上查找到目前能提供服务的只有 microservicecloud-dept8001,查询可用服务列表(服务发现),在注册上只有一个服务:8001。

按照以上架构图把8002,8003都注册进去之后,获得可用的服务列表,根据负载均衡请求,用默认的算法 lucene ,把三个实例各计算一遍。这个算法是有 Ribbon 插件的消费者联系80。

Ribbon 在工作时分成两步:

第一步先选择 EurekaServer,它优先选择在同一个区域内负载较少的 server。第二步再根据用户指定的策略,再从 server 取到的服务注册列表中选择一个地址。如果用户不指定,那么 Ribbon 的轮询策略将是默认的轮询。


三、具体内容

1.参考 mincroservicecloud-provider-dept-801,新建两份,分别命名为8002,8003。

(1)拷贝 8001 pom.xml 文件到8002,8003中。

(2)拷贝8001 中的配置和代码到8002和8003中,找到 com 文件夹,拷贝到8002和8003中的 src/main/java 下。修改主启动类的名字为DeptProvider8002_App.java和DeptProvider8003_App.java,如果不修改也没有大问题。

(3)拷贝对应的 mybatis 和application.yml 文件。将server:port:8001改为server:port:8002和server:port:8003。

目前有三个微服务,8001连接的是 cloudDB01 数据库,根据理论,微服务从技术角度看是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。所以这里需要新建8002/8003数据库,各自微服务分别连各自的数据库。脚本如下:

DROP DATABASE IF EXISTS cloudDB02;

//这里8001对应 cloudDB01,类似的8002对应 cloudDB02,8003对应 cloudDB03。

CREATE DATABASE cloudDB02 CHARACTER SET UTF8;

USE cloudDB02;

CREATE TABLE dept

(

deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,

dname VARCHAR(60),

db_source VARCHAR(60)

);

TNSERT INTO dept(dname,db_source) VALUES('开发部’,DATABASE());

TNSERT INTO dept(dname,db_source) VALUES("人事部’,DATABASE());

TNSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());

执行脚本,打开二号库可以看到初始化数据。

image.png

三个微服务如果都调用成功,就会各自对应。进行访问查看 db_source 的值来证明它们来自不同的数据库不同的微服务。这就是铺垫到落地的过程。

2.修改8002/8003各自YML

由于8002和8003是拷贝的8001中的内容,所以这里需要修改两个内容,分别是端口server:port:8001和数据库名称:url:jdbc:mysql://localhost:3306/clundDB01。但是不能修改对外暴露的统一的服务实例名,这一点最为重要。

Spring:

Application:

Name:microservicecloud-dept

//8001/8002/8003三个名字都必须一样。

8002 yml 如所示:

server:

port:8002

mybatis:

config-location:classpath:mybatis/mybatis.cfg.xml

#mybatis所在路径

type-aliases-package:com.atguigu.springcloud.entities

#entity别名类mapper-locations:

-classpath:mybatis/mapper/**/*.xml

#mapper 映射文件

spring:

application:

name: microservicecloud-dept

datasource:

type: com.alibaba.druid.pool.DruidDataSource

driver-class-name:org.gjt.mm.mysql.Driver

url:jdbc:mysql://localhost:3306/cloudDB2

username:root

password:123456

dbcp2:

min-idle:5

initial-size:5

max-total:5

max-wait-millis:200

8003 yml 如下所示:

server:

port:8003

mybatis:

config-location:classpath:mybatis/mybatis.cfg.xml

#mybatis所在路径

type-aliases-package:com.atguigu.springcloud.entities

#entity别名类 mapper-locations:

-classpath:mybatis/mapper/**/*.xml

#mapper 映射文件

spring:

application:

name: microservicecloud-dept

datasource:

type: com.alibaba.druid.pool.DruidDataSource

driver-class-name:org.gjt.mm.mysql.Driver

url:jdbc:mysql://localhost:3306/cloudDB3

username:root

password:123456

dbcp2:

min-idle:5

initial-size:5

max-total:5

max-wait-millis:200

3.启动三个 eureka 集群配置区

启动集群,Run As7001,7002,7003。

4.启动三个 dept 微服务启动并各自测试通过,如下所示:

http://localhost:8001/dept/list

http://localhost:8002/dept/list

http://localhost:8003/dept/list

Run As 8001,8002,8003,运行如下:

image.png

可以发现微服务在逐渐增多,最终启动80。这样就实现了从简单到复杂,从少到多同时启动七个微服务。

 

四、测试

使用 http://localhost:8001/dept/list 自测。不加 consumer,consumer 是暴露给消费者的。运行结果:显示 db_source:clouddb01,表示来自一号库。同理使用http://localhost:8002/dept/list 测试,结果显示 db_source:clouddb02,表示来自二号库。

使用 http://localhost:8003/dept/list 测试,显示 db_source:clouddb03,表示来自三号库。

1. 启动 mincroservicecloud-consumer -dept-80

Run AS mincroservicecloud-consumer -dept-80

2.演示 Ribbon 的负载均衡

客户端通过 Ribbon 完成负载均衡并访问上一步的 Dept 微服务。此时启动80,其中包含了七个微服务,占用的内存较大。运行 http://localhost/ consumer /dept/list ,其中 consumer 带着 Ribbon 的 localhost 算法。

随机到二号库,访问第二次,运行到三号库,访问第三次,运行到一号库。

由于80带了客户端的负载均衡 @LoadBalanced 默认的算法是轮询算法,即每一个微服务访问一次。

查看架构说明,客户端 ribbon 带着负载均衡算法在 Eureka server (701,702,703集群环境)上查询到可用的服务列表,可用的服务列表是以下三个:mincroservicecloud-dept8002,mincroservicecloud-dept8003,mincroservicecloud-dept8001。也就是一个微服务下挂载着三个实例。这三个服务列表默认的算法是轮询,一个计算一次。运行 http://localhost/ consumer /dept/list,每个库计算了一次,彻底完成了轮询算法。

 

五、总结

Ribbon 是一个软负载均衡的客户端组件,它可以和其它所需请求的客户端结合使用,和 eureka 结合只是其中的一个实例。

Ribbon 的负载均衡算法,在代码中添加 @LoadBalanced 就可以实现负载均衡。Ribbon 的负载均衡算法比 njx 的配置方便很多。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
负载均衡 算法 架构师
Ribbon负载均衡
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
3月前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
2月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
28 0
|
4月前
|
负载均衡 算法 网络协议
Ribbon 负载均衡源码解读
Ribbon 负载均衡源码解读
58 15
Ribbon 负载均衡源码解读
|
4月前
|
负载均衡 Java API
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
71 11
|
5月前
|
负载均衡 算法 Java
Ribbon怎么实现的负载均衡
Ribbon怎么实现的负载均衡
35 0
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
55 13
|
5月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。