1Ribbon简介
1.1 Ribbon概述
◆Ribbon是客户端负载均衡器
◆Ribbon核心功能:服务发现
◆Ribbon核心功能:服务选择规则
◆Ribbon核心功能:服务监听
1.2Ribbon与Eureka整合
◆Ribbon天然与Eureka无缝整合
◆通过@LoadBalanced提供负载均衡支持
◆通过ribbon.eureka.enabled =false禁用Eureka
1.3配置负载均衡算法
Ribbon核心之IRule
◆IRule通过特定算法选取要访问的服务
◆lRule常 使用BestAvailableRule和WeightedResponse TimeRule
lRule算法 | 算法描述 |
RoundRobinRule | 轮询规则 |
RandomRule | 随机规则 |
AvailabilityFilteringRule | 可用过滤规则 |
WeightedResponseTimeRule | 根据平均响应时间计算所有服务的权重 |
RetryRule | 遵循RoundRobin规则处理,但是会对失败的服务进行重试 |
BestAvailableRule | 结合了可用过滤规则和响应时长规则 |
ZoneAvoidanceRule | 复合判断server所在区域性能和可用性选择服务器 |
2demo
2.1准备工作, 在一个被请求的服务(provider)上添加三个配置文件(yml) ,然后去Edit Configuration新增两个启动项
2.2配置主服务
2.2.1 yml服务
#全局配置
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
#指定客户端配置 ; 全局配置 和 指定客户端配置 两个同时配置 指定客户端配置生效
backend-show-provider:
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
2.2.2配置 RestConfig文件
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author :
* @program :
* @description :
**/
@Configuration
public class RestConfig {
@Bean
@LoadBalanced //让 RestTemplate 有负载均衡的能力
public RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* 配置ribbon规则
* @return
*/
@Bean
public IRule iRule(){
return new RandomRule();
}
}
2.2.3代码片段
package com.item.backed.consumer.service;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@Service
public class ConsumerServiceImpl implements ConsumerServiceAPI {
@Resource
private RestTemplate restTemplate;
@Resource
private LoadBalancerClient loadBalancerClient;
@Override
public String sayHello(String message) {
// 1 LoadBalancerClient( LoadBalancerClient 自带负载均衡)
// ServiceInstance choose = loadBalancerClient.choose("backend-show-provider");
// String hostname = choose.getHost();
// int port = choose.getPort();
// String uri = "/provider/sayhello?message=" + message;
// String url = "http://" + hostname + ":" + port + uri;
// invoker provider test
// String result = null;
// try {
// result = restTemplate.getForObject(url, String.class);
// } catch (RestClientException e) {
// e.printStackTrace();
// }
//2 ribbon 实现负载均衡
String uri = "/provider/sayhello?message=" + message;
String url = "http://backend-show-provider"+ uri;
String result = null;
try {
result = restTemplate.getForObject(url, String.class);
} catch (RestClientException e) {
e.printStackTrace();
}
return result;
}
}
最后请求 发现数据