应用场景
分布式系统中,一个业务流程可能是调用多个微服务串联而完成一条业务。其中的一个微服务出现故障、或长时间未响应,可能会导致前几个微服务中的请求堆积越来越多。增加系统压力,资源的占用,最终可能会导致更多的级联故障,这个时候就需要一个熔断机制来:弃车保帅
什么是Hystrix
可以理解为一个断路器
,在某个服务单元发生故障后,通过断路器的故障监控,向调用方法返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证服务调用方不会被长时间不必要的占用,避免了分布式服务雪崩的问题
服务熔断
@HystrixCommand
熔断机制是对雪崩效应的一种微服务链路保护机制
对于某个微服务响应时间过长,会进行服务的降级,进而熔断该节点服务,快速返回错误响应的信息
熔断是provider服务提供者基础上的功能
熔断功能Code
- Pom添加依赖
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 修改配置
#Eureka 配置 : 服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: springcloud-hystrix:8001 #修改监控页面上的默认描述信息
- Controller配置备选方案
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@HystrixCommand(fallbackMethod = "hystrixGet")//备选方案方法名声明
@GetMapping("/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
Dept dept = deptService.queryDeptById(id);
if(dept == null){
throw new RuntimeException("id=>"+id+"不存在该用户");
}
return dept;
}
//备选方案
public Dept hystrixGet(@PathVariable("id") Long id){
return new Dept()
.setId(id)
.setName("id=>"+id+"不存在该用户")
.setDb_source("no this dataBase in mySQL");
}
}
- 主启动类 开启断路器功能
@SpringBootApplication
@EnableEurekaClient //在服务启动后,自动注册到Eureka中
@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker// 开启断路器功能
public class MobilefxrApplication {
public static void main(String[] args) {
SpringApplication.run(MobilefxrApplication.class, args);
}
}
Hystrix 降级
熔断是服务端对于接口访问失败的第二备用保险接口
而降级是客户端对于无法访问服务端接口而自己返回给自己的回调方法
服务监控DashBoard
需要引用对应依赖,能够对接口访问情况的信息,可视化监控
Zuul服务网关
依然是pom依赖导入,yml文件配置,启动类开启@Enable……来实现类似于反向代理的感觉,统一代理访问url,也可以进行prefix或者igron忽略访问条件等功能
SpringCloudConfig
一个放在Git远程仓库的微服务,里面提供了能够让其他微服务读取配置文件的功能,需要创立一个ConfigService和多个Config客户端项目,通过配置bootStrap.yml来实现读取云端配置的功能