一、前言

上一篇《Spring Cloud 入门 之 Eureka 篇(一)》 介绍了微服务的搭建,服务注册与发现。但在文章中留了一个小尾巴--如何正确使用 Eureka 进行服务发现并调用服务。

本篇文章将介绍如何使用 Ribbon 完成发现服务的调用以及其负载均衡的规则的使用。

二、简单介绍

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具,其主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。

其运行原理如下图:

Ribbon 运行时分成 2 个步骤:

1) 先选择在同一个区域负载较少的 EurekaServer;
2) 再根据用户指定的策略,在从 EurekaServer 中获取注册列表中的服务信息进行调用。

其中,Ribbon 提供多种负载均衡策略:如轮询、随机、响应时间加权等。

三、实战演练

我们在 order-server 项目的基础上进行修改。不清楚的读者请先转移至 《Spring Cloud 入门 之 Eureka 篇(一)》 进行浏览。

此外,笔者额外的创建 2 个 goods-server 项目,即现在有 3 个 goods-server 项目给 order-server 服务实现客户端的负载均衡调用。

现在的项目列表如下:

服务实例 端口 描述
common-api - 公用的 api,如:实体类
eureka-server 9000 注册中心(Eureka 服务端)
goods-server 8081 商品服务(Eureka 客户端)
goods-server-02 8082 商品服务(Eureka 客户端)
goods-server-03 8083 商品服务(Eureka 客户端)
order-server 8100 订单服务(Eureka 客户端)

在 order-server 项目中:

  1. 添加依赖:

<dependencies>
<!-- common api -->
<dependency>
<groupId>com.extlight.springcloud</groupId>
<artifactId>common-api</artifactId>
<version>${parent-version}</version>
</dependency><!-- springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- eureka 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency><!-- ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>

添加加 ribbon 的依赖。

2. 请求类添加 @LoadBalanced 注解:

@Configuration
public class RestConfiguration {@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

正如上文介绍的,Ribbon 是客户端负载均衡工具,所以在 getRestTemplate 方法上添加 @LoadBalanced 注解实现负载均衡。

3. 修改请求地址:

@Service
public class OrderServiceImpl implements OrderService{@Autowired
private RestTemplate restTemplate;// @Autowired
// private DiscoveryClient client;@Override
public void placeOrder(Order order) throws Exception{// 获取商品服务地址列表
// List<ServiceInstance> list = this.client.getInstances("GOODS");
// String uri = "";
// for (ServiceInstance instance : list) {
// if (instance.getUri() != null && !"".equals(instance.getUri())) {
// uri = instance.getUri().toString();
// break;
// }
// }
//
// Result result = restTemplate.getForObject(new URI(uri + "/goods/goodsInfo/" + order.getGoodsId()), Result.class);Result result = this.restTemplate.getForObject("http://GOODS/goods/goodsInfo/" + order.getGoodsId(), Result.class);if (result != null && result.getCode() == 200) {
System.out.println("=====下订单====");
System.out.println(result.getData());
}
}}

修改 DiscoveryClient 相关代码,使用 GOODS 作为请求商品服务的请求 URL。

完成上边 3 个操作后,启动 3 台 goods-server 服务 和 order-server 服务,通过 Postman 进行测试,运行结果如下:

上图中,通过 6 次请求返回的商品的端口信息可知,Ribbon 默认使用负载均衡的策略是轮询,对服务进行调用。

四、负载均衡策略

# 4.1 策略规则

Ribbon 提供 IRule 接口,该接口定义了如何访问服务的方法,以下是该接口的实现类:

1) RoundRobinRule:轮询,默认使用的规则;
2) RandomRule:随机;
3) AvailabilityFilteringRule:先过滤由于多次访问故障而处于断路器跳闸状态以及并发连接数量超过阀值得服务,然后从剩余服务列表中按照轮询策略进行访问;
4) WeightedResponseTimeRule:根据平均响应时间计算所有的权重,响应时间越快服务权重越有可能被选中;
5) RetryRule:先按照 RoundRobinRule 策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务;
6) BestAvailableRule:先过滤由于多次访问故障而处于断路器跳闸状态的服务,然后选择并发量最小的服务;
7) ZoneAvoidanceRule:判断 server 所在区域的性能和 server 的可用性来选择服务器。

# 4.2 策略使用

在 order-server 项目中:

@Configuration
public class RestConfiguration {@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}@Bean
public IRule testRule() {
return new RandomRule();
}
}

