开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 : Spring Cloud 微服务 Ribbon 负载均衡算】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/60/detail/1088
Spring Cloud 微服务 Ribbon 负载均衡算
内容介绍:
一、Ribbon 负载均衡与底层算法
二、Ribbon 负载均衡算法
一、Ribbon 负载均衡与底层算法
Ribbon 是做微服务机群的负载运算,前面做的练习是客户端经过出租通信的交互找到自己的服务完成匹配服务的交互,但是在实际上像订单服务、评论服务、支付服务是不定数量的服务器实例,但也是微服务机群。
对于订单服务如果有两台或以上的实例,客户端调用时要体现出均衡的思想。
如果机群里有多台服务实例但是只调用了一台实例是存在问题的,因为其他服务器都会被浪费,另一种情况是在高并发场景下订单服务可能有多台,如果客户端不能把压力均匀的分散到后台的服务上,后台服务就会出现巨大的问题。
负载机群算法在大规模 web 机群中是非常常见的,Ribbon 技术组件本身也支持很多主要的算法。Ribbon 默认已经在 flix 里集成,它使用简单的轮询程。
1. Spring Cloud 客户端负载均衡器 Ribbon
2. Ribbon 是 Netflix 发布的开源项目。
3. Ribbon 主要功能是提供客户端的软件负载均衡算法,
4. Ribbon 将 Netflix 的中间层服务连接在一起。
5. Ribbon 客户端组件提供许多配置如连接超时,重试等。
6.配置文件中列出后台所有的机器,
7. Ribbon 会自动(如简单轮询,随即连接等)去连接这
些机器。
8. Spring Cloud 使用 Ribbon 实现自定义的负载均衡算
法。
二、Ribbon 负载均衡算法
当多数据中心部署时,区域感知可以就近根据客户端的IP地址就近轮询到某个数据中心里,是一种更优秀的跨多数据中心的算法。
1.默认规则:轮训 RoundRobin
2. 简单轮询负载均衡( RoundRobin )
3.随机负载均衡( Random )随机选择 UP 的 Server
4.加权响应时间负载均衡 WeightedResponseTime
5. 区域感知轮询负载均衡( ZoneAware )
策略名 |
策略描述 |
BestAvailableRule |
选择一个最小的并发请求 server |
AvailabilityFilteringRule |
过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server, 并过滤掉那些高并发的后端 server (active connections超过配置的阈值) |
WeightedResponseTimeRule |
根据相应时间分配一个weight,相应时间越长,weight 越小,被选中的可能性越低。 |
RetryRule |
对选定的负载均衡策略机上重试机制。 |
RoundRobinRule |
roundRobin 轮询选择 server |
RandomRule |
随机选择一个 server |
ZoneAvoidanceRule |
复合判断 server 所在区域的性能和 server 的可用性选择 server |
负载均衡的 Ribbon 知识的算法以及如何使用的实战代码:
@SpringBootApplication
Public class JavaSpringCloud0000FeignClientDemoApplication {
@Bean
public IRule createRule() {
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run( JavaSpringCloud0000FeignClientDemoAppl:)
}
}
实际已经拥有了一个调用客户端,项目里已经拥有了一个调用中心、一个微服务和一个 FeignClient,停掉 FeignClient 并改造它。复制一份 FeignClient 并加入一个 Ribbon 的扩展并复制一份来验证负载均衡组件。
package com. alibaba ;
import org.springframework.web.bind.annotation. RequestMapping;
@RestController
public class OrderController {
@RequestMapping(" /he1lo")
public String getOrder() {
return "Hello Spring Cloud 1";
}
}
spring. application.name=order- microservice
server. port=8001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.fetch-registry=false
eureka.client.register-with-eureka=true
体现微服务可以创建实例叫“Spring Cloud service 1”,把他复制两份分别叫“Spring Cloud service 2”、“Spring Cloud service 3”,将二号服务器端口改为8002,三号改为8003。将三台服务器的返回字符串分别改为“Hello Spring Cloud 1”、“Hello Spring Cloud 2”、“Hello Spring Cloud 3”每一个微服务返回一个不同的字符串,但他们实际都叫订单服务,当实际部署时主要是为了追踪是哪一台服务器返回的。将二号、三号服务器启动,在注册中心里会有微服务的实例状态信息。
刷新注册中心服务里会有三台服务器,代理服务器已经停用。
spring. application. name=FeignClient
server. port=9001
eureka.client.service-url.defaultzone=http://localhost:8761/eureka/
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
#loadbalance
ribbon.eureka.enabled=true
import org.springframework.boot. SpringApplication;
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
Publicclass JavaSpringCloud00000FeignClientDemoApplication {
public static void main(String[] args) {
SpringApplication.run(JavaSpringCloud000000FeignClientDemoApp:)
}
}
将 Ribbon 项目启动,再把新的客户端项目启动,其他东西都不变。再次启用服务器时会发现在三台服务器间轮询。
@Bean
public IRule createRule(){
return new RandomRule() ;
}|
构建一个 Bean,构建一个 IRule 类来创建路由规则,Bean 会注入进来替代默认的 RondRobin。
重新加后会发现调用客户端变成了随机顺序。这是一个自定义的高级扩展方法,叫自定义扩展替换负载均衡算法。也可以自定义扩展,只需要输入一个 Bean。