服务之间是可以相互调用的,如果底层的服务出现了问题,那么他的上层服务也就会出问题
为了解决分布式系统的雪崩问题,SpringCloud提供了Hystrix熔断器组件
服务降级
服务降级并不会直接返回错误,而是提供一个补救措施,正常响应给请求者。这样相当于服务依然可用,但是降低了服务能力
导入Hystrix的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
在启动类添加注解开启
@SpringBootApplication
@EnableHystrix //启用Hystrix
public class BorrowApplication {
public static void main(String[] args) {
SpringApplication.run(BorrowApplication.class, args);
}
}
当下层的服务出现问题,就会调用备选的方案
@RestController
public class BorrowController {
@Resource
BorrowService service;
@HystrixCommand(fallbackMethod = "onError") //使用@HystrixCommand来指定备选方案
@RequestMapping("/borrow/{uid}")
UserBorrowDetail findUserBorrows(@PathVariable("uid") int uid){
return service.getUserBorrowDetailByUid(uid);
}
//备选方案,这里直接返回空列表了
//注意参数和返回值要和上面的一致
UserBorrowDetail onError(int uid){
return new UserBorrowDetail(null, Collections.emptyList());
}
}
服务降级是一种比较温柔的解决方案,虽然服务本身不可用,但是能够保证正常响应数据。
服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制,当检测出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”备选方案”的响应信息。当检测到该节点微服务响应正常后恢复调用链路。
熔断就是在降级的基础上进一步升级形成的,也就是说,在一段时间内多次调用失败,那么就直接升级为熔断
它能够对一段时间内出现的错误进行侦测,当侦测到出错次数过多时,熔断器会打开,所有的请求会直接响应备选方案,一段时间后,执行一定数量的请求,如果还是出现错误,那么则继续保持打开状态,否则说明服务恢复正常运行,关闭熔断器。
监控页面部署
创建一个新的项目,并导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
修改配置文件
server:
port: 8900
hystrix:
dashboard:
# 将localhost添加到白名单,默认是不允许的
proxy-stream-allow-list: "localhost"
添加@EnableHystrixDashboard
注解开启管理页面
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashBoardApplication.class, args);
}
}
启动Hystrix管理页面服务,然后需要在要进行被监控的服务中添加Actuator依赖
Actuator是SpringBoot程序的监控系统,可以实现健康检查,记录信息等
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在配置文件中配置Actuator添加暴露
management:
endpoints:
web:
exposure:
include: '*'
打开刚刚启动的管理页面,地址为:http://localhost:8900/hystrix/
在中间填写要监控的服务的地址:比如:http://localhost:8282/actuator/hystrix.stream,注意后面要添加/actuator/hystrix.stream
,然后点击Monitor Stream即可进入监控页面
可以看到现在都是Loading状态,这是因为还没有开始统计,尝试调用几次被监控的服务,就开始出现信息了,
当Circuit
更改为Open状态是,表示熔断开启