前言:

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

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

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

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客户端负载均衡的更多相关文章

  1. Spring Cloud:使用Ribbon实现负载均衡详解(下)

    在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...

  2. Spring Cloud第四篇 | 客户端负载均衡Ribbon

    ​ 本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: ​Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  3. Spring Cloud(Dalston.SR5)--Ribbon 中间层负载均衡

    Spring Cloud 集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,使用 @LoadBalanced 修饰的 RestTemplate 类拥有了负载均衡功能,在 Sprin ...

  4. Spring Cloud:使用Ribbon实现负载均衡详解(上)

    1. 什么是 Ribbon? Spring Cloud Ribbon 是一套实现客户端负载均衡的工具.注意是客户端,当然也有服务端的负载均衡工具,我们后面再介绍.可以认为 Ribbon 就是一个负载均 ...

  5. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...

  6. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 了解了 eureka 服务注册与发现 的3大角色 ,会使用RestTem ...

  7. springcloud(十二):Ribbon客户端负载均衡介绍

    springcloud(十二):Ribbon客户端负载均衡介绍 Ribbon简介 使用分布式微服务脚骨的应用系统,在部署的时候通常会为部分或者全部微服务搭建集群环境,通过提供多个实例来提高系统的稳定型 ...

  8. SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心

    1.Ribbon客户端负载均衡 1.1 依赖 1.2 配置信息 # feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询 # 负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服 ...

  9. 笔记:Spring Cloud Ribbon 客户端负载均衡

    Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,基于 Netflix Ribbon 实现,通过Spring Cloud 的封装,可以让我们轻松的将面向服 ...

随机推荐

  1. HDU P2089

    题目大意为,统计区间内不含4和62的数字的个数: 老实说,看到这题我是抵触的..... 基本上是数位DP的板子,话说数位DP好像全是模板题吧: 预处理,有关的整区间的数字个数: 调用已有的区间,求解0 ...

  2. JavaWeb学习总结(九):Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  3. laravel开发之-composer安装(windows)

    1 在https://getcomposer.org/download/中下载composer.exe 2 选择php.exe安装composer 3 cmd命令框中输入composer.查看是否安装 ...

  4. C# 字符串中英文对齐

    StringBuilder str = new StringBuilder(); str.AppendFormat( - Encoding.Default.GetBytes(); str.Append ...

  5. Google APAC----Africa 2010, Qualification Round(Problem B. Reverse Words)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p1 问题描述: Problem Given a list of s ...

  6. win10 程序crash后弹出 XXX已停止工作

    需要attach调试器的时候弹出的"XXX已停止工作"很方便, 现在win10默认禁用掉了. 恢复的方法是: win+R 输入gpedit.msc回车 管理模板 -> Win ...

  7. volley7--NetworkDispatcher从网络中获取数据

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  8. sqlserver变量的生周期

    在声明一个变量后,一旦遇到分号或者go,生命周期就结 DECLARE @num1 int --go ; --go print @num1; --print @num1:

  9. [翻译] TLTagsControl

    TLTagsControl https://github.com/ali312/TLTagsControl#tltagscontrol A nice and simple tags input con ...

  10. Java学习---程序设计_基础题[1]

    180813 补全没有的答案! 0. 数组排序大全[冒泡/选择/快速/插入] package com.ftl; import java.io.BufferedReader; import java.i ...