hystrix-服务熔断,服务降级

hystrix-服务熔断,服务降级

(该文章基于《微服务-Eureka服务注册与发现、Ribbon负载均衡、Feign》章节书写:https://blog.csdn.net/weixin_41854206/article/details/120920446)
hystrix-服务熔断,服务降级,有点类似,
服务降级主要在客户端使用,易可以在服务端使用。
服务熔断主要在服务端使用。

服务降级中可以说是用了服务熔断

服务降级

场景:后台有3台服务器,某一个时刻有大量的的请求访问服务器1,服务器2,服务器3空闲,这时刻可以关闭服务器2,3,释放更多的资源给服务器1,此时客户端就可以用到服务降级的技术。

一、普通模式

1、添加pxm依赖

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

2、为需要添加服务降级的接口添加降级,在方法接口上添加@Hystrixcommand注解,并配置降级处理方法,返回友好提示

 // 使用自己的服务熔断方法
    @GetMapping("/get/{id}")
    @HystrixCommand(fallbackMethod = "getPaymentHystrix")
    public CommonResult<Payment> getPayment(@PathVariable Integer id) {
        Payment payment = paymentService.getPayment(id);
        if (payment == null) {
            throw new RuntimeException();
        }
        return new CommonResult<>(200, "success+8001", payment);
    }
    public CommonResult<Payment> getPaymentHystrix(@PathVariable Integer id) {
        Payment payment = new Payment();
        payment.setId(-111);
        payment.setSerial("hystrix---excetion");
        return new CommonResult<>(200,"hystrix", payment);
    }

3、开启断路器

@SpringBootApplication
@EnableCircuitBreaker // 添加熔断支持
public class PaymentHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain80.class,args);
    }
}

步骤2方式是为单独一个接口配置降级后的要调用的方法,如果需要配置默认全局接口配置降级,可以在类上面配置,然后在接口中添加@HystrixCommand注解,不指定方法即可
说明:降级的调用方法需要与原来的接口的返回类型一致。

@RestController
@DefaultProperties(defaultFallback = "defaultHystrix")
public class PayController {
    // 使用通过服务熔断,类上面配置默认调用方法
    @GetMapping("/get/hystrix/{id}")
    @HystrixCommand
    public CommonResult<Payment> hystrim(@PathVariable Integer id) {
        Payment payment = paymentService.getPayment(id);
        if (payment == null) {
            throw new RuntimeException();
        }
        return new CommonResult<>(200, "success+8001", payment);
    }
    /*
        注意:使用通用全局熔断,添加熔断的方法的返回类型 与 熔断的方法的返回类型需要是 相同的
     */
    public CommonResult<Payment> defaultHystrix(){
        System.out.println("default hystrix faultback");
        Payment payment = new Payment();
        payment.setId(-111);
        payment.setSerial("hystrix---faultback---faultback--- faultback");
        return new CommonResult<>(200,"hystrix faultback", payment);
    }
}

二、基于Feign模式

1、在配置文件yml中开启支持配置

# 开启服务降级
feign:
  hystrix:
    enabled: true

2、为feign接口添加一个处理降级的类,可以实现feign接口,这样继承类中就可以实现全部接口。

/**
 * 服务降级方法,继承fei接口为了对于每个接口都有服务降级处理
 * 当fei接口调用服务器接口时,出现了异常或者超时,就可以通过服务降级,
 * 调用此处的方法,返回一个友好的提示
 */
@Component
public class HystrimFactory implements FeignService{
    @Override
    public CommonResult<Payment> getPayment(int id) {
        Payment payment = new Payment();
        payment.setId(-1);
        payment.setSerial("服务器繁忙~");
        return new CommonResult<>(300,"hystrix",payment);
    }

    @Override
    public CommonResult<List> list() {
        Payment payment = new Payment();
        payment.setId(-1);
        payment.setSerial("服务器繁忙~");
        List list = new ArrayList();
        list.add(payment);
        return new CommonResult<>(300,"hystrix",list);
    }
}

3、feign接口添加配置,在原来的@FeignClient注解里添加fallback配置

@Component
@FeignClient(value = "CLOUD-PROVIDER-SERVICE", fallback = HystrimFactory.class) // 配置服务降级类
public interface FeignService {

    @GetMapping("/get/{id}")
    CommonResult<Payment> getPayment(@PathVariable("id") int id);

    @GetMapping("/list")
    CommonResult<List> list();
}

启动项目运行即可。

服务熔断

场景:一个接口在发送错误时,进行熔断,当检测到该接口正常后进行恢复。
服务熔断配置在服务端。
1、添加依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

2、接口添加熔断操作

 @GetMapping("/get/hystrix2/{id}")
    @HystrixCommand(fallbackMethod = "hystrixfaultback", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),
            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60"),
    })
    public CommonResult<Payment> hystrim2(@PathVariable Integer id) {
        Payment payment = paymentService.getPayment(id);
        if (payment == null) {
            throw new RuntimeException();
        }
        return new CommonResult<>(200, "id:"+id, payment);
    }
    public CommonResult<Payment> hystrixfaultback(@PathVariable("id") Integer id){
        System.out.println("default hystrix faultback");
        Payment payment = new Payment();
        payment.setId(id);
        payment.setSerial("hystrix---faultback---faultback--- faultback");
        return new CommonResult<>(200,"hystrix faultback:id:"+id, payment);
    }

3、开启熔断支持

@SpringBootApplication
@EnableEurekaClient // 在服务启动后注册到eureka
@EnableDiscoveryClient  // 服务发现
@EnableCircuitBreaker // 添加熔断支持
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class,args);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值