Spring Cloud Ribbon

知识点:

  • Ribbon介绍(3点)
  • 使用方法
  • 负载均衡策略和自定义负载均衡策略
  • Ping机制
  • Ribbon配置

1、介绍

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的。

  1. Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡工具
  2. spring cloud进行二次封装,让我们可以将面向服务的Rest模板(RestTemplate)请求装换成客户端负载均衡的服务调用
  3. 不需要单独部署

2、客户端负载均衡

在调用者服务中实现负载均衡,来分发请求至被调用者。如图所示

3、使用方法

3.1、单独使用

3.1.1、导入Ribbon使用的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId><version>2.2.9.RELEASE</version>
</dependency>
3.1.2、配置文件
# 配置被调用服务集合
goods-service.ribbon.listOfServers=\http://localhost:9090/goods,http://localhost:9093/goods# httpClient 连接池最大总连接数
ribbon.MaxTotalConnections=200
# httpClient 每个host最大连接数
ribbon.MaxConnectionsPerHost=50
3.1.3、LoadBalancerClient方式
@Autowired
private LoadBalancerClient loadbalancerClient;@GetMapping
public String goods(){log.info("begin do order");ServiceInstance si=loadbalancerClient.choose("goods-service");String url=String.format("http://%s:%s",si.getHost(),si.getPort());log.info("ribbon-url:{}",url);String goodsInfo=restTemplate.getForObject(url,String.class);return goodsInfo;
}
3.1.4、通过@LoadBalanced注解方式

配置RestTemplate时,添加@LoadBalanced注解

@Configuration
public class RestTemplateConfiguration {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

接口调用,直接通过服务名goods-service调用

@GetMapping
public String goods(){log.info("begin do order");String url="http://goods-service/goods";String goodsInfo=restTemplate.getForObject(url,String.class);return goodsInfo;
}

3.2、基于Eureka的使用

3.2.1、添加依赖
<!--Spring Cloud Ribbon 依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId><version>2.2.9.RELEASE</version>
</dependency>
<!--Spring Cloud Eureka 客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2.2、注入RestTemplate

通过@LoadBalanced注解开启

@Configuration
public class RestTemplateConfiguration {@Bean@LoadBalanced //在客户端使用 RestTemplate 请求服务端时,开启负载均衡(Ribbon)public RestTemplate restTemplate(){return new RestTemplate();}
}
3.2.3、配置文件application.properties
server:port: 80 #端口号
# eureka配置
eureka:client:register-with-eureka: false # 本微服务为服务消费者,不需要将自己注册到服务注册中心fetch-registry: true  # 本微服务为服务消费者,需要到服务注册中心搜索服务service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #服务注册中心集群
3.2.4、接口调用

直接使用goods-service,服务提供者的服务名称调用,ribbon会通过eureka获取服务列表,通过负载策略选择服务

@GetMapping
public String goods(){log.info("begin do order");String url="http://goods-service/goods";String goodsInfo=restTemplate.getForObject(url,String.class);return goodsInfo;
}

4、Ribbon自定义负载均衡策略

Ribbon提供的负载均衡策略

序号 实现类 负载均衡策略
1 RoundRobinRule 按照线性轮询策略,即按照一定的顺序依次选取服务实例
2 RandomRule 随机选取一个服务实例
3 RetryRule 按照 RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回 null 。
4 WeightedResponseTimeRule WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。
5 BestAvailableRule 继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。
6 AvailabilityFilteringRule 先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。
7 ZoneAvoidanceRule 默认的负载均衡策略,综合判断服务在不同区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RoundRobinRule)策略类似。

如上图所示,Ribbon已经提供很多负载均衡策略,如果我们想定义自己的负载均衡策略可以通过如下方式,实现

4.1、集成AbstractLoadBalancerRule,实现choose方法

