什么是负载均衡
1. LB
,即负载均衡
(Load Balance)
,负载均衡是微服务架构中经常使用的一种技术。 负载均衡是我们处理高并发、缓解网络压力和进行服务端扩容的重要手段之一,简单的说就是将用户的请求平摊的分配到多个服务上,从而实现系统的高可用性集群。
2.
负载均衡可通过 硬件设备 及 软件 进行实现,软件比如:
Nginx
等,硬件比如:
F5
等
3.
负载均衡相应的在中间件,例如:
Dubbo
和
SpringCloud
中均给我们提供了负载均衡组件。
如下图是负载均衡的架构图:
![](https://i-blog.csdnimg.cn/direct/1b5e322bbaba4874b7006d3a4188b7d5.png)
用户请求先到达负载均衡器(
也相当于一个服务
),负载均衡器根据负载均衡算法将请求转发到微服务。
负载均衡
器
维护一份服务端列表
,根据负载均衡算法 将请求转发到相应的微服务上,负载均衡 算法有:轮训、随机、加权轮训、加权随机、地址哈希等方法,所以负载均衡可以为微服务集群分担请求,降低系统的压力。
什么是客户端负载均衡(
Ribbon
)
上图是
服务端负载均衡
,客户端负载均衡 与 服务端负载均衡的区别在于:
客户端负载均衡要维护一份服务列表
。
客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。
在客户端负载均衡中,每个客户端服务
都有一份自己要访问的服务端清单,这些清单统统都是从
Eureka
服务注册中心获取的。而在服务端负载均衡中,只
要负载均衡器维护一份服务端列表 。
Spring Cloud Ribbon
是基于
Netflix
公司发布的开源项目
Ribbon
进行封装的一套
客户端负载均衡器
。
参考 :
https://github.com/Netflix/ribbon
Ribbon
从
Eureka Server
获取服务列表,
Ribbon
根据负载均衡算法直接请求到具体的微服务,中间省去了负载均
衡服务。
如下图是
Ribbon
负载均衡的流程图:
![](https://i-blog.csdnimg.cn/direct/27052233d5684848a0813d4a76a1ad72.png)
1
、在消费者微服务中使用
Ribbon
实现负载均衡,
Ribbon
先从
EurekaServer
中获取服务列表。
2
、
Ribbon
根据负载均衡的算法(默认轮训算法)去调用微服务。
Ribbon
服务调用配置实战
无需新增新服务,在消费者端通过
Ribbon
进行实现负载均衡即可
针对
microservice-cloud-04-consumer-product-80
模块进行修改
修改
POM
文件
添加配置:
![](https://i-blog.csdnimg.cn/direct/ce6e3c1778db408e946e266b447373a6.png)
由于依赖了
spring-cloud-starter-netflix-eureka-client
,会自动添加
spring-cloud-starter-netflix-ribbon
依赖
![](https://i-blog.csdnimg.cn/direct/256bf35bb4784d91998dfad26b5ce89c.png)
完整配置
![](https://i-blog.csdnimg.cn/direct/9669ed8a61e549ee8925d7768ea46187.png)
![](https://i-blog.csdnimg.cn/direct/11b5ee15f60e4dadb187cda6f4db51b3.png)
修改
application.yml
文件
在
application.yml
文件中添加
Eureka
的服务注册地址,
![](https://i-blog.csdnimg.cn/direct/e6b0a98b3d04479da2ac79fcb116d61e.png)
修改自定义配置类
ConfigBean
在自定义配置类中添加新注解
@LoadBalanced
,
作用是:
@LoadBalanced
表示这个
RestTemplate
开启负载均衡,在调用服务提供者的接口时,可使用 服务名称替代真实IP
地址。服务名称 就是服务提供者在
application.yml
中配置的
spring.application.name
属性的值 。
![](https://i-blog.csdnimg.cn/direct/3622b0bbd992418895c5130cd736da6f.png)
![](https://i-blog.csdnimg.cn/direct/370be298dceb48e0b04b632eb1123898.png)
![](https://i-blog.csdnimg.cn/direct/5e81a2e4ce374560918c9fa71316dff0.png)
修改
application.yml
文件
在 application.yml 文件中添加 Eureka
的服务注册地址,
![](https://i-blog.csdnimg.cn/direct/f06c2bfd7e324ca88d9968cf2eb00216.png)
修改自定义配置类
ConfigBean
在自定义配置类中添加新注解
@LoadBalanced
,
作用是:
@LoadBalanced
表示这个
RestTemplate
开启负载均衡,在调用服务提供者的接口时,可使用 服务名称替代真实IP
地址。服务名称 就是服务提供者在
application.yml
中配置的
spring.application.name
属性的值 。
![](https://i-blog.csdnimg.cn/direct/1de0791ce4904ae7a1ab5e41cb0d73f9.png)
![](https://i-blog.csdnimg.cn/direct/1ecb5fffc6c14043846c07c91c621d21.png)
![](https://i-blog.csdnimg.cn/direct/38fd699b8c664683afb322783602dea1.png)
修改消费者控制层
ProductController_Consumer
修改调用
REST
风格的服务提供者地址:
![](https://i-blog.csdnimg.cn/direct/ea89696c3abd4473bca58c73b8a46949.png)
修改后完整版
![](https://i-blog.csdnimg.cn/direct/0be6d9c2df4145528e3b2bca3b2d420e.png)
![](https://i-blog.csdnimg.cn/direct/1104a7627bbd47bda7eaf7cf6e265b16.png)
![](https://i-blog.csdnimg.cn/direct/30455dd46dd44e5ab819b89e3dd75c21.png)
修改主启动类
在主启动类
MicroserviceProductConsumer_80
上添加注解
@EnableEurekaClient
![](https://i-blog.csdnimg.cn/direct/4921706a6c5846efa12fc4d3d3901905.png)
![](https://i-blog.csdnimg.cn/direct/21a3d529b5d14539823576cebb5631c0.png)
启动
2
个
Eureka
集群后,再启动
microservice-cloud-03-provider-product-8001
并注册进
eureka
接着启动
microservice-cloud-04-consumer-product-80
访问:
http://localhost/consumer/product/get/1
http://localhost/consumer/product/list
http://localhost/consumer/product/add?product_name=spring
教程
总结:
Ribbon
和
Eureka
整合后 ,消费者
Consumer
可以直接调用提供者服务,而不用再关心地址和端口号
![](https://i-blog.csdnimg.cn/direct/73f54f3253c7460e808a6d1752936253.png)
Ribbon
负载均衡实战
Ribbon
负载均衡架构
Ribbon
在工作时分成两步:
第
1
步先选择
Eureka Server ,
它优先选择在同一个区域内负载较少的
server
第
2
步再根据用户指定的策略,在从
Eureka Server
获取的服务注册列表中选择一个地址。 其中
Ribbon
提供了多种策略:比如轮询、随机和根据响应时间加权等。
![](https://i-blog.csdnimg.cn/direct/56f0a4f2df4545419ffe4074c2614d86.png)
新建一个商品提供者服务
新建
microservice-cloud-06-provider-product-8002
,参考:
microservice-cloud-03-provider-product- 8001
配置
pom.xml
文件
复制
8001
的
pom.xml
中如下依赖信息,粘贴到
8002
模块中
![](https://i-blog.csdnimg.cn/direct/8b0036352a734d11a7ef256d62a4b4cc.png)
![](https://i-blog.csdnimg.cn/direct/cd08ba7830274d248b03cdd92ef94df8.png)
新建一个数据库
新建
8002
数据库,各自微服务分别连各自的数据库:
8002
数据库脚本 :
![](https://i-blog.csdnimg.cn/direct/e3acd7358b144fc4b1948ec4b80a29f7.png)
![](https://i-blog.csdnimg.cn/direct/f1cdf3341f644dc7a1e22b89bb23597d.png)
拷贝
Mybatis
核心配置与映射配置文件
复制
8001
的
MyBatis
相关配置到
8002
application.yml
参考
8001
,
指定
8002
的
application.yml
配置信息
,
注意:端口号 和数据库名
![](https://i-blog.csdnimg.cn/direct/1f71c68eebb44066afee7adc814ae91f.png)
![](https://i-blog.csdnimg.cn/direct/05bafa44bcb44dc882c5b6fe6320557f.png)
配置启动类
复制
8001
的启动类 到
8002 ,
重命名类名
ProductProvider_8002
![](https://i-blog.csdnimg.cn/direct/80c525c7508e4f79b0dd45b2f2a8dc2d.png)
![](https://i-blog.csdnimg.cn/direct/baa43ba6dbaa42a6ab8176e164732472.png)
启动
2
个
Eureka
集群
microservice-cloud-05-eureka-6001
、
microservice-cloud-05-eureka-6002
启动
2
个 商品提供者 微服务,并各自测试通过
http://localhost:8001/product/list
http://localhost:8002/product/list
启动
microservice-cloud-04-consumer-product-80
客户端通过
Ribbon
完成负载均衡并访问上一步的
Product
微服务
http://localhost/consumer/product/list
注意观察看到返回的数据库名字,各不相同,负载均衡实现