1)LoadBalancerInterceptor
    可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:
    image.png

    • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
    • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
    • this.loadBalancer.execute():处理服务id,和用户请求。

    这里的this.loadBalancer是LoadBalancerClient类型,我们继续跟入。

    2)LoadBalancerClient
    继续跟入execute方法:
    image.png

    代码是这样的:

    • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
    • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

    放行后,再次访问并跟踪,发现获取的是8081:
    image.png
    果然实现了负载均衡。

    3)负载均衡策略IRule
    在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:
    image.png
    我们继续跟入:
    image.png
    继续跟踪源码chooseServer方法,发现这么一段代码:
    image.png
    我们看看这个rule是谁:
    image.png
    这里的rule默认值是一个RoundRobinRule,看类的介绍:
    image.png
    这不就是轮询的意思嘛。

    到这里,整个负载均衡的流程我们就清楚了。