package com.gupaoedu.mall.gpmallportal;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import java.util.List;public class DefinieIpHashRule extends AbstractLoadBalancerRule {@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {//....}public Server choose(ILoadBalancer lb, Object key) {if(lb==null){return null;}Server server=null;while(server==null){//表示启动的服务列表.(默认情况下单纯只用Ribbon时,不会对目标服务做心跳检测)List<Server> upList=lb.getReachableServers();List<Server> allList=lb.getAllServers();int serverCount=upList.size();if(serverCount==0){return null;}int index=ipAddressHash(serverCount);server=upList.get(index);}return server;}private int ipAddressHash(int serverCount){ServletRequestAttributes requestAttributes= (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();String remoteAddr=requestAttributes.getRequest().getRemoteAddr();int code=Math.abs(remoteAddr.hashCode());return code%serverCount;}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(),key);}
}

4.2、配置文件

配置服务名称是goods-service的使用自定义负载均衡

goods-service.ribbon.NFLoadBalancerRuleClassName=com.xxxx.xxx.DefinieIpHashRule

5、Ribbon的Ping机制

在Ribbon负载均衡器中,提供了ping机制,每隔一段时间,就会去ping服务器,由 com.netflix.loadbalancer.IPing 接口去实现。

单独使用ribbon,不会激活ping机制,默认采用DummyPing(在RibbonClientConfiguration中实例化),isAlive()方法直接返回true。

Ribbon和Eureka集成,默认采用NIWSDiscoveryPing(在EurekaRibbonClientConfiguration中实例化的),只有服务器列表的实例状态为up的时候 才会为Alive。

IPing中默认内置了一些实现方法如下

  1. PingUrl: 使用httpClient对目标服务逐个实现Ping操作。
  2. DummyPing: 默认认为对方服务是正常的,直接返回true。
  3. NoOpPing:永远返回true。

5.1、实现com.netflix.loadbalancer.IPing接口

public class HealthChecker implements IPing {@Overridepublic boolean isAlive(Server server) {String url="http://"+server.getId()+"/healthCheck";boolean isAlive=true;HttpClient httpClient=new DefaultHttpClient();HttpUriRequest request=new HttpGet(url);try {HttpResponse response = httpClient.execute(request);isAlive = response.getStatusLine().getStatusCode() == 200;}catch (Exception e){isAlive=false;}finally {request.abort();}return isAlive;}
}

5.2、配置文件

goods-service.ribbon.NFLoadBalancerPingClassName=com.xxxxx.xxx.HealthChecker

6、Ribbon配置详解

Ribbon配置详解

Spring Cloud Ribbon 详解相关推荐

  1. Spring Cloud原理详解

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

  2. Spring Cloud Ribbon 全解 (1) - 总览篇

    本文基于SpringCloud-Dalston.SR5 Ribbon是一个客户端负载均衡解决方案,简单来说,就是从Eureka获取可用服务实例列表,然后将请求根据某种策略发到这些实例上面执行 What ...

  3. Spring Boot加密配置属性--Spring Cloud Vault详解

    项目中敏感配置信息一般需要进行加密处理,比如数据库密码,Spring Boot内置不提供加密支持,不能加密配置文件信息,在官方文档中提供了自定义Environment和Spring Cloud Vau ...

  4. Spring Cloud Fegin 详解(一)

    1). Fegin 的基础功能 FeginClient 注解@Target(ElementType.TYPE)修饰,表示FeginClient注解的作用目标在接口上.FeginClient注解对应的属 ...

  5. java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解

    我们从整体上来看一下Spring Cloud各个组件如何来配套使用: 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六 从上图可以看出 ...

  6. java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解...

    我们从整体上来看一下Spring Cloud各个组件如何来配套使用:  从上图可以看出Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构. 其中Eureka负责服务的注册与发现, ...

  7. Spring cloud gateway 详解和配置使用

    spring cloud gateway 介绍 1. 网关是怎么演化来的 单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务 注:图片来自网络 2. 网关的基本功能 网关核心功能是路 ...

  8. turbine java_微服务搭建集成Spring Cloud Turbine详解

    1.概述 本文中,我将向你介绍Spring Cloud Netflix Turbine.它将多个Hystrix Metrics Streams 聚合为一个,以便显示在一个仪表板视图中. 简要介绍Hys ...

  9. Spring Cloud Ribbon 全解 (4) - 基本组件实现源码(2)

    本文基于SpringCloud-Dalston.SR5 我们继续逐个分析 所有Ribbon负载均衡器需要实现的接口IClient 服务实例列表维护机制实现的接口ServerList 负载均衡数据记录L ...

  10. 第16课:Spring Cloud 实例详解——基础框架搭建(三)

    本文我们将集成 Redis,实现 API 鉴权机制. Redis 的集成 Spring Boot 集成 Redis 相当简单,只需要在 pom 里加入如下依赖即可: <dependency> ...

最新文章

  1. python开发效率高吗_提升python开发者工作效率的六个库,你知道几个?
  2. MarkDown编辑器常用语法
  3. Android开发入门之学习笔记(三):程序窗口的布局
  4. 两日公开课:伯克利深度强化学习训练营 | 视频+PPT
  5. Oracle 11g新特性密码大小写敏感问题
  6. 153. php 引用
  7. 【NOI 2001】食物链(种类并查集)
  8. androidstudio自动生成变量_Android Studio 安装教程
  9. 三角计算机器应用试卷,2015-1月信息科技学科期末考试试题
  10. [来自软件No1]XP Skin Pack系统主题-把windows 7变回xp的模样
  11. 华创e路航固件_华创e路航地图升级工具 v1.0 官方版(图文)
  12. 微信公共平台 首次关注 自动回复消息
  13. 猿创征文|人工智能啾养成之路 - 写代码三天,CSDN治好了我的精神内耗
  14. Python处理图片九宫格,炫酷朋友圈
  15. Unity + LeapMotion 识别食指伸出以及食指与 UGUI的 交互
  16. 勒索软件频繁升级,了解常见勒索软件很有必要
  17. 资深营销团队管理专家——文彬
  18. ACM求多边形重心和面积问题
  19. 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
  20. 【VMCloud云平台】SCAP(四)租户(一)

热门文章

  1. www.skymaya.com:8080/index.php,www_skymaya_com
  2. linux佳能打印机服务,Canon LBP2900打印机安装Linux驱动的经验:已在Deepin中成功
  3. 软件工程基础知识 二
  4. 在Intellij IDEA中使用Debug
  5. python实现学生座位表排表
  6. (2019)基于传感器融合的机会主义占用计数估计:一个案例研究
  7. 做互联网最重要的是希望! 【水木周平】
  8. 通过DeviceIoControl获取真实网卡地址
  9. Python滑块验证码之腾讯防水墙简单测试版
  10. 怎样用自己电脑搭建网络服务器!不花一分钱