Hystrix ?
服务降级
服务熔断
熔断机制:
对应雪崩效应的一种链路保护机制,当扇出链路的某个服务不可用或者响应时间过长时,会进行服务的降级,进而熔断该结点微服务的调用,快速返回错误的响应信息。
spring cloud 使用hystrix实现,5s内20次调用失败启动熔断---
@HystrixCommand
Hystrix实现简单熔断
在服务提供者中增加熔断,之前已经写了服务提供的微服务。
1,引入hystrix支持
<!-- 服务熔断--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2,配置文件 instance id改一下
controller 修改
package com.wang.springcloud.controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.wang.springcloud.pojo.Dept;
import com.wang.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
//为了测试熔断机制,此方法启动熔断,异常之后转到queryByIdHystrix处理
@HystrixCommand(fallbackMethod = "queryByIdHystrix")
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") int id){
Dept dept =deptService.queryById(id);
if(dept==null){
throw new RuntimeException("没有找到部门,请检查");
}
return dept;
}
///熔断发生时执行
public Dept queryByIdHystrix(@PathVariable("id") int id){
return new Dept()
.setDeptno(id)
.setDname("不好意思,没有该部门")
.setDb_source("没有部门数据库信息");
}
@PostMapping("/dept/add")
public boolean addDept(Dept dept){
return deptService.addDept(dept);
}
@GetMapping("/dept/list")
public List<Dept> queryAll(){
return deptService.queryAll();
}
}
开启服务熔断
@HystrixCommand
package com.wang.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //自动注册服务到eureka服务器
@EnableDiscoveryClient ///服务发现
@EnableCircuitBreaker ///添加熔断支持
public class DeptProvider {
public static void main(String[] args) {
SpringApplication.run(DeptProvider.class,args);
}
}
注册服务测试
没有改部门时,熔断发生: