赞
踩
(该文章基于《微服务-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); } }
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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。