是什么
做什么?
使用方法
服务降级(客户端):
服务熔断和服务降级:
Fegin使用Hystrirx
Fegin是以接口形式工作的,它没有方法体,那么@HystrixCommand 针对于上述的方法是不适用于Fegin 的。官网文章如下:
If Hystrix is on the classpath and feign.hystrix.enabled=true, Feign will wrap all methods with a circuit breaker
就是SpringCloud 默认已经为Fegin 整合了Hystrix, 只要Hystrix 在项目的classpaht 中,Feigin 默认就会用断路器包裹所有的方法。官网实现如下:
FeignClient(name = "hello", fallback = HystrixClientFallback.class) //fallback 指定回退的类 protected interface HystrixClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello iFailSometimes(); }
//回退类实现如下,这样针对于每一个feign 的接口方法都有对应的回退
@Component class HystrixClientFallback implements HystrixClient { @Override public Hello iFailSometimes() { return new Hello("fallback"); } }.
Fegin 中使用Hystrix 回退时查看回退的原因 使用FallbackFactory
步骤如下:
@FeignClient(name = "microservice-provider-user" ,fallbackFactory=UserFeignClientFallbackFactory.class)
public interface UserFeignClient {
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
//查看回退原因
@Component
class UserFeignClientFallbackFactory implements FallbackFactory
private static final Logger LOGGER = LoggerFactory.getLogger(UserFeignClientFallbackFactory.class);
@Override
public UserFeignClient create(Throwable cause) {
return new UserFeignClient() {
@Override
public User findById(Long id) {
//日志最好放在各个fallback 中,不要放在create 中,否则在引用启动时,就会打印该日志
LOGGER.info("fallback; reason was:" + cause);
User user = new User();
// fallbackFactory 属性还可以让不同的异常返回不同的情况,比如
if (cause instanceof IllegalArgumentException) {
user.setId(-1L);
}else{
user.setId(-2L);
}
user.setUsername("fallbackFactory 用户");
return user;
}
};
}
}
为Feign 禁用Hystrix
在SpringCloud 只要Hystrix 在项目的classpath 下,Feign 就会使用断路器包裹Feigin 客户端的方法,有时候项目中并不需要使用此功能,此时可以为Feign 禁用Hystrix
禁用方法如下:
/**
* @author caiqiufang:
* @create date:2018年9月16日 下午1:46:18
* 为Feign 禁用Hystrix 断路功能
* 要想为某个FeignClient 取消Hystrix 断路功能可以使用如下方法
* @FeignClient(name = "microservice-provider-user" ,configuration=FeignDisableHystrixConfiguration.class)
* 在@FeignClient 注释中添加 configuration 并指向 FeignDisableHystrixConfiguration 即可
*/
@Configuration
public class FeignDisableHystrixConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder(){
return Feign.builder();
}
}
全局禁用Hystrix
在application.properties 中添加 feign.hystrix.enable = false 即可
Hystrix Dashboard
为Hystrix 相关项目添加如下依赖
可以将dashboard 注册到eureka 服务中,这样方便管理
如何使用:
1.监控谁就加上对应地址/hystrix.stream
2.延迟的时间
3. 标题的名字
结果如下:
上述两图颜色对应
图解如下:
但是dashboard 上述这样的监管是只能监管一个服务,不能看到多个服务,下面使用Turbine 来聚合监控数据
Turbine聚合监控数据
它可将所有相关/hystrix.sream 端点的数据聚合到一个组合的/turbine.stream 中,从而让集群的监控变的更加的方便,依赖如下:
配置:
server:
port: 8031
spring:
application:
name: microservice-hystrix-turbine
eureka:
client:
service-url:
defaultZone : http://localhsot:8761/eureka/
instance:
prefer-ip-address: true
turbine:
app-config: microservice-consumer-movie-feign-hystrix-fallback-stream,microservice-consumer-movie # 要监控的服务名称
cluster-name-expression: "'default'"
启动类:
@SpringBootApplication
@EnableTurbine
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
标注: 感谢 周立 微服务实战相关书籍