【Spring Cloud】分布式必学springcloud(五)——Ribbon自定义负载均衡策略

一、前言

      在上一篇博客中,小编向大家介绍了负载均衡工具Ribbon,是不是很颠覆呀,是不是很好用呀。从中大家有没有感觉到他的负载均衡策略呀,对的,Ribbon内置的默认策略是轮询。在这篇博客中,小编就带大家领略一下Ribbon自定义策略。

二、Ribbon的负载均衡策略有哪些?

这里写图片描述

      首先上面的这张图是Ribbon选择策略,我们使用的策略重点是最下面的6个子类:

策略名策略声明策略描述实现说明
BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuittripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRulepublic class ZoneAvoidanceRule extends PredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

三、自定义策略

      这里我借鉴上一篇博客的框架,对ribbon模块进行修改:假定这次修改为随机访问RandomRule。

##3.1修改配置文件

eureka:
  client:
    service-url:
     defaultZone: http://localhost:8761/eureka/
server:
  port: 7000
spring:
  application:
    name: servie-ribbon

client1:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule


      在配置文件中,我们指明了client1服务要使用 com.netflix.loadbalancer.RandomRule 策略。

client1:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

3.2 修改启动类

      添加了实例化与配置文件对应的策略类。

package com.wl.ribbon;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class RibbonApplication {

	public static void main(String[] args) {
		SpringApplication.run(RibbonApplication.class, args);
	}


	@Bean
	@LoadBalanced
	RestTemplate restTemplate(){
		return new RestTemplate();
	}


	@Bean
	public IRule ribbonRule() {
		return new RandomRule();//实例化与配置文件对应的策略类
	}

}

3.3 编写controller

      注入了LoadBalancerClient ,通过LoadBalancerClient 指明要使用的策略。

package com.wl.ribbon.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * Created by Ares on 2018/4/18.
 */
@RestController
public class HelloController {

    @Autowired
    RestTemplate restTemplate;


    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping(value = "/getUser", method = RequestMethod.GET)
    public String getUser(@RequestParam("id") String id) {
        this.loadBalancerClient.choose("CLIENT1");//随机访问策略
        return restTemplate.getForEntity("http://CLIENT1/user/findById?id="+id, String.class).getBody();
    }


    @RequestMapping(value = "/hi")
    public String hi(@RequestParam("id") String id){
        return  restTemplate.getForObject("http://CLIENT1/user/findById?id="+id,String.class);

    }
}

3.4 运行

      运行结果就是随机访问,和轮询结果明显不一样。

四、小结

      通过这次的使用,可以对比Dubbo的负载均衡策略,有兴趣的通知可以了解一下。dubbo也有loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用。所以一通百通。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值