Spring Boot 에서 차단기 사용 방법 에 대한 자세 한 설명
Spring 을 사용 하여 개발 하 는 개인 과 기업 이 많아 지면 서 Spring 도 단일 하고 간결 한 작은 구조 에서 크 고 완전한 오픈 소스 소프트웨어 로 바 뀌 었 다.Spring 의 경 계 는 계속 확대 되 었 고 그 후에 Spring 은 거의 모든 일 을 할 수 있 게 되 었 다.시장 에서 주류 의 오픈 소스 소프트웨어,중간 부품 은 모두 Spring 대응 구성 요소 의 지원 을 받 았 다.사람들 은 Spring 의 이런 편 의 를 이용 한 후에 도 약간의 문제 에 부 딪 혔 다.
차단기 자 체 는 회로 의 과부하 보호 장치 로 선로 에 전기 가 단락 되 었 을 때 고장 난 회 로 를 제때에 차단 하여 심각 한 결과 가 발생 하 는 것 을 방지 할 수 있다.서비스 용 단(차단기 라 고도 할 수 있 음),강등,제한 흐름(격 리),비동기 RPC 등 수단 을 통 해 의존 서비스의 지연 과 실 패 를 통제 하고 전체 서비스 눈사태 를 방지한다.차단 기 는 보 호 된 기능 호출 을 장식 하고 감지 할 수 있다.현재 상태 에 따라 호출 시 실행 되 는 지 되 돌아 오 는 지 결정 합 니 다.일반적인 상황 에서 하나의 차단기 가 세 가지 유형의 상 태 를 실현 한다.open,half-open 과 closed:
4.567917.closed 상태의 호출 이 실행 되 고 사무 도량 이 저장 되 며 이런 도량 은 건강 전략 을 실현 하 는 데 필수 적 이다4.567917.시스템 건강 상태 가 나 빠 지면 차단기 가 open 상태 에 있 습 니 다.이 상태 에서 모든 호출 은 즉시 되 돌아 가 고 새로운 호출 이 발생 하지 않 습 니 다.open 상태의 목적 은 서버 측 에 문 제 를 답장 하고 처리 하 는 시간 입 니 다4.567917.차단기 가 open 상태 에 들 어가 면 시간 초과 타이머 가 시간 을 잽 니 다.타이머 가 시간 을 초과 하면 차단기 가 half-open 상태 로 전환 합 니 다.half-open 상태 에서 간헐 적 으로 실행 하여 문제 가 해결 되 었 는 지 확인 합 니 다.해결 되면 상태 가 closed 상태 로 전환 합 니 다
차단기 뒤의 기본 사상 은 매우 간단 하 다.보 호 된 함수 호출 을 차단기 대상 에 포장 하고 이 대상 은 고장 을 감시 합 니 다.일단 고장 이 특정한 한도 값 에 이 르 면 차단기 가 스위치 를 뛰 어 넘 고 모든 차단기 에 대한 추가 호출 은 오 류 를 되 돌려 주 며 보 호 받 는 호출 을 하지 않 습 니 다.일반적으로 차단기 가 스위치 를 뛰 어 넘 으 면 어떤 모니터 경보 가 필요 합 니 다.
어떻게 Hystrix 를 빨리 사용 합 니까?다음은 저 를 따라 1,2,3,4...
1.@EnableCurctionBreaker 주 해 를 추가 합 니 다.
@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClientspublic class DroolsAppApplication {
public static void main(String[] args) {
SpringApplication.run(DroolsAppApplication.class, args);
}
}
Hystrix 전체 실행 과정,우선 Command 는 run 방법 을 호출 합 니 다.run 방법 이 시간 을 초과 하거나 이상 을 던 지 거나 강등 처 리 를 사용 하면 getFallback 방법 으로 강등 합 니 다.2.@Hystrixcand 주석 사용
@HystrixCommand(fallbackMethod = "reliable")
public String readingList() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "jinpingmei";
}
public String reliable() {
return "you love interesting book";
}
3.인용 추가
compile("org.springframework.cloud:spring-cloud-starter-hystrix")
compile('org.springframework.cloud:spring-cloud-starter-turbine')
4.시간 초과 설정
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
실행 결 과 는 다음 과 같 습 니 다.정상 으로 돌아 가 야 합 니 다:
너 는 jinpingmei 를 좋아 하지 말고 재 미 있 는 책 을 좋아해 야 한다.이렇게 사용 하면 편 한데,@EnableCurctionBreaker 라 는 주해 가 이렇게 강 한 가요?
Hystrix CommandAspect 는 AOP 를 통 해 모든@Hystrix Command 주 해 를 차단 하 는 방법 으로@Hystrix Command 를 Spring boot 에 통합 할 수 있 습 니 다.
HystrixcandAspect 의 핵심 코드 는 다음 과 같 습 니 다.
1.방법 hystrixCommandAnnotationPointcut()정의 차단 주석 HystrixCommand
2.방법 hystrixCollapserAnnotationPointcut()정의 차단 주해 HystrixCollapser
3.방법 methods Annotated With Hystrix Command(...)@Around(...)를 통 해 모든 Hystrix Command 와 Hystrix Collapser 주 해 를 차단 하 는 방법.상세 한 것 은 방법 주 해 를 보십시오.
@Aspect
public class HystrixCommandAspect {
private static final Map<HystrixPointcutType, MetaHolderFactory> META_HOLDER_FACTORY_MAP;
static {
META_HOLDER_FACTORY_MAP = ImmutableMap.<HystrixPointcutType, MetaHolderFactory>builder()
.put(HystrixPointcutType.COMMAND, new CommandMetaHolderFactory())
.put(HystrixPointcutType.COLLAPSER, new CollapserMetaHolderFactory())
.build();
}
@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")
public void hystrixCommandAnnotationPointcut() {
}
@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)")
public void hystrixCollapserAnnotationPointcut() {
}
@Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")
public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
Method method = getMethodFromTarget(joinPoint);
Validate.notNull(method, "failed to get method from joinPoint: %s", joinPoint);
if (method.isAnnotationPresent(HystrixCommand.class) && method.isAnnotationPresent(HystrixCollapser.class)) {
throw new IllegalStateException("method cannot be annotated with HystrixCommand and HystrixCollapser " +
"annotations at the same time");
}
MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));
MetaHolder metaHolder = metaHolderFactory.create(joinPoint);
HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);
ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?
metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();
Object result;
try {
result = CommandExecutor.execute(invokable, executionType, metaHolder);
} catch (HystrixBadRequestException e) {
throw e.getCause();
}
return result;
}
그렇다면 Hystrix CommandAspect 는 어떻게 초기 화 되 었 는 지,Hystrix Circuit Breaker Configuration 을 통 해 이 루어 졌 습 니 다.
@Configuration
public class HystrixCircuitBreakerConfiguration {
@Bean
public HystrixCommandAspect hystrixCommandAspect() {
return new HystrixCommandAspect();
}
그럼 누가 Hystrix CircuitBreaker Configuration 실행 초기 화 를 촉발 합 니까?spring-cloud-netflix-core**.jar 패키지 의 spring.factories 에 이 설정 이 있 습 니 다.주석 Enablecourture Breaker 가 촉발 합 니 다.
org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\
org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration
그렇다면@EnableCurctionBreaker 는 어떻게 HystrixcurctionBreakerConfiguration 을 촉발 합 니까?원본 코드 를 통 해 볼 수 있 습 니 다.이 는@Import 를 통 해 EnablecourteBreakerImportSelector 클래스 를 초기 화 합 니 다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableCircuitBreakerImportSelector.class)
public @interface EnableCircuitBreaker {
}
Enable Circuit Breaker ImportSelector 는 SpringFactory ImportSelector 하위 클래스 입 니 다.초기 화 후 selectImports(AnnotationMetadata metadata)방법 을 실행 합 니 다.이 방법 은 주석 에 따라 시 작 된 주해(@EnableCurctionBreaker)를 통 해 spring.factories 파일 에서 설정 을 가 져 오 려 면@Configuration 류(여 기 는 org.springframework.cloud.netflix.hystrix.Hystrix CircuitBreaker Configuration)를 초기 화하 여 Hystrix CommandAspect 류 를 마지막 으로 초기 화하 여 Hystrix Command 를 차단 하 는 기능 을 수행 합 니 다.이상 은@Enablecourture Breake 를 통 해 Hystrix 를 열 수 있 는 원리 입 니 다.Hystrix 는 관찰자 모드 AbstractCommand.execute CommandAndObserve()모드 를 사 용 했 습 니 다.다음 에는 관찰자 모드 를 깊이 있 게 말씀 드 리 겠 습 니 다.벽돌 을 찍 는 것 을 환영 합 니 다!
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.