nginx负载均衡原理 服务器负载均衡是什么意思( 四 )


接着执行完毕getServer这个方法后,我们发现,只有一个服务实例了为8090 。第二次调试代码后发现获取的是8091.多次调试后发现是8090和8091是轮询出现的,


也就是说getServer这个方法给我们实现了负载均衡 。看源代码知道,如果未设置负载均衡参数,就使用default 。否则就根据配置的参数选择服务 。
protected Server getServer(ILoadBalancer loadBalancer, Object hint) { if (loadBalancer == null) {return null; } // Use 'default' on a null hint, or just pass it on? return loadBalancer.chooseServer(hint != null ? hint : "default");}具体的实现的负载均衡算法,本文不做讨论 。
4.负载均衡代码验证演示通过上述源码分析,我们发现如果我们开启了负载均衡,但是没有配置负载均衡参数,则会采用默认的配置,也就是轮询算法来实现负载均衡 。
通过上述的debug阅读,我们参照getServer这个方法来写代码测试下负载均衡
@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping(value = "https://www.520longzhigu.com/shenghuo/order/{orderId}")public Order queryOrderById(@PathVariable("orderId") String orderId) { String serviceId = "hutao-microservice-item"; for(int i = 0 ; i < 10 ; i++) {ServiceInstance choose = loadBalancerClient.choose(serviceId);System.out.println(choose); } //List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); //ServiceInstance serviceInstance = instances.get(0); //String url = serviceInstance.getHost() + ":" + serviceInstance.getPort(); //Items items = restTemplate.getForObject("http://" + serviceId + "/itemservice/item/1" , Items.class); //System.out.println(items); return null;}5.负载均衡配置在我们之前调试代码的时候我们发现源码中定义了IRule.choose(Object objet)这个接口,并且如下几个实现 。
各个实现如下所示 。
如果我们不想要默认的轮询机制,我们可以采用如上实现中的任何一种
比如,我们设置为随机策略 。

  • hutao-microservice-item是我们需要对某个服务设定
  • NFLoadBalancerRuleClassName是我们的策略(也就是实现类的路径)
hutao-microservice-item:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule重启服务后,再看我们的负载均衡,是随机的,而不是轮询的 。
6.总结
  1. 注册多个服务:将项目部署在不同的服务器,或者同一个服务器不同端口号,然后注册到注册中心的服务ID(serviceId)保持一致即可;
  2. 负载均衡实现:通过对RestTemplate添加注解@LoadBalanced,使用代理模式,拦截RestTemplate请求时,访问指定的负载服务,从而实现负载均衡 。
  3. DiscoveryClient接口他是用来发现服务的,比如发现Netflix服务,其中有个方法List getInstances(String serviceId)是根据服务ID获取服务实例集合 。
  4. LoadBalancerInterceptor进行请求拦截处理
  5. RibbonLoadBalancerClient首先通过getLoadBalancer根据服务ID获取到负载,然后getServer会从多个负载中获取到适合的服务 。其实现chooseServer如果没有设置负载均衡规则,则使用默认的轮询算法 。
  6. IRule接口定义了choose方法 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: