8.Hystrix,服务熔断和feign,服务降级

服务熔断是服务端的行为,服务降级是客户端的行为

熔断是被动的,比如客户查找了数据库没有的数据,显示提示信息

降级是主动的,比如关闭服务端在客户端给出提示信息

8.Hystrix,服务熔断和feign,服务降级

 8.Hystrix,服务熔断和feign,服务降级

服务熔断:

这里建立了一个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 #修改描述信息

使用如下端口测试

8.Hystrix,服务熔断和feign,服务降级

 

 测试的结果

8.Hystrix,服务熔断和feign,服务降级

 

 8.Hystrix,服务熔断和feign,服务降级

 服务降级

需要的依赖

 <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;
            }
        };
    }
}

关闭服务端

8.Hystrix,服务熔断和feign,服务降级

 

 呈现的效果

8.Hystrix,服务熔断和feign,服务降级

 

上一篇:面试官:熔断降级原理是什么?


下一篇:使用Hystrix的插件机制,程序员翻身之路