一、服务调用
eureka内部集成了ribbon
1、在创建RestTemplate的时候,声明@LoadBalanced。
public class OrderApplication {
/**
* 使用spring提供的RestTemplate发送http请求到商品服务
* 1.创建RestTemplate对象交给容器管理
* 2.在使用的时候,调用其方法完成操作 (getXX,postxxx)
* * @LoadBalanced : 是ribbon提供的负载均衡的注解
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
2、使用restTemplate调用远程微服务:不需要拼接微服务的url,用待请求的服务名替换ip地址。
/**
* 基于ribbon的形式调用远程微服务
* 1.使用@LoadBalanced声明RestTemplate
* 2.使用服务名称替换ip地址
*/
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = null;
product = restTemplate.getForObject("http://service-product/product/1",Product.class);
return product;
}
二、负载均衡
Ribon是一个典型的客户端负载均衡器,Ribbon会获取服务的所有地址,根据内部的负载均衡算法,获取本次请求的有效地址。
1、准备两个商品微服务(9001,9011)
2、在商品微服务中将当前商品微服务的ip和port以商品名的形式放在商品对象中,方便订单微服务调用时分辨调用的是哪个商品微服务
@Value("${server.port}")
private String port;
@Value("${spring.cloud.client.ip-address}") //spring cloud 自动的获取当前应用的ip地址
private String ip;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = productService.findById(id);
product.setProductName("访问的服务地址:"+ip + ":" + port);
return product;
}
2、在订单系统中远程以负载均衡的形式调用商品服务
访问链接:http://127.0.0.1:9002/order/buy/1
**返回结果:**9001端口和9011端口依次变化。是内置的负载均衡算法——轮询算法。
三、负载均衡策略
策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为WeightedResponseTimeRule
Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为com.netflix.loadbalancer.IRule ,实现方式如下:
1、com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡。
2、com.netflix.loadbalancer.RandomRule :随机策略
3、com.netflix.loadbalancer.RetryRule :重试策略。
4、com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大。
5、com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
6、com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用。
在服务消费者的application.yml配置文件中修改负载均衡策略
#修改ribbon的负载均衡策略 服务名 - ribbon - NFLoadBalancerRuleClassName : 策略
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# ConnectTimeout: 250 # Ribbon的连接超时时间
# ReadTimeout: 1000 # Ribbon的数据读取超时时间
# OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
# MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
# MaxAutoRetries: 1 # 对当前实例的重试次数
四、请求重试
1、引入spring的重试组件
在订单微服务中引用依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
2、对ribbon进行重试配置
service-product:
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数