一、Ribbon负载均衡策略
一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个地址的规则。
Ribbon提供七种负载均衡策略,默认的负载均衡策略是轮训策略。
名称 | 解释 |
RoundRobinRule | 轮训策略 |
RandomRule | 随机策略 |
BestAvailableRule | 过滤出故障服务器后,选择一个并发量最小的 |
WeightedResponseTimeRule | 针对响应时间加权轮询 |
AvailabilityFilteringRule | 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个; |
ZoneAvoidanceRule | 从最佳区域实例集合中选择一个最优性能的服务实例 |
RetryRule | 选择一个Server,如果失败,重新选择一个Server重试 |
二、 自定义负载均衡策略
本文自定义负载均衡规则提供根据指定URI优先转发到特定的机器的功能。
三、实现代码
(1)负载均衡策略实现类
public class MicroServiceLoadBalanceRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object key) {
ILoadBalancer lb = getLoadBalancer();
if (lb == null) {
return null;
}
List<Server> servers = lb.getReachableServers();
if (servers.isEmpty()){
return null;
}
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String uri = request.getRequestURI();
boolean specialApi = uri.startsWith("/api") ;
// /api路径优先转发到指定的机器
if(specialApi){
String ip = "192.168.2.3";
Server chooseServer = null;
for (Server server : servers) {
if (server.getHost().equals(ip)) {
chooseServer = server;
}
}
if(chooseServer == null){
chooseServer = servers.stream().findFirst().orElse(null);
}
return chooseServer;
}
return servers.get(new Random().nextInt(servers.size()));
}
}
(2)application.yaml文件配置
micro-service:
ribbon:
NFLoadBalancerRuleClassName: com.mk.springcloud.gateway.loadbalance.MicroServiceLoadBalanceRule
(3) 代码配置
public class MicroRibbonConfig {
@Bean
public IRule microIRule(){
return new MicroServiceLoadBalanceRule();
}
}
@RibbonClient(name = "micro-service", configuration = MicroRibbonConfig.class)
public class RibbonClientConfig {
}