Ribbon架构图
一、Ribbon简介
1、Ribbon是客户端负载均衡器
2、Ribbon核心功能:服务发现、服务选择规则、服务监听
3、Ribbon和注册中心结合使用:去注册中心将所有的serverList取出来,动态更新serverList
二、Ribbon核心点
服务消费者通过RestTeamlate(可以自由配置IRule和IPing)调用注册中心里的服务(被调用方提供多个端口部署在不同服务器上)实现负载均衡
1、IRule
1)IRule通过特定算法选取要访问的服务(粒度细:单个算法针对单个服务配置不同的请求)
2)常用算法
/**
* @author : zhenghaorui
* @description : 配置文件
**/
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* @Description: 负载均衡规则
* @Param: []
* @return: com.netflix.loadbalancer.IRule
* @Author: zhenghaorui
*/
@Bean
public IRule iRule(){
return new RoundRobinRule();
//自定义算法规则
//return new MyRule();
}
}
3)自定义算法规则
继承AbstractLoadBalancerRule,重写choose方法
/**
* @author : zhenghaorui
* @description : 自定义算法规则
**/
public class MyRule extends AbstractLoadBalancerRule {
public MyRule(){}
@Override
public Server choose(Object o) {
// 灰度发布 10%的流量在新的功能 ~ 90%的流量在旧的功能
// 对10%有没有限制,已经访问过新功能的流量不能再访问旧的功能
// 定义一个新功能的ServerList
// up all
// 每次请求进入,判断对应的客户端是不是已经访问过新的ServerList
// 如果是, 则直接访问新的ServerList
// 如果不是, 则继续后续判断
// 引入缓存, 十个请求里随机取2~3个请求进入新功能的ServerList 【Redis】
// 无论传入什么,都返回null
return null;
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
2、IPing
1)IPing是Ribbon保护服务可用的基石
2)常见实现
/**
* @author : zhenghaorui
* @description : 配置文件
**/
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IPing iPing(){
//访问任何服务的/abc的url
//如果url是存活状态,那就认为该服务是存活着的;否则认为该服务已经挂掉
//return new PingUrl(false,"/abc");
return new NIWSDiscoveryPing();
}
}
3、ServerList
1)ServerList是Ribbon存储的可用服务列表
2)ServerList可以手动设置
3)ServerList常见应用是从Eureka中自动获取
三、Ribbon与Eureka整合
1、Ribbon天然与Eureka无缝整合
2、通过@LoadBalanced提供负载均衡支持
3、通过ribbon.eureka.enabled = false禁用Eureka
四、Ribbon参数配置
1、默认参数配置:查看DefaultClientConfigImpl
2、Ribbon Key定义:查看CommonClientConfigKey
3、Ribbon参数分为全局配置和指定客户端配置
#全局配置
ribbon:
eureka:
enabled: true
ReadTimeout: 60000
ConnectTimeout: 60000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
OkToRetryOnAllOperations: false
4、指定客户端参数配置格式:<client>.ribbon.<key> = <value>
哪些可被负载均衡?怎么负载均衡?
serverList可被负载均衡;利用负载均衡算法进行负载均衡。