SpringCloud给我们提供了几个服务调用组件。接下来分别对其使用进行介绍
一、RestTemplate
当我们用SpringCloud写好服务API后当我们需要消费调用服务时,RestTemplate组件就派上用场了。要使用该组件第一步需要注入该主键方法如下
@Bean
@LoadBalanced
RestTemplate restTemplate(){
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setReadTimeout(5000);
httpRequestFactory.setConnectTimeout(5000);
return new RestTemplate(httpRequestFactory);
}
注入后就可以通过注解获取Bean。注入后Spring容器中就有该类实例。接下来看下使用RestTemplate来调用服务。实例代码如下:
@Autowired
private RestTemplate restTemplate;
@ResponseBody
//@HystrixCommand(fallbackMethod = "defaultRest")
@RequestMapping("index1")
public String getIndex1() {
log.info("index1.hhhhhh");
String msg=restTemplate.getForObject("http://cloud-server/index", String.class);
System.out.println("msg:"+msg);
return msg;
}
二、FeignClient
使用FeignClient需要定义一个接口该接口定义了方法调用与服务调用映射。接口定义如下:
@Component
@FeignClient(value = "cloud-server")
public interface IndexInterface {
@RequestMapping(value = "/index")
String hi();
}
通过调用接口来调用服务
@Autowired
IndexInterface indexInterface;
@ResponseBody
@RequestMapping("index2")
public String getIndex2() {
String msg=indexInterface.hi();
System.out.println("msg:"+msg);
return msg;
}
断路由
当服务调用失败时可以指定一个特定的回调方法处理异常。要是用断路由启动类需要加入@EnableCircuitBreaker和@EnableHystrix注解。pom文件中引入spring-cloud-starter-hystrix依赖。
org.springframework.cloud
spring-cloud-starter-hystrix
使用方式
@Autowired
private RestTemplate restTemplate;
@ResponseBody
@HystrixCommand(fallbackMethod = "defaultRest")
@RequestMapping("index1")
public String getIndex1() {
log.info("index1.hhhhhh");
String msg=restTemplate.getForObject("http://cloud-server/index", String.class);
System.out.println("msg:"+msg);
return msg;
}
@Autowired
IndexInterface indexInterface;
@ResponseBody
@HystrixCommand(fallbackMethod = "defaultRest")
@RequestMapping("index2")
public String getIndex2() {
String msg=indexInterface.hi();
System.out.println("msg:"+msg);
return msg;
}
public String defaultRest(){
System.err.println("have a error");
return "have a error";
}
失败重试机制
SpringCloud还提供了一个实用的功能就是失败重试,要使用该功能首先加入依赖的jar包
org.springframework.retry
spring-retry
然后在启动类上加入@EnableRetry。使用说明
@Retryable注解
被注解的方法发生异常时会重试
value:指定发生的异常进行重试
include:和value一样,默认空,当exclude也为空时,所有异常都重试
exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试
maxAttemps:重试次数,默认3
backoff:重试补偿机制,默认没有
@Backoff注解
delay:指定延迟后重试
multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒
@Recover
当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调
使用方式
@Autowired
private RestTemplate restTemplate;
@ResponseBody
//@HystrixCommand(fallbackMethod = "defaultRest")
@Retryable
@RequestMapping("index1")
public String getIndex1() {
log.info("index1.hhhhhh");
String msg=restTemplate.getForObject("http://cloud-server/index", String.class);
System.out.println("msg:"+msg);
return msg;
}
@Autowired
IndexInterface indexInterface;
@Retryable(value=RemoteAccessException.class,maxAttempts = 3)
@ResponseBody
//@HystrixCommand(fallbackMethod = "defaultRest")
@RequestMapping("index2")
public String getIndex2() {
String msg=indexInterface.hi();
System.out.println("msg:"+msg);
return msg;
}
public String defaultRest(){
System.err.println("have a error");
return "have a error";
}
@Recover
public String recover(RemoteAccessException e) {
System.err.println(e.getMessage());
return "call Error";
}
重试机制不可乱用。如果时数据增删改要靠虑是否影响业务数据。一定要用做好操作幂等性。