3.Spring Cloud初相识--------Ribbon客户端负载均衡

Posted 零度微笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.Spring Cloud初相识--------Ribbon客户端负载均衡相关的知识,希望对你有一定的参考价值。

前言:

在生产环境中,未避免单点故障,每个微服务都会做高可用部署。

通白的说,就是每一个一模一样的服务会根据需求提供多分在多台机器上。

那么在大并发的情况下,如何分配服务可以快速得到响应,就成为了我们要解决的问题。

Ribbon就是一款优秀的客户端负载均衡机制。

什么是客户端负载均衡呢?

就是由服务的消费方来设定负载均衡策略,选择服务。

就像我们去超市买东西进行结账时,选择人少的柜台排队。

我们是消费方,排哪个队有我们自己决定。

配置测试环境:

1.配置三台服务提供者机器

2.修改端口号分别为:8001,8002,8003

3.修改HelloController返回字符串内容

(1)8001:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   001号机器";
    }

}

(2)8002:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   002号机器";
    }

}

(3)8003:

package com.xm.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello Spring Cloud!   003号机器";
    }

}

4.修改消费服务HelloController

package com.xm.cloud.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class HelloController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/hello")
    public List<String> sayHello() {
        List<String> list = new ArrayList<>();
        for(int i=0;i<30;i++) {
            list.add(restTemplate.getForObject("http://CL-HELLO-PRODUCER/hello", String.class));
        }
        return list;
    }

}

实践:

1.测试默认的负载均衡策略(轮询:RoundRobinRule):

(1)默认cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

(2)测试:localhost:8080/hello

0 "Hello Spring Cloud! 002号机器"
1 "Hello Spring Cloud! 003号机器"
2 "Hello Spring Cloud! 001号机器"
3 "Hello Spring Cloud! 002号机器"
4 "Hello Spring Cloud! 003号机器"
5 "Hello Spring Cloud! 001号机器"
6 "Hello Spring Cloud! 002号机器"
7 "Hello Spring Cloud! 003号机器"
8 "Hello Spring Cloud! 001号机器"
9 "Hello Spring Cloud! 002号机器"
10 "Hello Spring Cloud! 003号机器"
11 "Hello Spring Cloud! 001号机器"
12 "Hello Spring Cloud! 002号机器"
13 "Hello Spring Cloud! 003号机器"
14 "Hello Spring Cloud! 001号机器"
15 "Hello Spring Cloud! 002号机器"
16 "Hello Spring Cloud! 003号机器"
17 "Hello Spring Cloud! 001号机器"
18 "Hello Spring Cloud! 002号机器"
19 "Hello Spring Cloud! 003号机器"
20 "Hello Spring Cloud! 001号机器"
21 "Hello Spring Cloud! 002号机器"
22 "Hello Spring Cloud! 003号机器"
23 "Hello Spring Cloud! 001号机器"
24 "Hello Spring Cloud! 002号机器"
25 "Hello Spring Cloud! 003号机器"
26 "Hello Spring Cloud! 001号机器"
27 "Hello Spring Cloud! 002号机器"
28 "Hello Spring Cloud! 003号机器"
29 "Hello Spring Cloud! 001号机器"

2.测试随机策略(RandomRule):

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }

}

(2)测试结果:

0 "Hello Spring Cloud! 002号机器"
1 "Hello Spring Cloud! 003号机器"
2 "Hello Spring Cloud! 003号机器"
3 "Hello Spring Cloud! 002号机器"
4 "Hello Spring Cloud! 003号机器"
5 "Hello Spring Cloud! 001号机器"
6 "Hello Spring Cloud! 001号机器"
7 "Hello Spring Cloud! 002号机器"
8 "Hello Spring Cloud! 002号机器"
9 "Hello Spring Cloud! 002号机器"
10 "Hello Spring Cloud! 001号机器"
11 "Hello Spring Cloud! 003号机器"
12 "Hello Spring Cloud! 002号机器"
13 "Hello Spring Cloud! 003号机器"
14 "Hello Spring Cloud! 003号机器"
15 "Hello Spring Cloud! 002号机器"
16 "Hello Spring Cloud! 001号机器"
17 "Hello Spring Cloud! 001号机器"
18 "Hello Spring Cloud! 002号机器"
19 "Hello Spring Cloud! 003号机器"
20 "Hello Spring Cloud! 001号机器"
21 "Hello Spring Cloud! 003号机器"
22 "Hello Spring Cloud! 002号机器"
23 "Hello Spring Cloud! 002号机器"
24 "Hello Spring Cloud! 003号机器"
25 "Hello Spring Cloud! 002号机器"
26 "Hello Spring Cloud! 001号机器"
27 "Hello Spring Cloud! 001号机器"
28 "Hello Spring Cloud! 002号机器"
29 "Hello Spring Cloud! 001号机器"

3.测试最佳可用策略(最佳可用):

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new BestAvailableRule();
    }

}

(2)测试结果:

0 "Hello Spring Cloud! 003号机器"
1 "Hello Spring Cloud! 003号机器"
2 "Hello Spring Cloud! 003号机器"
3 "Hello Spring Cloud! 003号机器"
4 "Hello Spring Cloud! 003号机器"
5 "Hello Spring Cloud! 003号机器"
6 "Hello Spring Cloud! 003号机器"
7 "Hello Spring Cloud! 003号机器"
8 "Hello Spring Cloud! 003号机器"
9 "Hello Spring Cloud! 003号机器"
10 "Hello Spring Cloud! 003号机器"
11 "Hello Spring Cloud! 003号机器"
12 "Hello Spring Cloud! 003号机器"
13 "Hello Spring Cloud! 003号机器"
14 "Hello Spring Cloud! 003号机器"
15 "Hello Spring Cloud! 003号机器"
16 "Hello Spring Cloud! 003号机器"
17 "Hello Spring Cloud! 003号机器"
18 "Hello Spring Cloud! 003号机器"
19 "Hello Spring Cloud! 003号机器"
20 "Hello Spring Cloud! 003号机器"
21 "Hello Spring Cloud! 003号机器"
22 "Hello Spring Cloud! 003号机器"
23 "Hello Spring Cloud! 003号机器"
24 "Hello Spring Cloud! 003号机器"
25 "Hello Spring Cloud! 003号机器"
26 "Hello Spring Cloud! 003号机器"
27 "Hello Spring Cloud! 003号机器"
28 "Hello Spring Cloud! 003号机器"
29 "Hello Spring Cloud! 003号机器"

4.测试重试负载均衡策略(RetryRule)

(1)修改cfg:

package com.xm.cloud.cfg;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;

@Configuration
public class MyConfiguration {
    
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @Bean
    public IRule myRule() {
        return new RetryRule();
    }

}

(2)测试结果:

0 "Hello Spring Cloud! 001号机器"
1 "Hello Spring Cloud! 002号机器"
2 "Hello Spring Cloud! 003号机器"
3 "Hello Spring Cloud! 001号机器"
4 "Hello Spring Cloud! 002号机器"
5 "Hello Spring Cloud! 003号机器"
6 "Hello Spring Cloud! 001号机器"
7 "Hello Spring Cloud! 002号机器"
8 "Hello Spring Cloud! 003号机器"
9 "Hello Spring Cloud! 001号机器"
10 "Hello Spring Cloud! 002号机器"
11 "Hello Spring Cloud! 003号机器"
12 "Hello Spring Cloud! 001号机器"
13 "Hello Spring Cloud! 002号机器"
14 "Hello Spring Cloud! 003号机器"
15 "Hello Spring Cloud! 001号机器"
16 "Hello Spring Cloud! 002号机器"
17 "Hello Spring Cloud! 003号机器"
18 "Hello Spring Cloud! 001号机器"
19 "Hello Spring Cloud! 002号机器"
20 "Hello Spring Cloud! 003号机器"
21 "Hello Spring Cloud! 001号机器"
22 "Hello Spring Cloud! 002号机器"
23 "Hello Spring Cloud! 003号机器"
24 "Hello Spring Cloud! 001号机器"
25 "Hello Spring Cloud! 002号机器"
26 "Hello Spring Cloud! 003号机器"
27 "Hello Spring Cloud! 001号机器"
28 "Hello Spring Cloud! 002号机器"
29 "Hello Spring Cloud! 003号机器"

5.规则比较

策略 介绍
RoundRobinRule 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
RandomRule 随机选择一个可用的服务器。
RetryRule 默认轮询,重试多次失败的机器从轮询列表中淘汰。
BestAvailableRule 忽略哪些短路的服务器,并选择并发数较低的服务器。
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。
WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
AvailabilityFilteringRule 该策略继承自上面介绍的抽象策略PredicateBasedRule,所以它也继承了“先过滤清单,再轮询选择”的基本处理逻辑。

自定义负载均衡策略步骤

1.实现IRule接口

2.cfg注册覆盖默认负载均衡策略

以上是关于3.Spring Cloud初相识--------Ribbon客户端负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

与君初相识,犹如故人归

Matplotlib之Matplotlib初相识

与君初相识,犹如故人归

PHP初相识

Python初相识

Python初相识