我们使用SpringCloud的时候,特别是初级使用者,通常在调用远程服务失败时,会直接将次错误抛给浏览器。这样显然是不太合适的,或者他本就不影响其他的操作。这时候就可以使用Hystrix熔断机制。有异常情况时,让服务调用者,知道发生了异常,自己根据回调函数的反馈自行处理,是否会滚,是否告知上一级调用者(浏览器,或其他的服务)等等。 以下通过几个普通的小步骤,来描述一下,希望可以帮助需要同学
1,消费者类,远程服务的调用者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private MyFeignClient myFeignClient;
@RequestMapping("/getName")
public String getName() {
String name ="";
name=myFeignClient.getName();
return name;
}
}
2,在当前的服务器中传一个Feign客户端
@FeignClient(name="user-service-api",fallback=HystrixClinet.class)
public interface MyFeignClient {
@RequestMapping(value="/producer/getName",method=RequestMethod.GET)
public String getName();
}
注意,前提是需要在启动类中加入@EnableHystrix@EnableFeignClients ,"user-service-api"是我自己注册中的的远程服务的名字,自己的是什么就写什么,不区分大小写。
3,建立fallBack回调对应的类
@Component
public class HystrixClinet implements MyFeignClient {
@Override
public String getName() {
String name ="访问失败,进入回调";
System.out.println(name);
return name;
}
}
注意服务间的调用,将来回调是同Spring的容器管理的,所以注解@Component是必不可少的(也可是其他的注解,要标记为Spring的组件即可,个人感觉这个最合适),这样你就可以在这个回调函数里自己处理然后返回给服务的调用者(消费者),一般是返回你们自己公司和项目的错误码等,我这只是简单的打印一下,方便调试看。
4 ,建立生产者,即服务的提供者
@RestController
@RequestMapping("/producer")
public class Producer {
@RequestMapping(value="/getName",method=RequestMethod.GET)
public String getName() {
String name = "访问成功,请叫我66";
System.out.println(name);
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return name;
}
}
这样,你可以随意的测试超时啦,当然也可以测一下空指针等运行时异常了。一个简单的feign调用模型开起了。同时需要注意在配置文件中打开对Hystrix的支持
feign:
hystrix:
enabled: true