노트와 원 스톱 제한 퓨즈 다운 그레이드 : @SentinelResource

이전에 "센티넬이 제한 인터페이스를 구현 사용" 기사, 우리는 센티넬에 봄 클라우드 알리바바 통합 패키지의 도입에 의존하는 spring-cloud-starter-alibaba-sentinel모든 스프링 MVC 인터페이스의 전류 제한 제어를 완료합니다. 그러나, 실제 적용 과정에서, 우리는 인터페이스에 한정되지 않고 흐름 수준을 제한 할 필요가있다. 가능한 외부 자원에 대한 특정 제한 전화로 제한하는 방법을 호출하고 이렇게 제어를 수행 할 수 있습니다. 그것은 어떤 자원 점은, 우리가이 시간을 수동으로 필요한 전류 제한을 정의하고, 전류 제한 전략의 관련 콘텐츠를 구성 할 수 있습니다.

오늘날 우리가 사용하는 방법에 대해 함께 배울 수있다이 @SentinelResource유연한 리소스 제어 및 정책을 구성하는 방법에를 정의하는 주석을.

사용자 정의 자원 포인트

다음의 예는 그렇지이있는 경우에 당신이, 봄 클라우드 알리바바 센티넬 기준을 도입 한 것을 기반으로, 그 우선 순위를 읽을 수 권장 "전류 제한 달성하기 위해 센티넬 인터페이스를 사용하여" .

첫 번째 단계 : 기본 응용 프로그램 클래스 지원되는 구성에 메모를 추가 :

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    // 注解支持的配置Bean
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }

}
复制代码

단계 2 :이 필요한 센티넬 통해 흐름 제어 @SentinelResource등의 예를 들어 서비스 로직 층을 제어하는 방법으로 다음과 같은 메모 :

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing")
    public void doSomeThing(String str) {
        log.info(str);
    }

}
复制代码

여기 메서드 정의가 완료에 보호 될 필요가있다. 등등, 강등을 제한하고 : 여기에 우리가 정의 된 자원 포인트 이후에 대한 이야기를했다, 우리는 다른 보호 전략을 포함하는 방법을 알고 있습니다.

어떻게 강등 전류 제한 퓨즈를 달성하기 위해

자원 점을 정의한 후, 우리는 자원 포인트를 보호하기 위해 대시 보드를 통해 전류 제한 및 다운 그레이드 정책을 설정할 수 있습니다. 동시에, 또한 수있는 @SentinelResource예외 처리 정책은 한계 및 다운 그레이드가 발생하는 시간을 지정합니다. 여기, 우리는 전류 제한과 강등의 각각 살펴보고 구현한다.

전류 제한 제어를위한

1 단계 : 웹 레이어 호출이 보호 방법 :


@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello")
    public String hello() {
        estService.doSomeThing("hello " + new Date());
        return "didispace.com";
    }

}
复制代码

센티넬 - 대시 보드를 시작, 테스트 응용 프로그램을 시작 : 두 단계. 받는 사람 요청 보내기 /hello센티넬 - 대시 보드에 다음과 같이 몇 가지 제어 지점이 볼 수 그래서, 인터페이스 :

인스턴스가 이전처럼 우리는 항목에 추가하여 볼 수 있습니다 /hello자원 점, 한 번 더 이상 doSomeThing자원 포인트. 이 점 QPS 것으로 규칙 인터페이스와 같은 2 제한함으로써 자원을 제공 할 수있다. 때문에 /hello자원이 제한 규칙을 설정하지 않은, 너무 오래 요청으로 /hello인터페이스, 당신은 직접 아날로그 호출 할 수 doSomeThing제한 규칙이 적용되는 관찰, 자원.

다음은 당신이 좋아하는 어떤 도구를 호출 할 수있는 /hello인터페이스, 한 개 이상의 2 QPS를 한 후 다음과 같은 오류 사항을 적용하려면 정책을 제한하는 대신, 반환이있을 것이다.

이 시점에서, 서버 콘솔은 해당 제한 오류 로그를해야합니다 :

2019-06-27 11:30:43.514  INFO 36898 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : aaa
2019-06-27 11:30:43.905 ERROR 36898 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
复制代码

예외 처리를 달성 제한

기본적으로 센티넬 전류 제한 처리 제어 자원은 직접 던져 예외, 즉, 게시에 로그의 내용입니다. 더 나은 서비스를 사용자에게 위해 합리적인 비즈니스 사업 또는 도킹 케이스의 프론트 엔드에서 그렇게 할 수 있지만, 정상적인 상황에서, 제한 된 후에 특별한 치료를 달성, 우리는 무딘 오류를 표시하지 않습니다. 그럼 당신은 예를 들어, 위의 예에 따라 몇 가지 처리를 할 필요가 :

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler")
    public void doSomeThing(String str) {
        log.info(str);
    }

    // 限流与阻塞处理
    public void exceptionHandler(String str, BlockException ex) {
        log.error( "blockHandler:" + str, ex);
    }
    
}
复制代码

