前言:

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

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

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

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. DOM3 textInput事件

    DOM3中引入了文本事件,其中之一 textInput . 当用户再可编辑区域输入字符时触发该事件. 与keypress不同的是,该事件只会在用户输入可视字符时触发,而keypres事件则只要按下键即 ...

  2. 设计模式 UML & java code

    A: 创造性模式 1. 工厂方法模式(FactoryMethod) 1.1 类图 1.2 代码1 public interface Pet { public String petSound(); } ...

  3. HTML5之新增的元素和废除的元素 (声明:内容节选自《HTML 5从入门到精通》)

    新增结构元素: section元素 section元素定义文档或应用程序中的一个区段,比如章节.页眉.页脚或文档中的其他部分.它可以与h1,h2,h3,h4,h5,h6元素结合起来使用,标示文档结构. ...

  4. MSSQL中的表变量

    最近在看<Microsoft SQL Server2005技术内幕:T-SQL程序设计> 1.表变量的事务上下文中提到,表变量不受外部事务回滚影响. 举个例子: DECLARE  @TA ...

  5. 爬虫必备—requests

    Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得 ...

  6. Python 批量修改文件夹名称

    修改为: # -*- coding: utf-8 -*- import os, sys,re path=u"E:\\C#网络编程基础" dirs=os.listdir(path) ...

  7. Python删除开头空格

    # -*- coding: utf-8 -*- '''打开delSpace.txt文本并删除每行开头的八个空格''' f=open("delSpace.txt") lines=f. ...

  8. android头像上传(获取头像加剪切)

    因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下. demo我是类似仿微信的,在一个GridView中展示所有的图片,其中第一个item可以去照相:获取到图片后再进行剪切. 图片的剪切是 ...

  9. ubuntu下面解压tar.gz包报错:tar命令报错: gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error

    原因: 压缩包文件不完整(损坏或者其他原因) 比如今天下载的tomcat8,使用ubuntu的命令下载的 curl -O http://apache.mirrors.ionfish.org/tomca ...

  10. 基于TCP/IP的程序设计

    TCP特点 (1)面向连接的传输 (2)端到端的通信 (3)高可靠性,确保传输数据的正确性,不会出现丢失或者乱序 (4)全双工方式传输 (5)采用字节流方式,以字节为单位传输字节序列 (6)紧急数据传 ...