负载均衡

100 阅读3分钟

本地负载均衡

本地负载均衡器基本的概念:我们的消费者服务从我们的注册中心获取到集群地址列表,缓存到本地,让后本地采用负载均衡策略(轮训、随机、权重、hash等),实现本地的rpc远程的。

本地负载均衡器与Nginx 的区别

  • Nginx是客户端所有的请求统一都交给我们的Nginx处理,然后再由Nginx实现负载均衡转发,属于服务器端负载均衡器。
  • 本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,既本地负载均衡器。

应用场景:

  • Nginx属于服务器负载均衡,应用于Tomcat/Jetty服务器等,
  • 本地负载均衡器,应用于在微服务架构中rpc框架中,rest、openfeign、dubbo。

代码改造:

我本地并没有引入ribbon的包,但是springcloud二代默认集成了ribbon
在启动类中添加代码:

| 1 2 3 4 5 6 7 8 9 10 11 | ``` /** * 加上LoadBalanced注解就可以实现我们的本地负载均衡 * * SpringCloud rest或者openfeign客户端默认都是ribbon实现调用 * @return */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }

| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

在order模块中:

| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
``` | ```
 /**  * @Classname OrderController  * @Description  * @Date 2020/8/5 3:44 下午  * @Created by jinping  */ @RestController public class OrderController {      @Autowired     private DiscoveryClient discoveryClient;      @Autowired     private RestTemplate restTemplate;      @Autowired     private LoadBalancer loadBalancer;      /**      * 基于ribbon实现本地负载均衡      * @return      */     @GetMapping("/orderToRibbonMember")     public Object orderToRibbonMember(){         String result = restTemplate.getForObject("http://tinner-member/getUser", String.class);         return "订单调用会员返回结果:"+ result;     } } 
``` |
| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

orderToRibbonMember方法省略了之前两步,我们可以通过服务名称直接拿到服务器地址和host,然后让restTemplate通过自身的算法给我们挑选出一个服务器进行服务的调用。

| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
``` | ```
/**  * @Classname OrderController  * @Description  * @Date 2020/8/5 3:44 下午  * @Created by jinping  */ @RestController public class OrderController {      @Autowired     private LoadBalancerClient loadBalancerClient;     /**      * 默认是default,轮询的算法      * @return      */     @GetMapping("/orderByLoadbalancerClient")     public Object orderByLoadbalancerClient(){         ServiceInstance result = loadBalancerClient.choose("tinner-member");         return result;     } } 
``` |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

以上代码可以看到会给我们返回服务器相关信息

![orderByLoadbalancerClient](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/433a66355efa46118d9d7871ef2e34e8~tplv-k3u1fbpfcp-zoom-1.image)

### [](#LoadBalancerClient "LoadBalancerClient")LoadBalancerClient

源码:

| ```
1 2 3 4 5 6 7 8 
``` | ```
package org.springframework.cloud.client.loadbalancer;  import org.springframework.cloud.client.ServiceInstance;  public interface ServiceInstanceChooser {     ServiceInstance choose(String serviceId); }  
``` |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

LoadBalancerClient是spring自己实现的一套负载均衡策略器,choose方法通过serviceId拿到所有的服务器列表,然后内部通过默认的轮询策略挑选出一个表服务器返回出去。

| ```
1 2 3 
``` | ```
protected Server getServer(ILoadBalancer loadBalancer) {     return loadBalancer == null ? null : loadBalancer.chooseServer("default"); } 
``` |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |