봄 클라우드 알리바바는 : 센티넬은 전류 제한 퓨즈 달성

SpringBoot 실제 전기 공급 업체 항목 몰 (20K + 스타) 주소 : github.com/macrozheng / ...

개요

봄 클라우드 알리바바는 자사의 핵심 구성 요소의 하나로서, 마이크로 서비스 개발을위한 센티넬을 원 스톱 솔루션을 제공하기 위해 최선을 다하고 등이 문서의 의지 세부의 사용 서비스의 범위 및 제한 퓨즈 보호가 있습니다.

센티넬 소개

인기 마이크로 서비스, 및 서비스의 안정성이 더욱 중요 해지고있다. 출발점, 유량 제어, 퓨즈 하향 부하 보호 시스템 치수 안정성 보호 복수의 서비스로 유량 감시.

센티넬은 다음과 같은 특징이 있습니다 :

  • 풍부한 응용 프로그램 시나리오 : 실시간 응용 프로그램은 다운 스트림 날려 사용할 수없는 거의 10 년 알리바바의 핵심 시나리오 듀얼 XI 예를 들어 트래픽 스파이크를 촉진 수행하기 위해;
  • 전체 실시간 모니터링 : 실시간 모니터링을 제공하면서. 당신은 콘솔에서 하나의 기계 번째 데이터 액세스 응용 프로그램 또는 500 이하의 클러스터 크기의 작업의도에 대한 요약을 볼 수 있습니다;
  • 벌리고 생태학 : 상자에서 다른 오픈 소스 프레임 워크 / 라이브러리 통합 모듈을 제공, 예를 들어, 봄 클라우드, 두보의 gRPC과의 통합;
  • SPI 완벽한 확장 점 : 사용하기 쉽고 잘 SPI의 확장 점을 제공합니다. 당신은 확장 포인트, 빠른 사용자 지정 논리를 얻을 수 있습니다.

설치 센티넬 콘솔

센티넬 콘솔가 실시간 모니터링 자원을보고 독립 실행 형 클러스터 리소스의 요약을하는 데 사용할 수있는, 경량 콘솔 응용 프로그램이며, 이러한 흐름 제어 규칙, 강등의 규칙과 같은 관리 기능의 일련의 규칙을 제공, 핫 스팟 규칙.

  • 우리는 여기에서 다운로드입니다 센티넬을 다운로드하는 공식 웹 사이트로 시작하는 sentinel-dashboard-1.6.3.jar파일, 다운로드 주소 : github.com/alibaba/Sen를 ...

  • 다운로드가 완료되면, 센티넬 콘솔을 실행하려면 명령 줄에서 다음 명령을 입력 :

java -jar sentinel-dashboard-1.6.3.jar
复制代码
  • 포트 8080에 기본적으로 센티넬 콘솔이 실행은 모두 로그온 계정 암호 sentinel: 다음 주소를 통해 액세스 할 수 HTTP : // localhost를 : 8080

  • 센티넬 콘솔은 단일 시스템에서 데이터의 실시간 모니터링을 볼 수 있습니다.

센티넬 서비스 모듈을 만들고

여기에서 우리는 융합과 센티넬의 기능 프리젠 테이션을 전류 제한을위한 전초 서비스 모듈을 만들 수 있습니다.

  • pom.xml 파일에 종속성을 추가, 여기에 우리가, 우리가 같은 시간에 의존 Nacos를 추가 할 필요가 레지스트리로 Nacos을 사용합니다 :
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
复制代码
  • 주로 Nacos 및 센티넬 콘솔 구성을 해결, application.yml에 구성을 추가 :
server:
  port: 8401
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置sentinel dashboard地址
        port: 8719
service-url:
  user-service: http://nacos-user-service
management:
  endpoints:
    web:
      exposure:
        include: '*'
复制代码

제한 기능

모든 HTTP 서비스에 대한 센티넬 스타터 기본이 묻혀있는 지점을 전류 제한 제공, 우리는 또한 @SentinelResource를 사용하여 일부 제한의 동작을 사용자 정의 할 수 있습니다.

만들기 RateLimitController 클래스

융합 및 전류 제한을위한 테스트.

/**
 * 限流功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/rateLimit")
public class RateLimitController {

    /**
     * 按资源名称限流,需要指定限流处理逻辑
     */
    @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public CommonResult byResource() {
        return new CommonResult("按资源名称限流", 200);
    }

    /**
     * 按URL限流,有默认的限流处理逻辑
     */
    @GetMapping("/byUrl")
    @SentinelResource(value = "byUrl",blockHandler = "handleException")
    public CommonResult byUrl() {
        return new CommonResult("按url限流", 200);
    }

    public CommonResult handleException(BlockException exception){
        return new CommonResult(exception.getClass().getCanonicalName(),200);
    }

}
复制代码

제한 자원 이름을 따라

