8、Ribbon负载均衡

一、服务调用

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 # 对当前实例的重试次数
发布了55 篇原创文章 · 获赞 4 · 访问量 3115

猜你喜欢

转载自blog.csdn.net/qq_41347385/article/details/105030313