Spring Cloud Ribbon配置详解

作者:zx 时间:2023-11-25 01:32:50 

本节我们主要介绍 Ribbon 的一些常用配置和配置 Ribbon 的两种方式。

常用配置

1. 禁用 Eureka

当我们在 RestTemplate 上添加 @LoadBalanced 注解后,就可以用服务名称来调用接口了,当有多个服务的时候,还能做负载均衡。

这是因为 Eureka 中的服务信息已经被拉取到了客户端本地,如果我们不想和 Eureka 集成,可以通过下面的配置方法将其禁用。


# 禁用 Eureka
ribbon.eureka.enabled=false

当我们禁用了 Eureka 之后,就不能使用服务名称去调用接口了,必须指定服务地址。

2. 配置接口地址列表

上面我们讲了可以禁用 Eureka,禁用之后就需要手动配置调用的服务地址了,配置如下:


# 禁用 Eureka 后手动配置服务地址
ribbon-config-demo.ribbon.listOfServers=localhost:8081,localhost:8083

这个配置是针对具体服务的,前缀就是服务名称,配置完之后就可以和之前一样使用服务名称来调用接口了。

3. 配置负载均衡策略

Ribbon 默认的策略是轮询,从我们前面讲解的例子输出的结果就可以看出来,Ribbon 中提供了很多的策略,这个在后面会进行讲解。我们通过配置可以指定服务使用哪种策略来进行负载操作。

4. 超时时间

Ribbon 中有两种和时间相关的设置,分别是请求连接的超时时间和请求处理的超时时间,设置规则如下:


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

也可以为每个Ribbon客户端设置不同的超时时间, 通过服务名称进行指定:
ribbon-config-demo.ribbon.ConnectTimeout=2000
ribbon-config-demo.ribbon.ReadTimeout=5000

5. 并发参数


# 最大连接数
ribbon.MaxTotalConnections=500
# 每个host最大连接数
ribbon.MaxConnectionsPerHost=500

代码配置 Ribbon

配置 Ribbon 最简单的方式就是通过配置文件实现。当然我们也可以通过代码的方式来配置。

通过代码方式来配置之前自定义的负载策略,首先需要创建一个配置类,初始化自定义的策略,代码如下所示。


@Configuration
public class BeanConfiguration {
 @Bean
 public MyRule rule() {
   return new MyRule();
 }
}

创建一个 Ribbon 客户端的配置类,关联 BeanConfiguration,用 name 来指定调用的服务名称,代码如下所示。


@RibbonClient(name = "ribbon-config-demo", configuration = BeanConfiguration.class)
public class RibbonClientConfig {
}

可以去掉之前配置文件中的策略配置,然后重启服务,访问接口即可看到和之前一样的效果。

配置文件方式配置 Ribbon

除了使用代码进行 Ribbon 的配置,我们还可以通过配置文件的方式来为 Ribbon 指定对应的配置:


<clientName>.ribbon.NFLoadBalancerClassName: Should implement ILoadBalancer(负载均衡器操作接口)
<clientName>.ribbon.NFLoadBalancerRuleClassName: Should implement IRule(负载均衡算法)
<clientName>.ribbon.NFLoadBalancerPingClassName: Should implement IPing(服务可用性检查)
<clientName>.ribbon.NIWSServerListClassName: Should implement ServerList(服务列表获取)
<clientName>.ribbon.NIWSServerListFilterClassName: Should implement ServerList&shy;Filter(服务列表的过滤)

重试机制

在集群环境中,用多个节点来提供服务,难免会有某个节点出现故障。用 Nginx 做负载均衡的时候,如果你的应用是无状态的、可以滚动发布的,也就是需要一台台去重启应用,这样对用户的影响其实是比较小的,因为 Nginx 在转发请求失败后会重新将该请求转发到别的实例上去。

由于 Eureka 是基于 AP 原则构建的,牺牲了数据的一致性,每个 Eureka 服务都会保存注册的服务信息,当注册的客户端与 Eureka 的心跳无法保持时,有可能是网络原因,也有可能是服务挂掉了。

在这种情况下,Eureka 中还会在一段时间内保存注册信息。这个时候客户端就有可能拿到已经挂掉了的服务信息,故 Ribbon 就有可能拿到已经失效了的服务信息,这样就会导致发生失败的请求。

这种问题我们可以利用重试机制来避免。重试机制就是当 Ribbon 发现请求的服务不可到达时,重新请求另外的服务。

1. RetryRule 重试

解决上述问题,最简单的方法就是利用 Ribbon 自带的重试策略进行重试,此时只需要指定某个服务的负载策略为重试策略即可:


ribbon-config-demo.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule

2. Spring Retry 重试

除了使用 Ribbon 自带的重试策略,我们还可以通过集成 Spring Retry 来进行重试操作。

在 pom.xml 中添加 Spring Retry 的依赖,代码如下所示。


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

配置重试次数等信息:


# 对当前实例的重试次数
ribbon.maxAutoRetries=1
# 切换实例的重试次数
ribbon.maxAutoRetriesNextServer=3
# 对所有操作请求都进行重试
ribbon.okToRetryOnAllOperations=true
# 对Http响应码进行重试
ribbon.retryableStatusCodes=500,404,502

来源:http://c.biancheng.net/view/5356.html

标签:Spring,Cloud,Ribbon
0
投稿

猜你喜欢

  • 使用C++的string实现高精度加法运算的实例代码

    2023-06-10 19:43:47
  • Android的UI调优教程

    2021-12-16 01:46:43
  • C#通过xpath查找xml指定元素的方法

    2023-06-22 11:55:29
  • c#通过ip获取地理信息

    2022-09-16 00:43:03
  • C#实现查杀本地与远程进程的方法

    2023-08-10 08:01:30
  • Java中输入与输出的方法总结

    2021-06-07 22:02:15
  • 详解Java中的Lambda表达式

    2023-06-05 01:37:16
  • Android的异步任务AsyncTask详解

    2021-10-13 02:58:28
  • Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法

    2023-04-10 04:38:44
  • Servlet注解之@WebInitParam多个InitParam的使用

    2023-08-04 13:43:01
  • C#基础知识系列八const和readonly关键字详细介绍

    2023-06-25 16:39:37
  • java获取文件的inode标识符的方法

    2021-06-19 15:10:49
  • Netty分布式高性能工具类recycler的使用及创建

    2022-03-04 17:57:32
  • Java中ClassLoader类加载学习总结

    2022-08-26 18:13:42
  • java中 Set与Map排序输出到Writer详解及实例

    2022-05-01 07:23:56
  • Spring-data-redis操作redis cluster的示例代码

    2022-12-17 17:04:00
  • Unity Shader实现描边OutLine效果

    2022-01-13 03:11:13
  • c#中判断字符串是不是数字或字母的方法

    2023-02-10 06:08:49
  • C#7.0中新特性汇总

    2023-06-24 18:29:13
  • C# WORD操作实现代码

    2023-11-20 05:16:25
  • asp之家 软件编程 m.aspxhome.com