Ribbon :处理客户端负载均衡和容错的解决方案

配置Ribbon的负载均衡

Rule接口: 定义客户端负载均衡的规则

RandomRule :随机选择RoundRobinRuleZoneAvoidanceRule

配置ribbon的负载均衡策略

在配置文件中配置

user-center:

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

在java代码中配置

/**

*

* 不同的服务使用不同的ribbon策略

* @RibbonClient : 表示这个配置是为xxx服务的

*

*/

//@Configuration

//@RibbonClient(name = "user-center",configuration = RibbonConfiguration.class)

// 全局服务设置

@RibbonClients(defaultConfiguration = RibbonConfiguration.class)

public class UserCenterRibbonConfiguration {

}

如果是为某个微服务单独配置负载均衡策略 @RibbonClient 指定配置文件的位置,,,这个配置文件不能被springboot扫描到,,父子上下文环境,,就像spring和springmvc的环境,,不能重叠,,如果重叠,相当于会变成全局的配置

Ribbon的配置文件

@Configuration

public class RibbonConfiguration {

@Bean

public IRule ribbonRule(){

// 负载均衡策略为随机

// return new RandomRule();

// 根据权重 这个类是自己写的根据权重判断

return new NacosWeightedRule();

}

/**

* 配置 ping的规则

* @return

*/

@Bean

public IPing ping(){

return new PingUrl();

}

}

写自己的负载均衡算法: 继承AbstractLoadBalancerRule , 实现里面的 choose()方法:

/**

*

* nacos自带的 根据权重的负载均衡策略,,,, 需要配置在ribbon的负载均衡中

*/

@Slf4j

public class NacosWeightedRule extends AbstractLoadBalancerRule {

@Autowired

NacosDiscoveryProperties nacosDiscoveryProperties;

/**

* 初始化规则,, 获取配置信息,,以便在choose中使用

* @param clientConfig

*/

@Override

public void initWithNiwsConfig(IClientConfig clientConfig) {

}

/**

* 返回与该规则关联的负载均衡器,,, 负载均衡器维护了服务实例列表

* @return

*/

@Override

public ILoadBalancer getLoadBalancer() {

return super.getLoadBalancer();

}

/**

* 选择一个服务实例来处理请求,,, 在这个方法中实现自己的负载均衡策略

* @param key

* @return

*/

@Override

public Server choose(Object key) {

try {

/**

* BaseLoadBalancer : 基本的负载均衡策略: 比如:轮询(round robin),随机选择(Random),,,

*/

BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();

// 想要请求的微服务的名称

String name = loadBalancer.getName();

// 负载均衡算法,,, nacos内置了基于权重的算法

NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();

// nacos client 自动通过基于权重的负载均衡算法,给我们一个实例

Instance instance = namingService.selectOneHealthyInstance(name);

log.info("port = {},instance = {}",instance.getPort(),instance);

return new NacosServer(instance);

} catch (NacosException e) {

throw new RuntimeException(e);

}

}

}

在nacos中设置的权重就会生效:

用到的类

ILoadBalancer : 是 netflix ribbon中负责管理服务实例列表 和 提供负载均衡策略的核心接口

getAllServers() 返回当前负载均衡器中维护的所有服务实例的列表addServers() 向负载均衡器中添加servicechooseServer() : 根据负载均衡规则,选择一个实例来处理请求

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: