`
wang94777600
  • 浏览: 11472 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringCloud- 第十篇 Ribbon

 
阅读更多

1:Ribbon是什么

Ribbon是一个开源的客户端负载均衡器,由Netflix发布,是SpringCloud-Netflix中重要的一环,通过它将Netflix的中间层服务连接在一起。
Ribbon客户端组件提供一系列完善的配置项,如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的服务,Ribbon会自动的基于某种规则(如简单轮询,随机连接等)去连接这些服务,也很容易实现自定义的负载均衡算法。

2:Ribbon能干什么

Ribbon是在客户端来实现负载均衡的访问服务,主要的功能点:
1:服务发现,发现依赖服务的列表
2:服务选择规则,在多个服务中如何选择一个有效服务
3:服务监听,检测失效的服务,高效剔除失效服务

3:架构图

image.png
image.png

4:集成

  • 加入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

先不要加Eureka的starter
官方的HelloWorld
具体示例参看:
https://github.com/Netflix/ribbon/wiki/Getting-Started

5:参数配置

5.1:概述

对于Ribbon参数的key以及value类型的定义,可以通过com.netflix.client.config.CommonClientConfigKey查看
如果你没有配置任何属性,则ribbon会使用com.netflix.client.config.DefaultClientConfigImpl里的值

5.2:配置方式

Ribbon的参数配置通常有二种方式:全局配置以及指定客户端配置

  • 全局配置的方式很简单只需要使用ribbon.<key>=<value>格式进行配置即可。
    其中,<key>代表了Ribbon客户端配置的参数名,<value>则代表了对应参数的值。
    比如,可以向下面这样配置Ribbon的超时时间:
    ribbon.ConnectTimeout=250
    全局配置可以作为默认值进行设置,当指定客户端配置了相应的key的值时,将覆盖全局配置的内容
  • 指定客户端的配置方式
    <client>.ribbon.<key>=<value>的格式进行配置
    <client>表示服务名,比如没有服务治理框架的时候(如Eureka),需要指定实例清单,如:userService.ribbon.listOfServers=localhost:8080

6:核心组件

6.1:Ribbon核心组件

  • IRule:根据特定算法中从服务列表中选取一个要访问的服务
  • IPing:后台运行线程,用来判断服务是否可用
  • ServerList: 服务列表,可以是静态的或动态的。如果它是动态的,后台线程将刷新并按一定的时间间隔过滤列表
    还有:
  • ServerListFilter:该接口允许过滤配置或动态获取的具有所需特性的服务器列表
  • ServerListUpdater:被DynamicServerListLoadBalancer用于动态的更新服务列表
  • IClientConfig:定义各种配置信息,用来初始化ribbon客户端和负载均衡器
  • ILoadBalancer:定义软件负载平衡器操作的接口。动态更新一组服务列表及根据指定算法从现有服务器列表中选择一个服务

6.2:配置

这些组件可以以编程方式设置,也可以是客户端配置属性的一部分,并通过反射创建。
支持的属性如下所示,应以<clientName>.ribbon.为前缀:

  • NFLoadBalancerClassName:要使用的ILoadBalancer
  • NFLoadBalancerRuleClassName:要使用的Irule
  • NFLoadBalancerPingClassName:要使用的Iping
  • NIWSServerListClassName:要使用的ServerList
  • NIWSServerListFilterClassName:要使用的ServerListFilter

6.3:IRule,常用实现有以下几种:

都在com.netflix.loadbalancer包下面

1:RoundRobinRule:轮询规则
2:RandomRule:随机获取一个服务
3:AvailabilityFilteringRule
这个负载均衡器规则,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
4:WeightedResponseTimeRule 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大、被选中的概率越高。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule。
5:RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务
6:BestAvailableRule 此负载均衡器会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
7:ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择server

6.4:IPing,常用实现有以下几种:

都在com.netflix.loadbalancer包下面
1:DummyPing:默认实现,默认返回true,即认为服务永远活着
2:NIWSDiscoveryPing 不执行真正的ping。如果Discovery Client认为是在线,则程序认为本次心跳成功,服务活着
3:PingUrl 此组件会使用HttpClient调用服务的一个URL,如果调用成功,则认为本次心跳成功,表示此服务活着。
4:NoOpPing:永远返回true,即认为服务永远活着
ServerList,常用实现有以下几种:
都在com.netflix.loadbalancer包下面
1:ConfigurationBasedServerList,从配置文件中获取所有服务列表,也是静态获取服务列表,配置例子:sample-client.ribbon.listOfServers=
2:DiscoveryEnabledNIWSServerList
从Eureka Client中获取服务列表。此值必须通过属性中的VipAddress来标识服务器集群。DynamicServerListLoadBalancer会调用此对象动态获取服务列表
3:DomainExtractingServerList:代理类,根据ServerList的值实现具体的逻辑

7: 结合Eureka

在SpringCloud中使用的HelloWorld

  • 先加入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

可以不用加入Ribbon依赖,因为Eureka的starter里面包含了ribbon

  • 写一个配置类
    提供RestTemplate,示例如下:
@Bean
@LoadBalanced
public RestTemplate rt(){
    return new RestTemplate();
}
  • 写一个Hello2的Controller,在方法里面使用RestTemplate
  • 启动SpringBoot的启动类,然后就可以通过页面进行访问测试了

8: RestTemplate

  • RestTemplate 是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
  • @LoadBalanced表示restTemplate使用LoadBalancerClient执行请求,会自动使用负载均衡策略,它内部会在RestTemplate中加入LoadBalancerInterceptor这个拦截器,这个拦截器的作用就是使用负载均衡。这样在访问远程服务的时候,可以直接使用Provider向Eureka Server注册的虚拟名字,如:
    rt.getForObject("http://userService/userServiceProvider?name=cc", String.class);
  • 当Eureka与Ribbon结合使用(即两者都在类路径上)时,ribbonServerList将被扩展为DiscoveryEnabledNIWSServerList,扩展名为Eureka的服务器列表。它还用NIWSDiscoveryPing替换IPing接口,代理到Eureka以确定服务器是否启动。
  • 可以通过代码来进行配置,比如配置IRule、IPing等
  • 设置属性ribbon.eureka.enabled = false将明确禁用在Ribbon中使用Eureka

9:ServerListFilter

常用实现有以下几种:
都在com.netflix.loadbalancer包下面

  • ZoneAffinityServerListFilter 过滤掉所有的不和客户端在相同zone的服务,如果和客户端相同的zone不存在,才不过滤不同zone有服务。启用此配置使用以下配置
    <clientName>.ribbon.EnableZoneAffinity=true
  • ServerListSubsetFilter ZoneAffinityServerListFilter的子类。此过滤器确保客户端仅看到由ServerList实现返回的整个服务器的固定子集。 它还可以定期用新服务器替代可用性差的子集中的服务器。要启用此过滤器,请指定以下属性:
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList 
# the server must register itself with Eureka server with VipAddress "myservice"
myClient.ribbon.DeploymentContextBasedVipAddresses=myservice
myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListSubsetFilter
# only show client 5 servers. default is 20.
myClient.ribbon.ServerListSubsetFilter.size=5

10:ServerListUpdater

ServerListUpdater,常用实现有以下几种:
都在com.netflix.loadbalancer包下面

  • PollingServerListUpdater 默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略
  • EurekaNotificationServerListUpdater 当收到缓存刷新的通知,会更新服务列表。

11:IClientConfig

常用实现有以下几种:
com.netflix.client.config.DefaultClientConfigImpl IClientConfig的默认实现

12:ILoadBalancer

常用实现有以下几种:
都在com.netflix.loadbalancer包下面

  • DynamicServerListLoadBalancer DynamicServerListLoadBalancer组合Rule、IPing、ServerList、ServerListFilter、ServerListUpdater 实现类,实现动态更新和过滤更新服务列表
  • ZoneAwareLoadBalancer 这是DynamicServerListLoadBalancer的子类,主要加入zone的因素。统计每个zone的平均请求的情况,保证从所有zone选取对当前客户端服务最好的服务组列表

13:重试机制

SpringCloud通过整合Spring retry来增强RestTemplate的重试能力,对于开发者来说,只需要简单配置,即可完成重试策略,配置示例如下:
//该参数用来开启重试机制,它默认是关闭的

spring.cloud.loadbalancer.retry.enabled=true 
//断路器的超时时间需要大于Ribbon的超时时间,不然不会触发重试
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 
//请求连接超时时间
userService.ribbon.ConnectTimeout=250 
//请求处理的超时时间
userService.ribbon.ReadTimeout=1000 
//对所有操作请求都进行重试
userService.ribbon.OkToRetryOnAllOperations=true 
//切换实例的重试次数
userService.ribbon.MaxAutoRetriesNextServer=2 
//对当前实例的重试次数
userService.ribbon.maxAutoRetries=1

14:@RibbonClient

注解@RibbonClient,这样做的目的是为了在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效,形如:
@RibbonClient(name="userService",configuration=MyConf2.class)

  • 这个userService不是随便写的,而是注册到Eureka发现组件上的微服务服务端,意思是要对所有工程名为userService的服务提供者进行负载均衡管理
  • 官方文档明确给出了警告:这个测试配置类MyConf2不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。
分享到:
评论

相关推荐

    springcloud-demo-master_spring-cloud_cloud_

    【标题】"springcloud-demo-master_spring-cloud_cloud_" 指的是一个基于Spring Cloud的示例项目,这个项目主要用于学习和演示Spring Cloud的核心功能和基本流程。Spring Cloud是微服务架构的重要工具集,它提供了...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    该项目是一个典型的由Spring Cloud管理的微服务项目,主要包括如下模块 micro-service-cloud─────────────────顶层项目 ├──cloud-service-core───────────────基础核心模块 ├...

    毕业设计之SpringCloud-B2C电子商务平台App端.zip

    【标题】"毕业设计之SpringCloud-B2C电子商务平台App端.zip" 提供了一个基于SpringCloud框架构建的B2C电子商务平台的移动端实现。这个项目旨在展示如何利用微服务架构来设计和开发一个完整的电子商务应用。 【描述...

    spring cloud视频教程

    - 掌握创建第一个 Spring Cloud 项目的步骤。 2. **Eureka 服务注册与发现**: - Eureka 作为服务注册中心的角色,如何实现服务提供者和服务消费者之间的通信。 - 学习服务实例的注册、心跳机制、服务健康检查等...

    毕业设计之SpringCloud-B2C电子商务平台服务端.zip

    【标题】"SpringCloud-B2C电子商务平台服务端"是一个基于SpringCloud框架构建的电子商务系统后端项目。SpringCloud是一个微服务开发工具集,它利用SpringBoot的开发便利性,快速构建分布式系统中的配置管理、服务...

    SpringCloud第3季2024.7z

    本资源"SpringCloud第3季2024.7z"很可能包含的是关于SpringCloud最新版本的教程或资料,可能涵盖了一些最新的特性和最佳实践。 1. **服务发现**:SpringCloud使用Eureka作为默认的服务注册与发现组件。服务提供者向...

    Spring Cloud Greenwich SR2 官方文档

    2. **负载均衡**:Spring Cloud Netflix Ribbon是一个客户端负载均衡器,它可以与Eureka结合使用,自动将请求分发到不同的服务实例。 3. **断路器模式**:Spring Cloud Netflix Hystrix实现了断路器模式,用于防止...

    SpringBoot+SpringCloud面试题.doc

    Spring Boot和Spring Cloud是现代Java开发中的两个关键框架,它们在构建微服务架构中起着至关重要的作用。Spring Boot作为Spring框架的一个子项目,旨在简化应用程序的创建和配置过程,而Spring Cloud则提供了全面的...

    SpringCloud第二季脑图.rar

    "SpringCloud第二季脑图.rar"很可能包含周阳老师关于SpringCloud的系统性学习路径和关键概念的图表化表示,这对于理解和掌握SpringCloud的架构和组件非常有帮助。 1. **Spring Cloud Eureka**:Eureka是服务注册与...

    springCloud项目练习

    第二课: 服务消费者(rest+ribbon) ... 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: 断路器聚合监控(Hystrix Turbine) 第十四课: 服务注册(consul)

    spring-cloud.pdf

    Spring Cloud由多个模块组成,包括Spring Cloud Context, Spring Cloud Commons, Spring Cloud LoadBalancer, Spring Cloud CircuitBreaker, ConfigurationProperties, Spring Cloud Config, Spring Cloud Netflix, ...

    spring boot+spring cloud视频教学下载全套

    ├10 4.6 Ribbon-3使用配置文件自定义Ribbon Client.avi ├11 4.7 Ribbon-4 Ribbon脱离Eureka使用.avi ├12 4.8 Feign-1 Feign的简介及基础使用.avi ├13 4.9 Feign-2覆写Feign的默认配置.avi ├14 4.10 Fegion-3...

    想学习的看过来了spring4.0、springboot、springcloud详细视频课程(硅谷)

    10.硅谷学习_SpringCloud_SpringCloud是什么 11.硅谷学习_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.硅谷学习_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.硅谷学习_SpringCloud_SpringCloud功能域和...

    deep-in-spring-cloud-samples:《深入理解 Spring Cloud 与实战》配套示例代码

    第 10 章 Spring Cloud 与 Serverless 覆盖技术栈 Spring Boot Alibaba Nacos Netflix Eureka Spring Cloud LoadBalancer Netflix Ribbon OpenFeign Dubbo Spring Cloud Spring Cloud Config Client/Server Spring ...

    《深入理解Spring Cloud与微服务构建》word版本

    4. **Ribbon客户端负载均衡**:Ribbon是Netflix开源的客户端负载均衡器,它集成在Spring Cloud中,可以配合Eureka实现服务间的负载均衡。 5. **Hystrix断路器**:Hystrix是Netflix的一个库,用于实现容错管理,通过...

    尚硅谷SpringCloud第一季最新笔记

    尚硅谷是一家知名的在线教育机构,其推出的SpringCloud第一季课程由周阳老师主讲,深受学员喜爱。本笔记集合了该课程的核心知识点,旨在帮助开发者深入理解SpringCloud的基础概念和实际应用。 1. **Eureka**:作为...

    SpringCloud接收文件

    在SpringCloud框架中,文件上传和下载是常见的功能需求,特别是在构建微服务架构时。SpringCloudFileSvr可能是一个专门处理文件操作的服务,用于提供文件的上传、存储和下载等功能。下面将详细介绍如何在SpringCloud...

    尚硅谷周阳SpringCloud第一季笔记(超详细非官方手工笔记)

    尚硅谷的周阳老师以其深入浅出的教学风格,深受学员喜爱,他的SpringCloud第一季课程旨在帮助学员掌握SpringCloud的核心技术。 在这一季的课程中,周阳老师将详细讲解以下知识点: 1. **Spring Cloud简介**:首先...

    尚硅谷Java视频教程_SpringCloud视频教程

    10.尚硅谷_SpringCloud_SpringCloud是什么 11.尚硅谷_SpringCloud_SpringCloud_VS_SpringBoot区别对比 12.尚硅谷_SpringCloud_SpringCloud_VS_Dubbo区别对比 13.尚硅谷_SpringCloud_SpringCloud功能域和官网资料...

Global site tag (gtag.js) - Google Analytics