주로 두 가지를 :

  • 하여 @SentinelResource주석 blockHandler특정 핸들러 속성을 개발
  • 프로세싱 기능을 구현하는 전달 함수 파라미터 및 파라미터 전달 자원은 동일한 점, 그리고 마지막으로해야 BlockException비정상 파라미터는 동일한 시간이 리턴 형태는 동일해야한다.

당신이 HystrixCommand 정의 된 대체에이 디자인을 찾아야한다 익숙한 Hystrix 리더와 매우 유사하다하면 이해하기 쉽다.

위의 변경 완료 후, 다음 (참고 제한 규칙을 구성해야합니다), 다음 전면 예외 정보를 반환하지 않습니다 인터페이스에 액세스를 시도, 백엔드는 인쇄 할 exceptionHandler로그 출력 정의를. 그리고 실제 응용 프로그램에서, 한 사업으로 지금이 방법에 따라 프런트 엔드 팁이 구현 될 수있다 할 캐싱 또는 제한하기위한 요청을해야합니다.

실현 날려 다운 그레이드

@SentinelResource주석뿐만 아니라 전류 제한 제어에 사용할 수 있습니다, 그것은 또한 Hystrix 다운 그레이드 정책과 유사한 퓨즈를 달성 할 수 있습니다. 여기에 그것을 사용하는 방법을 특정 살펴 보자.

전류 제한 제어와 같이, 사용하는 첫 번째 단계 @SentinelResource같은 주석 태그 자원 점 :

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing2")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }

}
复制代码

여기에 TestService방법의 새로운 클래스의 생성 및 사용하는 @SentinelResource이름을 리소스를 doSomeThing2. 이 방법은 (Hystrix 유사) 이상 하향 비율에 기초한 전략을 개발하기 위해 후속으로, 예외를 던진다. 센티넬은 풍부한 Hystrix을 비교하고, 응답 시간 및 정책 예외를 다운 그레이드의 수에 따라.

단계 : 웹 층에서이 보호 된 메서드를 호출합니다 :

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello2")
    public String hello2() {
        testService.doSomeThing2("hello2 " + new Date());
        return "didispace.com";
    }

}
复制代码

세 번째 단계 : 테스트 응용 프로그램을 시작, 센티넬 - 대시 보드를 시작합니다. 받는 사람 요청 보내기 /hello2당신은 센티넬 - 대시 보드 이름에 볼 수 있도록 인터페이스를 doSomeThing2자원 점. 그런 다음 다운 그레이드 자원에 대한 규칙을 설정하려면 "다운 그레이드"버튼을 클릭합니다. 본원에 사용 된 바와 같이, 비정상적인 비율 정책의 비율은 0.5로 설정된다 (즉 : 50 % 이상 레이트), 시간 윈도우가 2 (초)로 설정된다.

4 단계 : 퓨즈 확인은 상기 열화 정책 구성에 따라 저하 doSomeThing2비율이 50 %를 초과하면, 호출 방법 QPS> = 5, 비정상 후 2 초 내에 후속 호출 직접 하향 기본 직접 발생의 퓨즈 진행 DegradeException같은 이상 :

2019-06-27 17:49:58.913 ERROR 99863 --- [nio-8001-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.degrade.DegradeException: null
复制代码

풍선 다운 그레이드

센티넬 퓨즈 정의 그레이드 처리 방법은 매우 간단하고 Hystrix 매우 유사하다. 그냥 사용 @SentinelResource주석 fallback특정 메소드 이름을 지정하는 속성. 또한 일관성이 있어야 참여할 수있는 리턴 패스에주의가 필요합니다. 예를 들면 :

@Slf4j
@Service
public class TestService {

    // 熔断与降级处理
    @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }

    public void fallbackHandler(String str) {
        log.error("fallbackHandler:" + str);
    }
}
复制代码

위의 변환을 완료 한 후 응용 프로그램을 다시 시작하고 설정 doSomeThing2한 후, 자주 요청 다운 그레이드 전략 (비정상적인 사용의 백분율)를 날려 자원의 /hello2인터페이스를. 이 인터페이스가 발생되었다 인해 QPS> = 5,이 격하 조건이 충족되는 송풍이 시간이 후에 수행 할 fallbackHandler방법을 연속 인쇄 로그는 다음과 같다 :

2019-06-27 23:44:19.432 ERROR 58471 --- [nio-8001-exec-1] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.599 ERROR 58471 --- [nio-8001-exec-2] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.791 ERROR 58471 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.975 ERROR 58471 --- [nio-8001-exec-4] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:20.168 ERROR 58471 --- [nio-8001-exec-5] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:20 CST 2019
复制代码

