企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 一、重试机制 因为在微服务的实际生产环境中,有可能出现一种情况:某些服务的其中部分实例**临时不可用**。所以,我们希望能够提供一种重试的机制。比如:aservice-sms服务可以启动多个实例,当实例1由于某些原因(网络等)瞬时无法正常响应服务时,为了保证业务正常执行,所以自动的向该服务的其他实例发起请求。这就是微服务的调用的“重试机制”。 ![](https://img.kancloud.cn/93/68/9368dcc8c3080a7d31b94786a999cb60_503x346.png) 从Camden SR2版本开始,Spring Cloud整合了Spring Retry来增强RestTemplate的重试能力,对于开发者来说只需通过简单的配置,原来那些通过RestTemplate实现的服务访问就会自动根据配置来实现重试策略。 ~~~ <dependency> <artifactId>spring-retry</artifactId> <groupId>org.springframework.retry</groupId> </dependency> ~~~ 重试机制只有在引入了RetryTemplate才会生效,在LoadBalancerAutoConfiguration配置中分别对RetryTemplate和RetryInterceptor进行配置加载。 ![](https://img.kancloud.cn/2c/e8/2ce868c3522198da8ab520b31ce15c55_1107x660.png) 关于重试机制的若干配置属性,都定义在LoadBalancerRetryProperties属性配置类中。 ![](https://img.kancloud.cn/60/81/6081cc653817f9e88c88413499627c49_1357x734.png) > 需要注意的是:Ribbon有重试机制,Feign和OpenFeign也有重试机制(后面章节会介绍)。Feign和OpenFeign的底层就是Ribbon,所以当项目使用了Feign或OpenFeign的重试机制,就不要开启Ribbon的重试机制,反之亦然。否则重试配置重叠,实际重试次数是二者的笛卡尔积。 ~~~ #该参数用来开启重试机制,默认也是true。 spring.cloud.loadbalancer.retry.enabled: true ~~~ 与重试机制相关的参数配置。需要注意的是:请求超时时间设置过短、同时服务响应太慢,也会导致请求重试,在实际应用中要格外注意。 ~~~ .ribbon.ConnectTimeout:请求连接的超时时间。 .ribbon.ReadTimeout:请求处理的超时时间。 .ribbon.OkToRetryOnAllOperations:对所有操作请求都进行重试,默认只对GET请求重试。 .ribbon.MaxAutoRetriesNextServer:切换实例的重试次数,默认为1。 .ribbon.MaxAutoRetries:对当前实例的重试次数。默认为1。 ~~~ ## 二、 饥饿加载 很多初学者,在实现微服务的时候经常会遇到一个问题:**服务消费方调用服务提供方接口的时候,第一次请求经常会超时,而之后的调用就没有问题了。** 造成第一次服务调用出现失败的原因主要是Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间,这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,很容易就会出现上面所描述的现象。 我们可以在服务调用方aservice-rbac,通过如下的配置来解决问题: ~~~ ribbon: eager-load: enabled: true #开启饥饿加载 clients: aservice-sms #饥饿加载的服务 ~~~ 在启动的时候就会去加载Ribbon Client及被调用服务上下文,从而在实际发送请求的时候就可以直接使用,从而提高第一次服务请求的访问速度。启动时候打印日志如下: ![](https://img.kancloud.cn/32/0f/320f2e13e9902fdf864af0e42d2bc399_1404x160.png) 如果不配置饥饿加载,这段日志在第一次发起远程服务调用的时候才会出现。