ribbon使用
学习中笔记
一、ribbon使用(不使用服务发现)
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2、使用@RibbonClient配置功能区客户端
如果使用服务发现的功能,一般不去使用此方法开启ribbon,除非在没有使用服务发现的情况下或者需要为特定的功能区客户端自定义功能区设置
-
定义一个ribbonclient
Name:为特定name的ribbon client自定义配置。
Configuration:指定Ribbon的配置类 -
配置文件中定义
name对应配置文件中指定的客户端名称
${clientName}.ribbon.ConnectTimeout=500
mxm-user:
ribbon:
listOfServers: localhost:8110,localhost:8111,localhost:8112
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
MaxAutoRetries: 1
# 最多重试多少台服务器,Max number of next servers to retry (excluding the first server)
MaxAutoRetriesNextServer: 3
# 无论是请求超时或者socket read timeout都进行重试,Whether all operations can be retried for this client
OkToRetryOnAllOperations: true
# Interval to refresh the server list from the source
ServerListRefreshInterval: 2000
# 请求连接的超时时间
ConnectTimeout: 5000
# 请求处理的超时时间
ReadTimeout: 5000
- restTemplate调用
二、ribbon使用(restTemplate)
- 引入依赖继承了Nacos后不需要添加任何依赖,已经内置了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 开启ribbon
启动类加上@EnableDiscoveryClient 注解,并初始化restTemplate,在restTemplate加上@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。开启ribbon
@LoadBalanced注解用作标记注释,指示被注释的对象RestTemplate应使用LoadBalancerClient与服务进行交互。
三、ribbon使用(feign)
- 引入依赖。 由于spring-cloud-starter-openfeign中默认已经引入了ribbon。即使不做额外的配置ribon也已经在使用
- 以上完成配置,创建三个mxm-user实例使用demo-test进行ribbon的测试。因为ribbonclient的定义和feign的定义字段相同,进行共用。在创建name为mxm-user的feignclient的时候也创建了ribbonclient
五、自定义ribbon客户端配置
配置文件的优先级 > java代码的配置方式 > netflix自定义的配置方式
- 配置文件方式
配置项 | 说明 |
---|---|
《clientName》.ribbon.NFLoadBalancerClassName | 指定ILoadBalancer的实现类 |
《clientName》.ribbon.NFLoadBalancerRuleClassName | 指定IRule的实现类 |
《clientName》.ribbon.NFLoadBalancerPingClassName | 指定IPing的实现类 |
《clinetName》.ribbon.NIWSServerListClassName | 指定ServerList的实现类 |
《clientName》.ribbon.NIWSServerListFilterClassName | 指定ServerListFilter的实现类 |
- java代码方式
Bean | beanTyp | 作用 | 默认值 |
---|---|---|---|
IClientConfig | ribbonClientConfig | 读取配置 | 默认采用 DefaultClientConfigImpl 实现。 |
IRule | ribbonRule | 负载均衡策略 | 默认采用ZoneAvoidanceRule 实现,该策略能够在多区域环境下选择最佳区域的实例进行访问 |
IPing | ribbonPing | 实例检查策略筛选掉ping不同的实例 | 默认采用NoOpPing 实现,该检查策略是一个特殊的实现,实际上他并不会检 |
ServerList | ribbonServerList | 服务实例清单的维护机制 | 默认采用 ConfigurationBasedServerList 实现。 |
ServerListFilter | ribbonServerListFilter | 服务实例清单过滤机制 | 默认采用 ZonePreferenceServerListFilter 实现,该策略能够优先过滤出与请求调用方处理同区域的服务实现 |
ILoadBalancer | ribbonLoadBalancer | 负载均衡器 | 默认采用ZoneAwareLoadBalancer 实现,他具备了区域感知的能力 |
ServerListUpdater | ribbonServerListUpdater | 更新交给ribbon list的策略 | 默认采用PollingserverListUpdater,动态更新它通过定时任务的方式进行服务列表的更新。 |
六、ribbon属性配置
a)全局配置
- 每台服务器最多重试次数,但是首次调用不包括在内,
ribbon.MaxAutoRetries=1 - 最多重试多少台服务器
ribbon.MaxAutoRetriesNextServer=1 - 无论是请求超时或者socket read timeout都进行重试
ribbon.OkToRetryOnAllOperations=true - 服务列表刷新间隔时间
ribbon.ServerListRefreshInterval=2000 - 请求连接的超时时间
ribbon.ConnectTimeout=3000 - 请求处理的超时时间
ribbon.ReadTimeout=3000
b)指定客户端配置
${clientName}.ribbon.ConnectTimeout=500
关于重试机制Ribbon的超时与Sentinel的超时是两个概念。通常须要让Sentinel的超时时间大于Ribbon的超时时间,不然Sentinel命令超时后,直接熔断,重试机制就没有任何意义了
七、ribbon懒加载
- Ribbon默认是懒加载,只有在代码调用的时候才回去创建ribbon client,这样会导致首次调用较慢
- 解决:
ribbon:
eager-load:
enabled: true