手动创建负载均衡规则对象,本次测试使用的策略是随机。

启动 order-server 项目后再次使用 Postman 测试,运行结果如下:

由图可知,随机策略已生效,负载均衡的策略由轮询变成了随机。

五、案例源码

Ribbon demo 源码

Spring Cloud 入门 之 Ribbon 篇(二)相关推荐

  1. Spring Cloud 入门 之 Feign 篇(三)

    一.前言 在上一篇文章<Spring Cloud 入门 之 Ribbon 篇(二)> 中介绍了 Ribbon 使用负载均衡调用微服务,但存在一个问题:消费端每个请求方法中都需要拼接请求服务 ...

  2. Spring Cloud 入门 之 Zuul 篇(五)

    一.前言 随着业务的扩展,微服务会不对增加,相应的其对外开放的 API 接口也势必增多,这不利于前端的调用以及不同场景下数据的返回,因此,我们通常都需要设计一个 API 网关作为一个统一的 API 入 ...

  3. Spring Cloud 入门 之 Config 篇(六)

    一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分成多个小项目做成微服务,每个微服务都会有各自配置文件,管理和修改文件起来也会变得繁琐.而且,当我们需要修改正在运行的项目的配置时 ...

  4. Spring Cloud 入门 之 Hystrix 篇(四)

    一.前言 在微服务应用中,服务存在一定的依赖关系,如果某个目标服务调用慢或者有大量超时造成服务不可用,间接导致其他的依赖服务不可用,最严重的可能会阻塞整条依赖链,最终导致业务系统崩溃(又称雪崩效应). ...

  5. Spring Cloud 入门 之 Eureka 篇(一)

    一.前言 Spring Cloud 是一系列框架的有序集合.它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据 ...

  6. Spring Cloud入门教程(二):客户端负载均衡(Ribbon)

    对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...

  7. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  8. Spring Cloud入门-Ribbon服务消费者(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Ribbon简介 RestTemplate的使用 GET请求方法 getForObject方法 getForEntity方法 POST请求方法 p ...

  9. Spring Cloud入门 -- Ribbon服务消费者(Hoxton.SR5版)

    Ribbon简介 Ribbon是Netflix公司开源的客户端负载均衡器,可以控制Http和Tcp客户端的负载均衡. Ribbon默认提供了很多负载均衡算法,如:轮询.随机等,也可以实现自定义的负载均 ...

最新文章

  1. 使用 /proc 文件系统来访问 Linux 内核的内容
  2. ACT5.6 动手实验手册 如何在工作组模式下对客户端进行数据收集 如何在AD域环境下对...
  3. 一个老干部对即将从政的儿子的赠言
  4. 06-netty之http之文件服务器
  5. 反演控制 matlab,基于matlab的反演程序
  6. maven00----maven学习说明
  7. 数据库——关系数据理论学习笔记
  8. Unity HDRP 光照贴图
  9. PMP试题 | 每日一练,快速提分 9.3
  10. php qq邮箱验证码不显示图片,qq邮箱邮件图片不显示怎么解决-解决qq邮箱邮件图片不显示的方法 - 河东软件园...
  11. Android使用FFmpeg 解码H264并播放(一)
  12. java 夏令时标志_Java里面的夏令时 | 学步园
  13. 买到招行CMP1一天赚90
  14. 论文阅读笔记:Layer Normalization
  15. 外包公司值不值得去?外包公司的面试特点
  16. 处理器最新排行_CPU跑分工具CINBENCH R23排行榜出炉:AMD锐龙单核、多核均屠榜
  17. Android Studio 扫描识别二维码(包含闪光灯和本地二维码)、生成二维码、生成带logo的二维码
  18. 分众传媒天天挂在嘴边的“饱和攻击”,原来只是最强话术
  19. 南京邮电大学CTF题目writeup (二) 含题目地址
  20. C语言宏和函数的区别详解。

热门文章

  1. Linux目录功能及文件类型,linux目录作用详解(超详细,树状排版)
  2. 五、Hashtable与HashMap的区别
  3. metasploit 使用search报错
  4. (计算机组成原理题目题型总结)第六章:总线
  5. (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)
  6. (计算机组成原理)第五章中央处理器-第五节2:指令流水线影响因素和分类及多发技术
  7. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
  8. http请求头中Referer的作用及危害
  9. 从零开始学PowerShell(1)初见基础命令
  10. Linux ulimit命令(控制shell执行程序的资源、并发)