赞
踩
服务熔断:
熔断是在服务端进行配置。
一般是某个服务故障,或者异常引起的,类似现实世界中的保险丝,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。
服务降级:
降级是在客户端配置。
所谓降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强。降级逻辑可以是返回默认值、调用备用服务等。
服务熔断类型有下面3中状态:
断路器开启或关闭的条件如下:
开启的条件:当满足下面两个条件之一断路器就会开启。
关闭条件:断路器开启之后(默认5秒),这个时候断路器是半开状态,会让其他一个请求进行转发,如果成功,断路器会关闭;若失败,继续开启。
3. 服务熔断与服务降级的工作时机
以下是基于Spring Cloud Netflix Hystrix的服务熔断与服务降级示例,展示如何实现和配置它们。
步骤1:添加依赖项
pom.xml
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
步骤2:启用Hystrix
HystrixApplication.java
- package com.example.configserver;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
-
- @SpringBootApplication
- @EnableCircuitBreaker
- public class HystrixApplication {
- public static void main(String[] args) {
- SpringApplication.run(HystrixApplication.class, args);
- }
- }
步骤3:创建服务并配置降级与熔断逻辑
MyService.java
- package com.example.demo.service;
-
- import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
- import org.springframework.stereotype.Service;
- import java.util.concurrent.TimeUnit;
-
- @Service
- public class MyService {
-
- @HystrixCommand(fallbackMethod = "defaultResponse")
- public String riskyService() {
- // 模拟长时间运行的服务调用
- try {
- TimeUnit.SECONDS.sleep(5);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- return "Service response";
- }
-
- public String defaultResponse() {
- return "Default response";
- }
- }
MyController.java
- package com.example.demo.controller;
-
- import com.example.demo.service.MyService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- public class MyController {
-
- @Autowired
- private MyService myService;
-
- @GetMapping("/risky")
- public String riskyEndpoint() {
- return myService.riskyService();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。