开发者学堂课程【微服务框架 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 的负载均衡
二、架构说明
架构图如下:
上图包含了集群 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());
执行脚本,打开二号库可以看到初始化数据。
三个微服务如果都调用成功,就会各自对应。进行访问查看 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
#entit
y
别名类 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,运行如下:
可以发现微服务在逐渐增多,最终启动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 的配置方便很多。