더 많은 주석 속성 설명

소개 @SentinelResource를 통해 소개 전류 제한 퓨즈 및 제어 다운 그레이드 특정 사용 사례 : 두 가지 용도를 말한다. 또한, 주석이 같은 무시 특정 특이한 구성, 기능의 다른 더 정교한 구성하고, 그래서 저하 특히 눈에 보이는 다음과 같은 설명을 기본 :

  • value: 자원 이름은 필수 항목 (비워 둘 수 없습니다)
  • entryType: 항목 유형, (기본 옵션 EntryType.OUT)
  • blockHandler/ blockHandlerClass: blockHandler대응 처리 BlockException함수 이름, 옵션. blockHandler 범위 기능에 액세스 할 필요가있다 public, 반환 유형이 원래의 방법과 일치하는 데 필요한 및 매개 변수는 원래의 방법의 유형과 일치 그리고 마지막으로 추가 매개 변수 유형을 추가해야합니다 BlockException. blockHandler 기본 기능은 동일한 클래스의 원래 방법을 필요로한다. 이 기능의 다른 유형을 사용하려는 경우 지정할 수 있습니다 blockHandlerClass대응의 클래스 Class해당 기능에 주목, 객체를 정적 기능을 위해 필요하다, 그렇지 않으면 해결 될 수 없습니다.
  • fallback: 대체 함수 이름, 예외가 발생 될 때 대체 처리 로직을 제공하기위한 옵션. 대체 함수 (예외의 모든 유형을 제외 할 수있는 exceptionsToIgnore처리를 제외 예외 타입). 대체 함수 서명 및 위치 요구 사항 :
    • 반환 값 함수 반환 값은 원래 유형과 일치해야합니다;
    • 이 방법은 원래의 일관성 및 함수 파라미터의리스트를 필요로하거나 부가 할 수있다 Throwable수신 된 매개 변수에 대응하는 비정상의 유형.
    • 기본 대체 기능과 같은 클래스의 원래 방법을 필요로한다. 이 기능의 다른 유형을 사용하려는 경우 지정할 수 있습니다 fallbackClass대응의 클래스 Class해당 기능에 주목, 객체를 정적 기능을 위해 필요하다, 그렇지 않으면 해결 될 수 없습니다.
  • defaultFallback(1.6.0 이후) : 기본 대체 함수 이름, 일반적으로 (많은 서비스 나 방법을 사용할 수있다) 일반적으로 대체 로직에 사용되는 옵션. (예외의 모든 유형을 제외 할 수있는 기본 대체 기능을 exceptionsToIgnore처리하는 제외 예외 유형). 당신이 대체하고 defaultFallback 모두를 구성하는 경우에만 대체가 적용됩니다. defaultFallback 함수 서명 요구 사항 :
    • 반환 값 함수 반환 값은 원래 유형과 일치해야합니다;
    • 상기 방법은 파라미터리스트가 비어 있거나 추가 할 수 있어야 Throwable수신 된 매개 변수에 대응하는 비정상의 유형.
    • defaultFallback 기본 기능은 동일한 클래스의 원래 방법을 필요로한다. 이 기능의 다른 유형을 사용하려는 경우 지정할 수 있습니다 fallbackClass대응의 클래스 Class해당 기능에 주목, 객체를 정적 기능을 위해 필요하다, 그렇지 않으면 해결 될 수 없습니다.
  • exceptionsToIgnore(버젼 1.6.0)가 예외를 제외 통계적 이상을 포함하고 있지 및 대체 논리 입력되지 않지만가 발생 될 것이다 정하기 위해 사용된다.

참고 : 버전 1.6.0 대체 기능 이전에만 다운 그레이드에 대한 매우 ( DegradeException) 처리, 비즈니스에 대한 예외를 처리 할 수 없습니다 .

blockHandler 및 대체가 구성된 경우에 특히, 이들은 하향 제한 던져진 BlockException때만 입력한다 blockHandler프로세싱 로직. 어떤 구성하는 경우 blockHandler, fallback그리고 defaultFallback, 제한 된 다운 그레이드 BlockException 직접 던져 .

참고 : 센티넬 공식 문서

상표 : 당신이 특정 문제가 발생하는 경우 스프링이 클라우드 알리바바 의존성 버전 0.2.2 바탕으로, 체크 코드 예제 특별한 경우에 직접 버전은 같은를 확인하거나 바랍니다.

샘플 코드

이 문서에서는 클라이언트 코드의 내용을 설명, 독자들은 다음의 예웨어 하우스 볼 수 있습니다 alibaba-sentinel-annotation프로젝트를 :

당신이에 관심이 있다면, 별을 환영 따라, 북마크, 지원을 전달!

추천

출처juejin.im/post/5d19643ce51d454fbe24a6cc