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