Ribbon 简介
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Ribbon实现客户端的负载均衡,负载均衡器提供很多对http和tcp的行为控制。Spring cloud Feign已经集成Ribbon,所以注解@FeignClient的类,默认实现了ribbon的功能。它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。在SpringCloud Alibabba组件中,当我们引入Nacos依赖的时候,也默认帮我们引入了Ribben的依赖。 **
Ribben的默认配置
** 使用ribben默认配置只需要定义一个RestTemplate的Bean并在方法上加上**@LoadBalanced** 的注解就可以使用了,默认负载均衡机制为轮训
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
**
Ribbon的 负载均衡策略
** 1, RoundRobinRule Rabon默认采用轮询策略。如果在一轮轮询后找不到提供者,它最多可以轮询10轮 如果没有找到,则返回NULL。 例如,目前有三个提供者A、B和C,逐个对它们进行一次轮询。A、B和C不访问(一轮)。A、B、C三次访问(两轮)十次,如果它还不能访问,则返回NULL。
2, RandomRule 随机策略,从所有可用的提供者中选择。
3, RetryRule 重试策略:首先根据RoundRobin Rule策略获取提供者(策略制定者),直接返回。如果检索失败,请在指定的时间限制内重试, 缺省情况下,时间限制为500毫秒。[RoundRobin Rule轮询策略。]默认为10发。我会给你500毫秒给RetryRule。您可以重试,直到您找到它。]
4, BestAvailableRule 最可行的策略。选择并发性最高的提供者,即连接消费者数量最低的提供者。
5, AvailabilityFilteringRule 可以实现滤波算法。算法规则为:过滤掉处于融合状态和超过连接限制的提供者,对剩余的提供者采用轮询策略。
6, ZoneAvoidanceRule 区回避策略。根据提供程序所在的区域和提供程序的可用性选择提供程序。
7, WeightedResponseTimeRule 权重响应时间策略。每个提供者的权重是根据其平均响应时间计算的。响应时间越快,选择权重的可能性就越大。 在启动初期,采用轮询策略。之后,您将根据重量进行选择。
修改默认负载均衡策略
1.配置文件yaml中进行配置
nacos-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
2.配置类 不能写在@SpringApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享,不建议这么使用,推荐yaml方式
import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonConfig {
@Bean
public IRule iRule(){
return new NacosRule();
}
}
在主启动类上添加@RibbonClients注解
@RibbonClients(value = {
@RibbonClient(name = "服务名称",configuration = RibbonConfig.class),
@RibbonClient(name = "服务名称",configuration = RibbonConfig.class)
})
public class ManageApplication {
public static void main(String[] args) {
SpringApplication.run(ManageApplication.class,args);
}
}
自定义负载均衡策略
自定义负载均衡策略需要继承 AbstractLoadBalancerRule 抽象类
- 自定义一个带有权重的负载均衡器MyWeightRule
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public class MyWeightRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object key) {
try {
log.info("key:{}", key);
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
String serviceName = baseLoadBalancer.getName();
NamingService namingService = discoveryProperties.namingServiceInstance();
Instance instance = namingService.selectOneHealthyInstance(serviceName);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
}
return null;
}
}
2.启用自定义的负载均衡器应用 我们执行当前使用的负载均衡策略是自定义的权重负载均衡策略
import com.lxl.www.gateway.myrule.MyWeightRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GlobalRibbonConfig {
@Bean
public IRule getRule() {
return new MyWeightRule();
}
}
设置为全局配置GlobalRibbonConfig.class //
@RibbonClients(defaultConfiguration = GlobalRibbonConfig.class)
public class ManageApplication {
public static void main(String[] args) {
SpringApplication.run(ManageApplication.class,args);
}
}
开启饥饿加载,解决第一次调用慢的问题
ribbon:
eager-load:
enabled: true
clients: 服务名称1,服务名称2,服务名称3
|