在云计算场景中,网络是其中的一个重要部分。实际情况下的网络环境没有开发环境的网络那么稳定,所以在云计算中,网络是不可靠的已经成为了一条默认的潜规则。在系统研发的过程中,满足正常的业务需求的必要前提下,系统的鲁棒性,容错性也成为了一个重要的技术需求。
在网络不可靠的环境中,要保证业务流程,就需要在网络异常时对流程异常环节进行重试处理。
Spring框架为我们提供了重试机制,接下来我们来试验下Spring的重试。
假设项目是Maven管理的,需要在家pom中增加spring-retry包的依赖。
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
创建一个Bean配置类来管理bean,使用@EnableRetry来启用Spring重试,通过@Bean注解创建一个RetryTemplate加入Spring Container。配置最大重试次数为4。
@Configuration @EnableRetry public class BeanSeederServices { @Bean public RetryTemplate retryTemplate() { SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(4); FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(3000); RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(retryPolicy); template.setBackOffPolicy(backOffPolicy); return template; } }
创建一个Service,在里面使用我们构建的RetryTemplate,将需要重试的业务逻辑交给RetryTemplate。
@Service public class ConfigureNetworkService { @Autowired private RetryTemplate retryTemplate; int counter =0; private void configureNetworkSystem(){ retryTemplate.execute( context -> { verifyNwConfiguration(); return true; }); } private void verifyNwConfiguration(){ counter++; LOGGER.info("N/W configuration Service Failed "+ counter); throw new RuntimeException(); } }
创建一个Controller,用来提供执行入口,通过url来触发我们的重试功能。
@RestController @RequestMapping(value="/networksrv") public class NetworkClientService { @Autowired private ConfigureNetworkService configureNetworkService; @GetMapping public String callRetryService() throws SQLException { return configureNetworkService.configureNetworkSystem(); } }
在控制台我们会看到Spring输出的重试日志
2020-06-16 09:59:51.399 INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService : N/W configuration Service Failed 1 2020-06-16 09:59:52.401 INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService : N/W configuration Service Failed 2 2020-06-16 09:59:53.401 INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService : N/W configuration Service Failed 3 2020-06-16 09:59:53.402 INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService : N/W configuration Service Failed 4 Exception in thread "NetworkClientService" java.lang.RuntimeException
通过使用Spring RetryTemplate,我们只需要关心具体的业务逻辑,不在用开发重试处理逻辑了。