Spring Cloud는 센티넬을 사용합니다.

1. 종속성 추가

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2. 구성 파일 구성 주소

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

 3. 흐름 제어 모드 도입

직접: 현재 자원에 대한 통계적 요청이며 임계값이 트리거될 때 현재 자원의 흐름을 직접 제한하며 기본 모드이기도 합니다.

연관: 현재 자원과 관련된 다른 자원이 임계값을 트리거할 때 현재 자원의 흐름을 제한

        사용 시나리오: 예를 들어, 사용자는 결제 시 주문 상태를 수정해야 하며 동시에 주문을 쿼리하려고 합니다. 쿼리 및 수정 작업은 데이터베이스 잠금을 놓고 경합하여 경합을 일으킵니다. 비즈니스 요구 사항은 제한된 지불 및 주문 업데이트 비즈니스이므로 주문 비즈니스 트리거 임계값을 수정할 때 쿼리 주문 비즈니스 흐름을 제한해야 합니다.

링크: 지정된 링크에서 이 리소스에 액세스하기 위한 요청에 대해 임계값이 트리거되면 지정된 링크의 흐름을 제한합니다.

예를 들어 두 개의 요청 링크가 있습니다.

/test1→ /common
/test2→/common

/test2 에서 /common 까지의 요청 만 계산하려면 다음과 같이 구성할 수 있습니다.

알아채다:

1. Sentinel은 기본적으로 컨트롤러 메서드를 컨텍스트 통합 하므로 링크 모드에서 흐름 제어가 실패합니다 .application.yml을 수정 하고 구성을 추가해야 합니다.

spring :
 
cloud :
    sentinel :
     
web-context- unify : false #컨텍스트 통합 닫기

2. 기본적으로 Sentinel은 Controller 에 있는 메소드 만 리소스로 표시하며 , 다른 메소드(예: 서비스 메소드)를 표시하려면 @SentinelResource 주석을 사용해야 합니다.예:

@SentinelResource ( "상품" )
public void queryGoods() {     System.err
.println ( " 상품 조회 " );
}

 4. 흐름 제어 효과

빠른 실패: QPS가 임계값을 초과하면 새 요청이 거부됩니다.

준비: QPS가 임계값을 초과하면 새 요청이 거부되지만 QPS 임계값이 점차 증가하여 콜드 스타트 ​​중 높은 동시성으로 인한 서비스 중단 시간을 피할 수 있습니다.

대기열 대기: 요청이 대기열에 들어가고 임계값이 허용하는 시간 간격에 따라 요청이 순차적으로 실행되며 요청의 예상 대기 시간이 제한 시간보다 길면 바로 거부됩니다.

5. 핫스팟 매개변수의 현재 제한

핫스팟 매개변수 전류 제한은 매개 변수 값이 동일한 요청을 개별적으로 카운트하여 QPS 임계값 을 초과하는지 여부를 결정하는 것 입니다. 일부 매개변수에 대해 예외 구성을 설정할 수 있습니다 .

참고: 핫스팟 매개변수 현재 제한은 기본 SpringMVC 리소스에 대해 유효하지 않으며 @SentinelResource 주석을 수동으로 추가해야 합니다.

 6. FeignClient는 Sentinel을 통합합니다.

Sentinel 이 지원하는 Avalanche 솔루션 : 1. 스레드 격리(사일로 벽 모드) 2. 퓨즈 성능 저하

(1) application.yml에서 구성: feign.sentienl.enable =true

feign :
  sentinel :
   
enabled : true # Feign Sentinel 기능 활성화 _

(2) FeignClient용 FallbackFactory를 작성 하고 Bean 으로 등록

public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        // 创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
        return new UserClient() {
            @Override
            public User findById(Long id) {
                // 记录异常信息
                log.error("查询用户失败", throwable);
                // 根据业务需求返回默认的数据,这里是空用户
                return new User();
            }
        };
    }
}

@Bean
public UserClientFallbackFactory userClientFallback(){
    return new UserClientFallbackFactory();
}

(3) FallbackFactory를 FeignClient 로 구성

@FeignClient(value = "userservice", fallbackFactory =UserClientFallbackFactory.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

 7. 차단기 다운그레이드 전략

1. 슬로우 콜 비율 : 지정된 시간을 초과하는 콜을 슬로우 콜로 하고, 단위 시간 내 슬로우 콜의 비율을 카운트하여 기준치를 초과하면 블로우 처리한다.

2. 이상율 : 통계단위 기간 내 비정상호출 비율, 기준치 초과시 블로우

3. 예외 건수 : 단위 시간 내 비정상 호출 건수를 카운트하여 기준치 초과 시 블로우 처리

8. 승인 규칙

권한 부여 규칙은 발신자의 소스를 제어할 수 있으며 화이트리스트와 블랙리스트의 두 가지 방법이 있습니다.

 Sentinel은 RequestOriginParser 인터페이스 parseOrigin을 통해 요청 소스를 얻습니다 .

public interface RequestOriginParser {
    /**
     * 从请求request对象中获取origin,获取方式自定义
     */
    String parseOrigin(HttpServletRequest request);
}

따라서 흐름 제어 응용 프로그램을 채울 때 사용자 정의 RequestOriginParser에 따라 채웁니다 (예: 게이트웨이에서 오는 요청인지 직접 액세스하는 서비스에서 오는 요청인지 구분하기 위해 요청 헤더에 값을 추가하는 등).

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getHeader("origin");
        if(StringUtils.isEmpty(origin)){
            return "blank";
        }
        return origin;
    }
}

아홉, 맞춤 반품 방법

BlockExceptionHandler 인터페이스를 구현하십시오.

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;
        if (e instanceof FlowException) {
            msg = "请求被限流了!";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了!"; 
        } else if (e instanceof ParamFlowException) {
            msg = "热点参数限流!";
        } else if (e instanceof AuthorityException) {
            msg = "请求没有权限!";
            status = 401;
        }
        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.setStatus(status);
        httpServletResponse.getWriter().println("{\"message\": \"" + msg + "\", \"status\": " + status + "}");
    }
}

 10. 구성 규칙 지속성의 세 가지 모드

1. 원본 모드: 메모리에 저장

2. 풀 모드: 로컬 파일 또는 데이터베이스에 저장하고 정기적으로 읽기

3. 푸시 모드: nacos 에 저장 , 변경 사항 모니터링 및 실시간 업데이트

일반적으로 프로덕션 환경은 푸시 모드를 채택하고 Sentinel-dashboard의 소스 코드를 수정해야 합니다.

추천

출처blog.csdn.net/u012758488/article/details/129860795