Hystrix服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。
参考microservicecloud-provider-dept-8001,新建microservicecloud-provider-dept-hystrix-8001:
新增依赖:
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
修改application.yml
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis 配置文件所在路径
type-aliases-package: pers.zhang.entities # 别名扫描包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/cloudDB01 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 连接池最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #将客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001-hystrix # 指定服务名称信息
prefer-ip-address: true # 访问路径可以显示ip地址
info:
app.name: microservicecloud
company.name: pers.zhang
build.artifactId: $project.artifactId$
build.version: $project.version$
修改DeptController,@HystrixCommand报异常后如何处理:
@RestController
public class DeptController {
@Autowired
DeptService deptService;
@Autowired
DiscoveryClient discoveryClient;
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept){
return deptService.add(dept);
}
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept get(@PathVariable("id") Long id){
Dept dept = deptService.get(id);
if(null == dept){
throw new RuntimeException("该ID:" + id + "没有对应的信息");
}
return dept;
}
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list(){
return deptService.list();
}
public Dept processHystrix_Get(@PathVariable("id") Long id){
return new Dept().setDeptno(id).setDname("该ID:" + id + "没有对应的信息,null-@HystrixCommand")
.setDb_source("no this database in MySQL");
}
}
修改主启动类DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker:
@EnableDiscoveryClient //服务发现
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@SpringBootApplication
@EnableCircuitBreaker //开启熔断机制的支持
public class DeptProvider8001Hystrix_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001Hystrix_App.class, args);
}
}
测试:
- 3个eureka先启动
- 主启动类DeptProvider8001_Hystrix_App
- Consumer启动microservicecloud-consumer-dept-80
访问:http://localhost/consumer/dept/get/112
数据库中没有id未112的Dept,服务熔断,返回我们自定义的信息。
扫描二维码关注公众号,回复:
9337472 查看本文章