前言:

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

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

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

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. 解决Cannot read property 'style' of null中样式问题

    <script type="text/javascript"> function updateTime(){ var timeNow = new Date(); var ...

  2. h5的classList对象

    H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...

  3. JavaScript : Array assignment creates reference not copy

    JavaScript : Array assignment creates reference not copy 29 May 2015 Consider we have an array var a ...

  4. [算法练习]Excel Sheet Column Title

    题目: Given a positive integer, return its corresponding column title as appear in an Excel sheet. For ...

  5. 基于Vue的WebApp项目开发(四)

    实现新闻咨询页面 目录结构 步骤一:创建newslist.vue文件 <template> <div id="tml"> <!--使用mui框架,实现 ...

  6. 京东原来你运用的这玩意,不错,我也要!! ContainerDNS

    转自社区 ContainerDNS 本文介绍的 DNS 命名为 ContainerDNS,作为京东商城软件定义数据中心的关键基础服务之一,具有以下特点: 分布式,高可用 自动发现服务域名 后端探活 易 ...

  7. ASP.NET错误处理的方式(二)

    要创建页中的全局处理程序,请创建 Page_Error 事件的处理程序.要创建应用程序范围的错误处理程序,请在 Global.asax 文件中将代码添加到 Application_Error 方法.只 ...

  8. 一、Asp.Net Core WebAPI——修改默认监听端口

    参考文档 添加host.json文件 { "urls": "https://localhost:44389;http://localhost:44380" } ...

  9. August 29th 2017 Week 35th Tuesday

    Life is a pure flame, and we live by an invisible sun within us. 生命如纯洁的火焰,而维系这火焰的是我们内心的太阳. Burn my l ...

  10. 用ABAP代码读取S/4HANA生产订单工序明细

    在S/4HANA事务码CO03显示的Production Order里,我希望用ABAP代码显示出该订单的operation(工序)ID,描述和状态Status,如下图所示: 很简单的几行ABAP代码 ...