原文地址:Spring Cloud 入门 之 Ribbon 篇(二)

博客地址:http://www.extlight.com

一、前言

上一篇《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 的依赖。

  1. 请求类添加 @LoadBalanced 注解:
@Configuration
public class RestConfiguration { @Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

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

  1. 修改请求地址:
@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 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...

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

    原文地址:Spring Cloud 入门 之 Zuul 篇(五) 博客地址:http://www.extlight.com 一.前言 随着业务的扩展,微服务会不对增加,相应的其对外开放的 API 接口 ...

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

    原文地址:Spring Cloud 入门 之 Eureka 篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Cloud 是一系列框架的有序集合.它利用 Sp ...

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

    原文地址:Spring Cloud 入门 之 Config 篇(六) 博客地址:http://www.extlight.com 一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分 ...

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

    原文地址:Spring Cloud 入门 之 Hystrix 篇(四) 博客地址:http://www.extlight.com 一.前言 在微服务应用中,服务存在一定的依赖关系,如果某个目标服务调用 ...

  6. Spring Cloud入门教程-Ribbon实现客户端负载均衡

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...

  7. <Spring Cloud>入门三 Ribbon

    1.Ribbon 客户端软负载均衡组件 1.1配置 搭建了三个消费者供客户端调用: 1.修改yml eureka: client: service-url: defaultZone: http://e ...

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

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

  9. Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡

    接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...

随机推荐

  1. JavaScript基础知识笔记

    做前端几年了,一直疏于整理归纳,所以这两天把基础看了一遍,加上使用经验,整理了基础知识中关键技术,旨在系统性的学习和备忘.如果发现错误,请留言提示,谢谢! 重要说明:本文只列举基础知识点,中级和高级内 ...

  2. Python笔记 #17# Pandas: Merge

    10 Minutes to pandas Concat df = pd.DataFrame(np.random.randn(10, 4)) print(df) # break it into piec ...

  3. 怎样快速掌握一个用你没学过的框架写的PHP项目?

    我的思路一般是先搞定框架的route.也就是说,明白一个请求的url地址是对应的哪个controller处理的,找到controller后,再理解一下它的类库加载方案,也就是说一些辅助类以及自己逻辑类 ...

  4. VMware Vcenter Server 6.0忘记密码

    windows 版Vcenter6.0 重置密码首先要登录到安装Vcenter的windows服务器上 用管理员身份打开CMD命令行 进入VMware VCenter的目录 默认是C:\Program ...

  5. linux下如何关闭某个tmux窗口

    答:分成两个步骤,如下: 1.列出当前的tmux窗口 jello@jello:~$ tmux ls 1: 1 windows (created Tue Jan 17 09:28:05 2019) [2 ...

  6. Knockout 监控数组对象属性

    代码: function Product(ProductID,ProductName,ProductNum,Result,Price) { this.ProductID = ko.observable ...

  7. luogu P1025 数的划分

    https://www.luogu.org/problem/show?pid=1025 n的k划分 且不出现划分成0的情况  可以 分为两种情况 所有划分的数 都大于1的情况 至少划分的数里面有1的情 ...

  8. java虚拟机类加载

    java虚拟机中类的加载 (JVM的大致结构图) 从发class文件到内存中的类,按先后顺序,需要经过加载,链接以及初始化三大步骤. java语言的类型可分为两大类:基本类型(primitive ty ...

  9. 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)

    计算机网络七层协议模型 作者:Ryan    时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...

  10. 豆知识扩展:HTML<meta> tag

    豆知识: HTML<meta> tag Metadata 是关于数据的信息. The <meta> tag provides metadata关于网页.Metadat不会显示在 ...