一、Ribbon负载均衡策略
一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个地址的规则。
Ribbon提供七种负载均衡策略,默认的负载均衡策略是轮训策略。
名称 | 解释 |
RoundRobinRule | 轮训策略 |
RandomRule | 随机策略 |
BestAvailableRule | 过滤出故障服务器后,选择一个并发量最小的 |
WeightedResponseTimeRule | 针对响应时间加权轮询 |
AvailabilityFilteringRule | 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个; |
ZoneAvoidanceRule | 从最佳区域实例集合中选择一个最优性能的服务实例 |
RetryRule | 选择一个Server,如果失败,重新选择一个Server重试 |
二、 自定义负载均衡策略
本文自定义负载均衡规则提供根据指定URI优先转发到特定的机器的功能。
三、实现代码
(1)负载均衡策略实现类
public class MicroServiceLoadBalanceRule extends AbstractLoadBalancerRule {@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic 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 {@Beanpublic IRule microIRule(){return new MicroServiceLoadBalanceRule();}}@RibbonClient(name = "micro-service", configuration = MicroRibbonConfig.class)
public class RibbonClientConfig {}