服务熔断是服务端的行为,服务降级是客户端的行为
熔断是被动的,比如客户查找了数据库没有的数据,显示提示信息
降级是主动的,比如关闭服务端在客户端给出提示信息
服务熔断:
这里建立了一个hystrix-8001模块来模拟熔断的服务端
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.6.RELEASE</version> </dependency>
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.queryById(id); if(dept==null){ throw new RuntimeException("这个id不存在"); } return dept; } //备选方案 public Dept hystrixGet(@PathVariable("id") Long id) { return new Dept().setDeptno(id).setDname("这个id不存在").setDb_source("没有这个数据库"); } }
主启动类
@SpringBootApplication @EnableEurekaClient//在服务启动后自动注册到eureka中 @EnableDiscoveryClient//服务发现 @EnableCircuitBreaker//添加服务熔断支持 public class DeptProviderHystrix_8001 { public static void main(String[] args) { SpringApplication.run(DeptProviderHystrix_8001.class,args); } }
修改该服务端的描述信息
#注册eureka,服务注册到哪里 eureka: client: service-url: #集群发布 defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/ instance: instance-id: provider-dept-hystrix-8001 #修改描述信息
使用如下端口测试
测试的结果
服务降级
需要的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency>
配置类 开启服务降级
#80配置之后localhost可以直接访问
server:
port: 80
#开启服务降级
feign:
hystrix:
enabled: true
#eureka配置
eureka:
client:
register-with-eureka: false #不向eureka注册自己
service-url: #需求是他随机进这三个注册中心注册
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
主启动类
//Ribbon和Eureka整合以后,客户端可以直接调用,不用关心IP地址和端口号 @SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = {"com.wu.springcloud"}) public class DeptConsumer_feign { public static void main(String[] args) { SpringApplication.run(DeptConsumer_feign.class,args); } }
DeptClientService
@Component @FeignClient(value="SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class) public interface DeptClientService { @GetMapping("/dept/get/{id}") public Dept queryById(@PathVariable("id") Long id); @GetMapping("/dept/list") public List<Dept> queryAll(); @PostMapping("/dept/add") public Boolean addDept(Dept dept); }
DeptClientServiceFallbackFactory.java
//服务降级 @Component public class DeptClientServiceFallbackFactory implements FallbackFactory { @Override public DeptClientService create(Throwable throwable) { return new DeptClientService() { @Override public Dept queryById(Long id) { return new Dept().setDeptno(id).setDname("没有对应的信息,客户端提供了降级信息,此服务已经被关闭") .setDb_source("没有数据"); } @Override public List<Dept> queryAll() { return null; } @Override public Boolean addDept(Dept dept) { return null; } }; } }
关闭服务端
呈现的效果