暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Cloud学习笔记——Ribbon配置

CodeWu 2019-09-11
436


饥饿加载

    进行微服务调用的过程中,网络情况不是很理想的情况下,初始化后初次调用时会超时。Ribbon客户端在第一次请求时进行初始化的,如果超时时间设置较短,初始化加上服务提供接口调用,会导致第一次请求超时。

    在Spring Cloud中,通过配置eager-load方式,提前初始化客户端解决第一次请求超时问题。

#饥饿加载服务提供应用名称
ribbon.eager-load.clients=service-name
#是否开启饥饿加载
ribbon.eager-load.enabled=true|false

    ribbon.eager-load.enabled用于配置是否开启饥饿加载模式

  ribbon.eager-load.clients用于配置需要饥饿加载服务名(服务提供者配置application-name),多个服务名用","分隔。

常用配置

    禁用Eureka

       在使用Ribbon对服务进行消费应用中,添加了@LoadBalanced注解,就可以通过服务名称来对服务提供者提供的服务进行调用和消费,服务被注册到服务注册中心集群中时,还可以通过负载均衡方式避免集群中的某个服务注册中心节点集中处理服务消费请求。当我们不想与Eureka进行集成,可通过如下配置信息对Eureka进行禁用。

ribbon.eureka.enabled=false

      对Eureka进行了禁用后,只能通过服务提供地址(提供服务ip+提供服务port)对服务进行调用。

    配置接口地址列表

#配置接口地址列表
{service-name}.ribbon.listOfServers=ip:port

        service-name为服务提供者应用名称。

     配置超时时间

#服务请求连接超时时间
ribbon.ConnectTimeout=2000
#服务请求处理超时时间
ribbon.ReadTimeout=5000

    配置并发参数

#服务请求连接超时时间
{service-name}.ribbon.ConnectTimeout=2000
#服务请求处理超时时间
{service-name}.ribbon.ReadTimeout=5000

        service-name为服务提供者应用名称。

配置Ribbon

    代码配置

/**
 * 负载均衡策略配置
*/
@Configuration
public class IRuleConfiguration
{
@Bean
public IRule getRuleInstance()
{
return new RandomRule();
}


}
/**
 * 代码配置Ribbon负载均衡策略
*/
@RibbonClient(name = "service-demo",configuration = IRuleConfiguration.class)
public class RibbonClientConfig {


}

        在负载均衡策略配置类(IRuleConfiguration)中配置的负载均衡策略为随机策略,使用@RibbionClient注解配置负载均衡客户端,name为服务提供应用名称,configuration为负载均衡配置类。

    配置文件方式配置

#配置负载均衡策略(随机负载均衡策略)
{service-name}.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

        {service-name}为服务提供者应用名称,此处配置负载均衡策略为随机策略

重试机制

    在分布式集群环境中,用多个节点来提供服务功能,难免会有某个节点出现故障。由于Eureka基于AP原则构建,牺牲了数据的一致性,集群中的每个服务注册中心节点会保存注册的服务实例信息。当注册服务实例的服务提供者与服务注册中心的心跳无法保持时(网络原因或服务提供应用宕机),服务注册中心还会在一段时间内保存服务注册信息。此时服务消费者可能拿到了失效的服务实例信息,Ribbon会对失效服务实例信息进行请求,造成服务请求失败。

    可以利用重试机制解决此类问题,重试机制即当Ribbon发现请求的服务实例不可到达时,重新请求服务注册中心集群中其它节点的服务实例。

    RetryRule重试

#开启重试机制
spring.cloud.loadbalancer.retry.enabled=true|false(默认为false)
#熔断器超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=
#为服务提供者配置负载均衡策略为随机访问
{service-name}.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#配置连接超时时间
{service-name}.ribbon.ConnectTimeout=
#请求处理超时时间
{service-name}.ribbon.ReadTimeout=
#配置所有操作进行请求重试
{service-name}.ribbon.okToRetryOnAllOperations=true|false
#配置当前实例重试次数
{service-name}.ribbon.maxAutoRetries=5
#切换服务注册中心重试次数(切换几次服务注册中心)
{service-name}.ribbon.maxAutoRetriesNextServer=5

     service-name为服务提供者应用名称

    熔断器超时时间须大于Ribbon超时时间,否则不会触发重试机制。

    根据上述配置,当服务调用失败(服务实例宕机、网络故障、服务实例停止后服务注册中心未及时获取和更新服务实例状态,服务注册中心宕机或网络故障),服务调用者会再次对当前选中的服务注册中心的服务实例进行调用,达到当前实例重试次数后({service-name}.ribbon.maxAutoRetries)依然调用失败,切换服务注册中心集群中的服务注册中心节点(切换次数取决于{service-name}.ribbon.maxAutoRetriesNextServer配置值);切换服务注册中心后依然服务调用失败(达到当前实例重试次数未次达到切换服注册中心重试数),继切换服务注册中心;达到切换服务注册中心次数且达到当前实例重试次数后依然调用失败,返回调用失败(服务降级)

重试机制当前实例重试次数切换服务注册中心次数
当前实例重试<=
<=
切换服务注册中心重试>
<=
调用失败(服务降级)
>
>

信息。


  SpringRetry重试

     SpringRetry提供了重试和熔断功能,目前用于SpringBatch、SpringIntegration等项目。

     引入依赖

<!--spring retry重试-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

    属性文件配置

#Spring Retry
#当前服务实例重试次数
ribbon.maxAutoRetries=
#切换实例(服务注册中心)重试次数
ribbon.maxAutoRetriesNextServer=
#对所有操作请求进行重试
ribbon.okToRetryOnAllOperations=true|false
#http响应码进行重试
ribbon.retryableStatusCodes=


文章转载自CodeWu,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论