
# 负载均衡
负载均衡作用在客户端，是高并发、高可用系统必不可少的关键组件，目标是尽力将网络流量平均分发到多个服务器上，以提高系统整体的响应速度和可用性。
- Java Chassis的负载均衡作用于微服务消费者，需要微服务应用集成负载均衡模块，启用loadbalance处理链。
  配置示例如下：
  ```
  servicecomb:
    handler:
      chain:
        Consumer:
          default: loadbalance
    loadbalance:   
      strategy:     
        name: RoundRobin # 这是开启负载均衡轮询模式,随机模式为Random
  ```
  在POM中添加如下依赖：
  ```
  <dependency>
     <groupId>org.apache.servicecomb</groupId>
     <artifactId>handler-loadbalance</artifactId>
     <version>${project.version}</version>
  </dependency>
  ```
  
- Spring Cloud Huawei负载均衡规则使用了Spring Cloud里面Ribbon的思想，作用在客户端，其原理为：当使用随机规则时，客户端会在下游微服务实例中随机访问一个实例，当使用轮询规则时，客户端会在下游微服务实例中按顺序循环选择Server。 配置示例如下：
  ```
  servicecomb:
    loadbalance:
      userLoginAction: | 
        rule: Random # 说明负载均衡规则为随机模式，默认是轮询模式RoundRobin
  ```
  
#### 示例
以Spring Cloud Huawei负载均衡[demo](https://github.com/huaweicloud/spring-cloud-huawei-samples/tree/2021.0.x/governance/loadbalance)为例测试负载效果。
此demo中包含consumer、provider-one、provider-two、provider-three四个微服务，分别启动4个微服务，然后通过界面访问： http://${consumer-ip}:8090/load-balance?id=111
- 当规则选择为轮询模式RoundRobin，也是框架默认模式时，结果会按版本号有规律顺序的返回，如下：
  ```
  provider id-----> 11111 port ----->8091 ,version----->0.0.1
    provider id-----> 11111 port ----->8092 ,version----->0.0.2
    provider id-----> 11111 port ----->8093 ,version----->0.0.3
    provider id-----> 11111 port ----->8091 ,version----->0.0.1
    provider id-----> 11111 port ----->8092 ,version----->0.0.2
    provider id-----> 11111 port ----->8093 ,version----->0.0.3
  ```
  

- 当规则选择为随机模式Random时，结果将是无规律的返回，如下：
  ```
  provider id-----> 11111 port ----->8091 ,version----->0.0.1
    provider id-----> 11111 port ----->8092 ,version----->0.0.2
    provider id-----> 11111 port ----->8091 ,version----->0.0.1
    provider id-----> 11111 port ----->8093 ,version----->0.0.3
    provider id-----> 11111 port ----->8093 ,version----->0.0.3
    provider id-----> 11111 port ----->8092 ,version----->0.0.2
  ```
  
 
