Ribbon源码解析

   使用ribbon实现服务消费者的负载均衡。中途出现了一点点错误和一点点疑惑就去底层看了部分功能的实现原理。

错误出现的是 No instances available for localhost] with root cause。

首先这个错误是在在实现负载均衡功能时,访问其他服务的时候出现的。

 return restTemplate.getForObject("http://localhost/hi?name="+name,String.class);

    RibbonLoadBalancerCIient这个类用来执行最终的的负载均衡的请求处理。看一下结构

出错的点在这个excute()方法中

@Override
	public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
		ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
		Server server = getServer(loadBalancer);
		if (server == null) {
			throw new IllegalStateException("No instances available for " + serviceId);
		}
		RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
				serviceId), serverIntrospector(serviceId).getMetadata(server));

		return execute(serviceId, ribbonServer, request);
	}

这个错说明server=null.那继续追踪getServer()方法

protected Server getServer(ILoadBalancer loadBalancer) {
		if (loadBalancer == null) {
			return null;
		}
		return loadBalancer.chooseServer("default"); // TODO: better handling of key
	}

继续看发现在chooseServer的ZoneAwareLoadBalancer实现类方法。看到zone猜测是该区域没有东西的

this.getLoadBalancerStats().getAvailableZones().size()=0 导致后面的解析都没有进行,直接最后一步了,重写该方法,应该也类似于一个初始化,就返回空。
public Server chooseServer(Object key) {
        if (ENABLED.get() && this.getLoadBalancerStats().getAvailableZones().size() > 1) {
            Server server = null;

            try {
                LoadBalancerStats lbStats = this.getLoadBalancerStats();
                Map<String, ZoneSnapshot> zoneSnapshot = ZoneAvoidanceRule.createSnapshot(lbStats);
                logger.debug("Zone snapshots: {}", zoneSnapshot);
                if (this.triggeringLoad == null) {
                    this.triggeringLoad = DynamicPropertyFactory.getInstance().getDoubleProperty("ZoneAwareNIWSDiscoveryLoadBalancer." + this.getName() + ".triggeringLoadPerServerThreshold", 0.2D);
                }

                if (this.triggeringBlackoutPercentage == null) {
                    this.triggeringBlackoutPercentage = DynamicPropertyFactory.getInstance().getDoubleProperty("ZoneAwareNIWSDiscoveryLoadBalancer." + this.getName() + ".avoidZoneWithBlackoutPercetage", 0.99999D);
                }

                Set<String> availableZones = ZoneAvoidanceRule.getAvailableZones(zoneSnapshot, this.triggeringLoad.get(), this.triggeringBlackoutPercentage.get());
                logger.debug("Available zones: {}", availableZones);
                if (availableZones != null && availableZones.size() < zoneSnapshot.keySet().size()) {
                    String zone = ZoneAvoidanceRule.randomChooseZone(zoneSnapshot, availableZones);
                    logger.debug("Zone chosen: {}", zone);
                    if (zone != null) {
                        BaseLoadBalancer zoneLoadBalancer = this.getLoadBalancer(zone);
                        server = zoneLoadBalancer.chooseServer(key);
                    }
                }
            } catch (Exception var8) {
                logger.error("Error choosing server using zone aware logic for load balancer={}", this.name, var8);
            }

            if (server != null) {
                return server;
            } else {
                logger.debug("Zone avoidance logic is not invoked.");
                return super.chooseServer(key);
            }
        } else {
            logger.debug("Zone aware logic disabled or there is only one zone");
            return super.chooseServer(key);
        }
    }

最后发现是

应该调用的是yml里的服务名字。对应的defaltZone。而不是用IP来访问。因为我们负载均衡本来就是一个IP下的多个服务。

所以用服务名来区分就可以了。

 

疑惑的点是负载均衡为啥都是每个客户端轮着来的,还是随机来的刚好凑巧是轮起来的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ribbon组合框是一种常见的图形用户界面控件,常用于显示和选择多个选项中的一个。它通常与Ribbon界面风格相结合,使用户能够在菜单和工具栏之外获得更多的操作选项。 Ribbon组合框具有以下几个主要特点。首先,它具有下拉列表的功能,用户可以通过点击或下拉箭头来打开下拉菜单,从中选择一个选项。其次,它支持文本和图标显示,可以根据需要显示选项的文本描述或使用图标来进行直观展示。再次,它可以自动完成用户的输入,即根据用户键入的信息来筛选和匹配可选项,提供更加智能的交互体验。 Ribbon组合框的应用场景非常广泛。例如,在表单设计中,可以使用Ribbon组合框来选择性别、部门、职位等信息;在电商网站中,可以使用Ribbon组合框来选择商品的分类、品牌或价格范围;在音乐播放器中,可以使用Ribbon组合框来选择歌曲的艺术家、专辑或流派。总之,无论是选择固定选项,还是根据输入内容进行筛选,Ribbon组合框都是一种非常便捷和直观的控件。 在使用Ribbon组合框时,需要注意以下几点。首先,要保持选项的清晰和有序,避免选项数量过多或杂乱无章;其次,要根据界面整体布局和风格设计,选择合适的颜色、尺寸和样式;再次,要为组合框提供适当的提示和帮助信息,如下拉菜单的简洁说明或自动完成的操作提示。 总之,Ribbon组合框是一种强大的用户界面控件,提供了丰富的选项选择和交互功能,在各种应用场景下都能发挥其作用。通过合理使用和设计,可以营造出更加方便和高效的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值