В распределенных системах ухудшение качества обслуживания является важным механизмом отказоустойчивости. Когда служба недоступна или отвечает медленно, механизм деградации может обеспечить общую стабильность системы. В этой статье будет подробно описано, как использовать Hystrix и Resilience4j для реализации функции перехода на более раннюю версию в Spring Boot.
Деградация службы заключается в предоставлении альтернатив (например, возврат к значениям по умолчанию или кэшированию данных) в случае сбоя службы или медленного ответа для обеспечения общей доступности системы. Механизм деградации может предотвратить распространение сбоя одной службы на всю систему, тем самым улучшая стабильность и отказоустойчивость системы.
существовать pom.xml
Добавить в файл Hystrix полагаться:
xmlкопироватькод<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
существовать Spring Boot Добавьте его в основной класс приложения @EnableHystrix
аннотация:
javaкопировать импорт org.springframework.boot.SpringApplication;
импортировать org.springframework.boot.autoconfigure.SpringBootApplication;
импортировать org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
@SpringBootApplication
@EnableCircuitBreaker
общественный класс HystrixExampleApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixExampleApplication.class, args);
}
}
Создайте класс обслуживания, смоделируйте удаленные вызовы и реализуйте метод понижения версии:
javaкопировать импорт кода com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@HystrixCommand(fallbackMethod = "fallback")
public String callExternalService() {
// Имитация удаленных вызовов службы поддержки
return restTemplate.getForObject("http://external-service/api/resource", String.class);
}
public String fallback(Throwable t) {
// Понижение логики обработки
return "Fallback response: Service is currently unavailable.";
}
}
существоватьтвой Конфигурацияв классе Конфигурация RestTemplate
:
javaкопировать импорт кода org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Создайте контроллер, вызовите сервис и верните результат:
javaкопировать импорт кода org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
private final MyService myService;
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/call")
public String call() {
return myService.callExternalService();
}
}
существовать pom.xml
Добавить в файл Resilience4j соответствующийполагаться:
xmlкопироватькод<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>1.7.1</version>
</dependency>
существовать application.yml
середина Конфигурация Resilience4j Автоматические выключатели и стратегии перехода на более раннюю версию:
yamlкопировать кодresilience4j:
автоматический выключатель:
конфиги:
по умолчанию:
RegisterHealthIndicator: правда
RingBufferSizeInClosedState: 5
RingBufferSizeInHalfOpenState: 2
waitDurationInOpenState: 10000
# errorRateThreshold: 50
# минимальное количество вызовов: 5
# скользящий размер окна: 10
экземпляры:
мой Сервис:
базовая конфигурация: по умолчанию
errorRateThreshold: 50
waitDurationInOpenState: 10000
RingBufferSizeInClosedState: 5
RingBufferSizeInHalfOpenState: 2
Создайте класс обслуживания, смоделируйте удаленные вызовы и реализуйте метод понижения версии:
javaкопировать импорт кода io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@CircuitBreaker(name = "myService", fallbackMethod = "fallback")
public String callExternalService() {
// Имитация удаленных вызовов службы поддержки
return restTemplate.getForObject("http://external-service/api/resource", String.class);
}
public String fallback(Throwable t) {
// Понижение логики обработки
return "Fallback response: Service is currently unavailable.";
}
}
существоватьтвой Конфигурацияв классе Конфигурация RestTemplate
:
javaкопировать импорт кода org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Создайте контроллер, вызовите сервис и верните результат:
javaкопировать импорт кода org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
private final MyService myService;
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/call")
public String call() {
return myService.callExternalService();
}
}
запускать Spring Boot Подайте заявку и получите доступ /call
конечная точка. Если имитируемая внешняя служба недоступна, вы увидите ответ, возвращаемый методом понижения версии.
В этой статье мы покажем, как использовать Hystrix и Resilience4j существовать Spring Boot Реализовать функцию понижения версии сервиса. хотя Hystrix Мощный, но поскольку его обслуживание прекращено, Resilience4j Становится более рекомендуемым выбором. Устойчивость4j Предоставляет богатые функции, помогающие создавать надежные распределенные системы.
Я надеюсь, что эта статья поможет вам понять и реализовать переход на более раннюю версию сервиса. Приятного кодирования!