우리는 (자원 이름) @SentinelResource 주석이 정의 된 값에 따라 현재 운영을 제한 할 수 있지만 필요가 처리 로직을 제한 지정할 수 있습니다.

  • 흐름 제어 규칙은 우리가 Nacos 레지스트리를 사용하기 때문에, 이제 Nacos 및 감시 서비스를 시작하자, 센티넬 콘솔에서 구성 할 수 있습니다;

  • : 센티넬 지연로드 규칙을 사용하기 때문에, 우리는 인터페이스에 액세스 할 필요가 센티넬 콘솔이 인터페이스에서 우리의 첫 번째 방문, 해당 서비스 정보를해야합니다 HTTP : // localhost를 : 8401 / 만 부가 / byResource

  • 주석 @SentinelResource의 값에 따라 흐름 제어 콘솔 센티넬 규칙, 값을 구성 :

  • 인터페이스의 상단에 빠른 액세스는 전류 제한 정보 처리의 자신의 정의를 돌아 볼 수 있습니다 :

에 따르면 URL은 제한

우리는 또한 URL을 통해 액세스를 제한 할 수 있습니다, 그것은 프로세스 정보를 제한하는 기본 전류로 돌아갑니다.

  • 센티넬 콘솔 사용 액세스 URL은 흐름 제어 규칙 구성 :

지정 처리 로직 흐름 제한

우리는 일반적인 제한 처리 로직을 정의하고 @SentinelResource을 지정할 수 있습니다.

  • 처리 로직을 제한하는 사용자 정의 클래스를 만들 CustomBlockHandler :
/**
 * Created by macro on 2019/11/7.
 */
public class CustomBlockHandler {

    public CommonResult handleException(BlockException exception){
        return new CommonResult("自定义限流信息",200);
    }
}
复制代码
  • RateLimitController에서 사용자 지정 처리 로직의 사용을 제한 :
/**
 * 限流功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/rateLimit")
public class RateLimitController {

    /**
     * 自定义通用的限流处理逻辑
     */
    @GetMapping("/customBlockHandler")
    @SentinelResource(value = "customBlockHandler", blockHandler = "handleException",blockHandlerClass = CustomBlockHandler.class)
    public CommonResult blockHandler() {
        return new CommonResult("限流成功", 200);
    }

}
复制代码

퓨즈 기능

센티넬은 우리가이 기능을 설명하기 위해 제공 RestTemplate nacos 사용자 서비스 서비스 인터페이스를 호출하는 데 사용되는 작업을, 융합 보호를위한 간 서비스 호출, 오류 응용 프로그램을 지원합니다.

  • 첫째, 우리는 RestTemplate 인스턴스에서 @SentinelRestTemplate을 포장해야합니다
/**
 * Created by macro on 2019/8/29.
 */
@Configuration
public class RibbonConfig {

    @Bean
    @SentinelRestTemplate
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
复制代码
  • CircleBreakerController 클래스를 추가, 호출 인터페이스는 nacos 사용자 서비스에 대한 정의를 제공합니다 :
/**
 * 熔断功能
 * Created by macro on 2019/11/7.
 */
@RestController
@RequestMapping("/breaker")
public class CircleBreakerController {

    private Logger LOGGER = LoggerFactory.getLogger(CircleBreakerController.class);
    @Autowired
    private RestTemplate restTemplate;
    @Value("${service-url.user-service}")
    private String userServiceUrl;

    @RequestMapping("/fallback/{id}")
    @SentinelResource(value = "fallback",fallback = "handleFallback")
    public CommonResult fallback(@PathVariable Long id) {
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }

    @RequestMapping("/fallbackException/{id}")
    @SentinelResource(value = "fallbackException",fallback = "handleFallback2", exceptionsToIgnore = {NullPointerException.class})
    public CommonResult fallbackException(@PathVariable Long id) {
        if (id == 1) {
            throw new IndexOutOfBoundsException();
        } else if (id == 2) {
            throw new NullPointerException();
        }
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }

    public CommonResult handleFallback(Long id) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    public CommonResult handleFallback2(@PathVariable Long id, Throwable e) {
        LOGGER.error("handleFallback2 id:{},throwable class:{}", id, e.getClass());
        User defaultUser = new User(-2L, "defaultUser2", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }
}
复制代码
  • 시작 nacos 사용자 서비스 및 감시 서비스 서비스 :

  • 우리가 nacos 사용자 서비스 4의 사용자 ID를 정의하지 않았기 때문에, 다음과 같은 인터페이스에 대한 모든 액세스는 서비스 저하의 결과를 반환합니다 : HTTP : // localhost를 : 8401 / 차단기 / 대체 / 4

{
	"data": {
		"id": -1,
		"username": "defaultUser",
		"password": "123456"
	},
	"message": "服务降级返回",
	"code": 200
}
复制代码

척하기와 함께 사용

센티넬은 또한 우리가 서비스 호출 사이의 시간에 척하기를 사용 척하기의 구성 요소에 맞게, 당신은 또한 타격하는 데 사용할 수 있습니다.

  • 첫째, 우리는 pom.xml 파일에 척하기를 종속성을 추가해야합니다 :
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
复制代码
  • 에서 application.yml에 척하기 위해 열려 지원을 감시 :
feign:
  sentinel:
    enabled: true #打开sentinel对feign的支持
复制代码
  • 척하기 기능을 시작 응용 프로그램 시작 클래스 @EnableFeignClients에 추가;

