紧接上一个项目。
没看过的可以点传送门。
Feign在整合到Spring Cloud时已经自带了hystrix模块,所以不需要额外引入feign依赖。
WX20190926-113751@2x.png
如果没有用feign,那么熔断器依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
@FeignClient
注解的参数:
-
name
:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现 -
url
: url一般用于调试,可以手动指定@FeignClient调用的地址 -
decode404
:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException -
configuration
: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract -
fallback
: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口 -
fallbackFactory
: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码 -
path
: 定义当前FeignClient的统一前缀,类似于注解到类上的@RequestMapping的功能
修改scdemo-api
项目,在ITestCloudService
中新增一个用于测试熔断机制的接口:
@GetMapping("/t_hystrix")
Map<String, Object> testHystrix();
然后将@FeignClient注解添加参数fallback = TestCloudServiceFallback.class
,创建TestCloudServiceFallback
实现接口ITestCloudService
:
@Component
public class TestCloudServiceFallback implements ITestCloudService {
@Override
public Map<String, Object> testFnFeign() {
return defaultFallback();
}
@Override
public Map<String, Object> testHystrix() {
return defaultFallback();
}
private Map<String, Object> defaultFallback() {
System.out.println("服务已熔断,可发送邮件通知开发人员及时排查BUG。");
Map<String, Object> map = new HashMap<>();
map.put("msg", "服务暂时不可用,请稍后重试!");
return map;
}
}
修改scdemo-privider
项目,添加新接口的实现方法:
@Override
public Map<String, Object> testHystrix() {
LocalTime now = LocalTime.now();
int minute = now.getMinute();
try {
Thread.sleep(minute % 2 == 0 ? 0 : 10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String, Object> map = new HashMap<>();
map.put("msg", "熔断器测试接口,分钟数为单数则等待10秒。");
return map;
}
这个接口中,我们取当前时间,如果是单数分钟,则等待10秒,模拟线程阻塞,如果是双数分钟,则不等待,模拟正常情况,以及故障恢复。
再修改scdemo-consumer
,在TestConsumerController中添加消费者测试接口:
@GetMapping("/hy")
public Map testHystrix() {
Map<String, Object> map = testCloudService.testHystrix();
return map;
}
然后scdemo-consumer
的application.yml
添加配置,开启feign熔断器(因为feign熔断器默认是关闭状态)
feign:
hystrix:
# feign熔断器开关
enabled: true
最后修改scdemo-consumer
的启动类注解,@SpringBootApplication(scanBasePackages = "com.yq.scdemo")
,目的是为了扫描到熔断器的fallback实现类。
启动scdemo-server
,scdemo-provider
,scdemo-consumer
。
不停地调用http://localhost:8763/hy
双数分钟时返回:
{"msg":"熔断器测试接口,分钟数为单数则等待10秒。"}
等待分钟数为单数时再访问,因为会进入模拟阻塞,所以返回:
{"msg":"服务暂时不可用,请稍后重试!"}
再等等,到双数分钟时,服务重新可用,可见Hystrix是高可用的,带自动恢复机制的。
最后附上github地址:
https://github.com/lemtasev/spring-cloud-demo
网友评论