SpringCloud服务调用组件

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";
	}

重试机制不可乱用。如果时数据增删改要靠虑是否影响业务数据。一定要用做好操作幂等性。

你可能感兴趣的:(SpringCloud服务调用组件)