  • nacos 사용자 서비스 서비스에 대한 호출을 정의하는 UserService 인터페이스를 만들기 :

/**
 * Created by macro on 2019/9/5.
 */
@FeignClient(value = "nacos-user-service",fallback = UserFallbackService.class)
public interface UserService {
    @PostMapping("/user/create")
    CommonResult create(@RequestBody User user);

    @GetMapping("/user/{id}")
    CommonResult<User> getUser(@PathVariable Long id);

    @GetMapping("/user/getByUsername")
    CommonResult<User> getByUsername(@RequestParam String username);

    @PostMapping("/user/update")
    CommonResult update(@RequestBody User user);

    @PostMapping("/user/delete/{id}")
    CommonResult delete(@PathVariable Long id);
}
复制代码
  • UserFallbackService 클래스 구현을 만들 UserService 인터페이스, 서비스 저하를 처리하기위한 논리 :
/**
 * Created by macro on 2019/9/5.
 */
@Component
public class UserFallbackService implements UserService {
    @Override
    public CommonResult create(User user) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult<User> getUser(Long id) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult<User> getByUsername(String username) {
        User defaultUser = new User(-1L, "defaultUser", "123456");
        return new CommonResult<>(defaultUser,"服务降级返回",200);
    }

    @Override
    public CommonResult update(User user) {
        return new CommonResult("调用失败,服务被降级",500);
    }

    @Override
    public CommonResult delete(Long id) {
        return new CommonResult("调用失败,服务被降级",500);
    }
}
复制代码
  • UserFeignController 통화 nacos 사용자 서비스 서비스에 사용 UserService는 척하기를 인터페이스 :
/**
 * Created by macro on 2019/8/29.
 */
@RestController
@RequestMapping("/user")
public class UserFeignController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public CommonResult getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }

    @GetMapping("/getByUsername")
    public CommonResult getByUsername(@RequestParam String username) {
        return userService.getByUsername(username);
    }

    @PostMapping("/create")
    public CommonResult create(@RequestBody User user) {
        return userService.create(user);
    }

    @PostMapping("/update")
    public CommonResult update(@RequestBody User user) {
        return userService.update(user);
    }

    @PostMapping("/delete/{id}")
    public CommonResult delete(@PathVariable Long id) {
        return userService.delete(id);
    }
}
复制代码
{
	"data": {
		"id": -1,
		"username": "defaultUser",
		"password": "123456"
	},
	"message": "服务降级返回",
	"code": 200
}
复制代码

사용 Nacos 저장 규칙

우리는 센티넬 콘솔에서 규칙을 구성 할 때 기본적으로 콘솔 푸시 규칙은 메모리에 직접 클라이언트와 업데이트에 대한 API의 규칙을 통해입니다. 우리는 응용 프로그램을 다시 시작하면, 규칙은 사라집니다. 여기에서 우리는 지속성이 Nacos 예를 저장하기 위해 다음 규칙을 구성하는 방법에 대해 설명합니다.

개략도

  • 먼저 우리는 유통 센터에서 직접 규칙을 생성, 유통 센터는 클라이언트에 푸시 통치 할;

  • 구성 중심의 구성 정보를 얻기 위해 또한 콘솔 감시.

데모

  • 우선 pom.xml 파일에의 종속성을 추가 :
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
复制代码
  • 구성 파일을 수정 Application.yml, Nacos 데이터 소스 구성을 추가 :
spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-sentinel
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
复制代码
  • Nacos의 추가 구성에서 :

  • 다음과 같이 구성 정보가 추가 :
[
    {
        "resource": "/rateLimit/byUrl",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
复制代码
  • 관련 매개 변수의 해석 :

    • 자원 : 자원 이름을;
    • limitApp : 소스 응용 프로그램;
    • 등급 : 임계 값 유형, 스레드의 수는 1 QPS를 나타내는, 0 나타냅니다;
    • 수 : 단일 임계 값;
    • 전략 : 흐름 제어 모드는, 직접, 0 나타내는 1 협회 2 나타낸다 링크를 나타내고;
    • controlBehavior : 유체의 효과가 1은 워밍업 대표, 빠른 실패 0을 나타냅니다, 대기 2 나타냅니다;
    • clusterMode : 클러스터 여부.
  • 센티넬 콘솔은 다음과 같은 제한 규칙을 발견했다 :

  • 테스트 인터페이스에 대한 빠른 액세스는 제한 프로세스 정보를 반환하는 찾을 수 있습니다 :

참고 자료

봄 클라우드 알리바바 공식 문서 : github.com/alibaba/spr ...

모듈을 사용하려면

springcloud-learning
├── nacos-user-service -- 注册到nacos的提供User对象CRUD接口的服务
└── sentinel-service -- sentinel功能测试服务
复制代码

프로젝트 소스 주소

github.com/macrozheng/...

있는 공개하지

쇼핑몰 프로젝트 에 연재 전체 튜토리얼 공공 우려 번호 얻기 위해 처음.

있는 공개 사진 없다

추천

출처juejin.im/post/5dd29bece51d4561e80f9053