1:Ribbon是什么
Ribbon是一个开源的客户端负载均衡器,由Netflix发布,是SpringCloud-Netflix中重要的一环,通过它将Netflix的中间层服务连接在一起。
Ribbon客户端组件提供一系列完善的配置项,如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的服务,Ribbon会自动的基于某种规则(如简单轮询,随机连接等)去连接这些服务,也很容易实现自定义的负载均衡算法。
2:Ribbon能干什么
Ribbon是在客户端来实现负载均衡的访问服务,主要的功能点:
- 服务发现,发现依赖服务的列表
- 服务选择规则,在多个服务中如何选择一个有效服务
- 服务监听,检测失效的服务,高效剔除失效服务
3:代码实例
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
官方的HelloWorld具体示例参看:
https://github.com/Netflix/ribbon/wiki/Getting-Started
4:参数配置
4.1:概述
对于Ribbon参数的key以及value类型的定义,可以通过com.netflix.client.config.CommonClientConfigKey查看
如果你没有配置任何属性,则ribbon会使用com.netflix.client.config.DefaultClientConfigImpl里的值
4.2:配置方式
Ribbon的参数配置通常有二种方式:全局配置以及指定客户端配置
- 全局配置的方式很简单只需要使用ribbon.<key>=<value>格式进行配置即可。
其中,<key>代表了Ribbon客户端配置的参数名,<value>则代表了对应参数的值。
比如,可以向下面这样配置Ribbon的超时时间:
ibbon.ConnectTimeout=250
全局配置可以作为默认值进行设置,当指定客户端配置了相应的key的值时,将覆盖全局配置的内容 - 指定客户端的配置方式
<client>.ribbon.<key>=<value>的格式进行配置
<client>表示服务名,比如没有服务治理框架的时候(如Eureka),需要指定实例清单,如:userService.ribbon.listOfServers=localhost:8080
4.3:配置示例my.properties:
# Max number of retries on the same server (excluding the first try)
hello-client.ribbon.MaxAutoRetries=1
# Max number of next servers to retry (excluding the first server)
hello-client.ribbon.MaxAutoRetriesNextServer=1
# Whether all operations can be retried for this client
hello-client.ribbon.OkToRetryOnAllOperations=true
# Interval to refresh the server list from the source
hello-client.ribbon.ServerListRefreshInterval=2000
# Connect timeout used by Apache HttpClient
hello-client.ribbon.ConnectTimeout=3000
# Readtimeout used by Apache HttpClient
hello-client.ribbon.ReadTimeout=3000
# Initial list of servers, can be changed via Archaius dynamic property at runtime
#ribbon.listOfServers=localhost:8765
hello-client.ribbon.listOfServers=localhost:8765,localhost:8766
hello-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
ConfigurationManager.loadPropertiesFromResources("my.properties"); // 1
System.out.println(
ConfigurationManager.getConfigInstance()
.getProperty("hello-client.ribbon.listOfServers"));
RestClient client = (RestClient) ClientFactory.getNamedClient("hello-client"); // 2
HttpRequest request = HttpRequest.newBuilder().uri(new URI("/userServiceProvider?name=cc5")).build(); // 3
for (int i = 0; i < 15; i++) {
HttpResponse response = client.executeWithLoadBalancer(request); // 4
System.out.println("Status code for " + response.getRequestedURI() + " :" + response.getStatus());
}
## 4.4:启动查看日志:
![image.png](https://upload-images.jianshu.io/upload_images/23729306-cb502b1e8075d3ba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 5:Ribbon核心组件
## 5.1:Ribbon核心组件
- IRule:根据特定算法中从服务列表中选取一个要访问的服务
- IPing:后台运行线程,用来判断服务是否可用
- ServerList: 服务列表,可以是静态的或动态的。如果它是动态的,后台线程将刷新并按一定的时间间隔过滤列表
- ServerListFilter:该接口允许过滤配置或动态获取的具有所需特性的服务器列表
- ServerListUpdater:被DynamicServerListLoadBalancer用于动态的更新服务列表
- IClientConfig:定义各种配置信息,用来初始化ribbon客户端和负载均衡器
- ILoadBalancer:定义软件负载平衡器操作的接口。动态更新一组服务列表及根据指定算法从现有服务器列表中选择一个服务
## 5.2:配置
这些组件可以以编程方式设置,也可以是客户端配置属性的一部分,并通过反射创建。
支持的属性如下所示,应以<clientName>.ribbon.为前缀:
- NFLoadBalancerClassName:要使用的ILoadBalancer
- NFLoadBalancerRuleClassName:要使用的Irule
- NFLoadBalancerPingClassName:要使用的Iping
- NIWSServerListClassName:要使用的ServerList
- NIWSServerListFilterClassName:要使用的ServerListFilter
## 5.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
## 5.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的值实现具体的逻辑
## 5.5:ServerListFilter,常用实现有以下几种:
**都在com.netflix.loadbalancer包下面**
>1:ZoneAffinityServerListFilter 过滤掉所有的不和客户端在相同zone的服务,如果和客户端相同的zone不存在,才不过滤不同zone有服务。启用此配置使用以下配置<clientName>.ribbon.EnableZoneAffinity=true
2: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
## 5.6:ServerListUpdater,常用实现有以下几种:
**都在com.netflix.loadbalancer包下面**
1:PollingServerListUpdater 默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略
2:EurekaNotificationServerListUpdater 当收到缓存刷新的通知,会更新服务列表。
IClientConfig,常用实现有以下几种:
1:com.netflix.client.config.DefaultClientConfigImplIClientConfig的默认实现
## 5.7:ILoadBalancer,常用实现有以下几种:
**都在com.netflix.loadbalancer包下面**
1:DynamicServerListLoadBalancer DynamicServerListLoadBalancer组合Rule、IPing、ServerList、ServerListFilter、ServerListUpdater 实现类,实现动态更新和过滤更新服务列表
2:ZoneAwareLoadBalancer 这是DynamicServerListLoadBalancer的子类,主要加入zone的因素。统计每个zone的平均请求的情况,保证从所有zone选取对当前客户端服务最好的服务组列表
# 6:结合Eureka
## 6.1:代码示例(准备多个服务注册到eureka):
1:先加入依赖:
<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
2:写一个配置类,提供RestTemplate,示例如下:
@Bean
@LoadBalanced
public RestTemplate rt(){
return new RestTemplate();
}
3:写一个Hello2的Controller,在方法里面使用RestTemplate
@RestController
public class Hello2 {
@Autowired
private RestTemplate rt;
@Autowired
private LoadBalancerClient lbc;
@RequestMapping("/ribbon2")
public String ribbon2() {
String s = rt.getForObject("http://userService/userServiceProvider?name=cc5", String.class);
System.out.println("s==="+s);
return "okok";
}
}
4:启动SpringBoot的启动类,然后就可以通过页面进行访问测试了
![image.png](https://upload-images.jianshu.io/upload_images/23729306-d58bbf91ae276550.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
多次点击:
![image.png](https://upload-images.jianshu.io/upload_images/23729306-49998994caa588e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 6.2:说明:
>1:RestTemplate 是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
2:@LoadBalanced表示restTemplate使用LoadBalancerClient执行请求,会自动使用负载均衡策略,它内部会在RestTemplate中加入LoadBalancerInterceptor这个拦截器,这个拦截器的作用就是使用负载均衡。这样在访问远程服务的时候,可以直接使用Provider向Eureka Server注册的虚拟名字,如:
rt.getForObject("http://userService/userServiceProvider?name=cc", String.class);
3:当Eureka与Ribbon结合使用(即两者都在类路径上)时,ribbonServerList将被扩展为DiscoveryEnabledNIWSServerList,扩展名为Eureka的服务器列表。它还用NIWSDiscoveryPing替换IPing接口,代理到Eureka以确定服务器是否启动。
4:可以通过代码来进行配置,比如配置IRule、IPing等
5:设置属性ribbon.eureka.enabled = false将明确禁用在Ribbon中使用Eureka
# 7:重试机制
>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
# 8: @RibbonClient
>注解@RibbonClient,这样做的目的是为了在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效,形如:
@RibbonClient(name="userService",configuration=MyConf2.class)
1:这个userService不是随便写的,而是注册到Eureka发现组件上的微服务服务端,意思是要对所有工程名为userService的服务提供者进行负载均衡管理
2:官方文档明确给出了警告:这个测试配置类MyConf2不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。
相关推荐
2. **Hystrix**:是一种容错库,旨在通过添加延迟容忍性和容错逻辑来隔离远程系统、服务和第三方库的访问点,当出现故障时可以快速响应而不是长时间等待或者完全失败。 3. **Zuul**:作为边缘服务应用运行在一个或多...
- **开箱即用的设置**:Spring Boot 为 Spring 平台及其第三方库提供了一整套“开箱即用”的配置。这意味着开发者可以在几乎不需要额外配置的情况下开始项目。 - **减少样板配置**:Spring Boot 的设计重点在于减少...
【SpringCloud项目Demo】是一个基于SpringCloud框架的示例项目,旨在帮助开发者理解和学习如何在实际应用中使用SpringCloud...对于初学者来说,这是一个极好的学习资源,能够帮助他们快速上手SpringCloud并进行实践。
周阳老师制作的“SpringCloud2018第一季思维导图”是针对Spring Cloud学习的重要参考资料,它详细梳理了Spring Cloud的核心组件和技术体系,包括Eureka、Ribbon、Feign、Hystrix以及Zuul等关键模块,旨在帮助学习者...
3. **Hystrix**:这是Netflix提供的一个延迟和容错库,用于隔离调用服务和第三方库,防止级联失败。在"spring-boot-demo-master"中,你会看到Hystrix的熔断、降级、隔离等策略的实现。 4. **Zuul**:作为边缘服务,...
SpringBoot和SpringCloud是现代Java开发中非常重要的两个框架,它们在构建微服务架构中扮演着核心角色。这里我们将深入探讨这两个框架的关键概念及其在面试中可能会遇到的问题。 1. **SpringBoot** - **定义**:...
3. **SpringBoot**:用于快速构建独立的、生产级别的基于Spring的应用,自动配置和起步依赖使其易于上手。 4. **SpringCloud**:微服务治理框架,包括服务注册与发现、负载均衡、熔断器、配置中心等功能,用于构建...
3. **SpringCloud Alibaba组件**:深入理解Nacos、Sentinel、RocketMQ等组件的工作原理和使用方法。 4. **Vue.js入门**:介绍Vue.js的核心概念,如组件、指令、生命周期等,并通过实际案例演示如何创建Vue应用。 5. ...
bxy-open-cloud bxy-open-cloud是基于国内的Spring Cloud(Hoxton.SR1)+ SpringBoot(2.2.2.RELEASE)微服务化... ####简介构建基于OAuth2的开放平台,为APP端,应用服务提供统一接口管控平台,为第三方合作伙伴的
- 使用Spring Cloud组件,如Eureka(服务注册与发现)、Zuul(API网关)、Ribbon(客户端负载均衡器)等,实现服务间的通信和治理。 6. **测试**: - 提供`@SpringBootTest`等注解进行集成测试,支持模拟数据和...
它集成了大量常用的第三方库配置,如数据源、JPA、MVC、security等,使得开发者可以“零配置”快速启动项目。SpringBoot的核心理念是“约定优于配置”,它通过默认配置来减少项目的初始化工作,同时也提供了丰富的...
它集成了大量常用的第三方库配置,如JDBC、MongoDB、JPA、RabbitMQ、Quartz等,让开发者能够快速地创建出生产级别的独立运行的Java应用。 1. **Spring Boot核心概念** - **起步依赖(Starter Dependency)**:...
书中的内容可能涵盖如何利用Spring Cloud与Spring Boot结合,构建分布式系统,包括服务发现(Eureka)、配置中心(Config Server)、负载均衡(Ribbon)、熔断机制(Hystrix)等。 除此之外,Spring Boot在测试方面...
**三、创建第一个Spring Boot应用** 1. **创建新项目**:在IDE中选择Spring Initializr,配置项目信息,包括groupId、artifactId、version以及所需的起步依赖。 2. **编写主类**:添加@SpringBootApplication注解,...
3. **微服务开发**:讲解如何使用Spring Boot构建微服务,包括服务发现(如Eureka)、服务注册、API Gateway(如Zuul或Spring Cloud Gateway)、熔断机制(Hystrix)和服务间的通信(Ribbon或Feign)。 4. **安全...
**第3章:JAVA框架** - **Spring框架**:作为目前最流行的轻量级Java开发框架之一,Spring提供了依赖注入、面向切面编程等功能。本章详细介绍了Spring的核心模块及其应用场景。 - **MyBatis**:一种优秀的持久层...
它集成了大量常用的第三方库配置,如数据源、JPA、MVC、Swagger等,使得开发者可以“零配置”或少量配置地快速启动项目。 **一、SpringBoot核心特性** 1. **起步依赖(Starters)**:Spring Boot通过提供一系列的...