커커스 브레이커 모드
분산 환경, 특히 마이크로 서비스 구조가있는 분산 시스템에서 하나의 소프트웨어 시스템이 다른 원격 시스템을 호출하는 것이 매우 일반적입니다. 이 원격 통화의 칼리는 다른 프로세스 또는 네트워크 전체의 다른 호스트 일 수 있습니다. 이 원격 통화와 프로세스의 내부 호출의 가장 큰 차이점은 타임 아웃까지 원격 통화가 응답없이 실패하거나 매달릴 수 있다는 것입니다. 더 나쁜 것은, 여러 발신자가 동일한 보류중인 서비스를 호출하는 경우 서비스의 시간 초과 대기가 전체 분산 시스템으로 빠르게 퍼져서 연쇄 반응을 일으켜 전체 분산 시스템의 많은 양의 리소스를 소비 할 가능성이 높습니다. 결국 시스템 마비로 이어질 수 있습니다.
회로 차단기 모드는 분산 시스템에서 폭포 같은 연쇄 반응으로 인한 재해를 방지하는 것입니다.
일단 특정 전기 기기에 문제가 있으면 회로의 융합이 재난을 방지하기 위해 날아갑니다. 회로 차단기는 회로 퓨즈와 유사합니다. 구현 아이디어는 매우 간단합니다. 보호가 필요한 원격 서비스를 캡슐화하고 내부적으로 실패 수를 모니터링 할 수 있습니다. 실패 횟수가 특정 임계 값에 도달하면 서비스에 대한 모든 후속 통화는 회로 차단기 인터셉트 후에 오류를 발신자에게 직접 반환하며 이미 문제가있는 서비스를 계속 호출하지 않으므로 발신자를 보호 할 목적으로 달성됩니다. 전체 시스템은 시간 초과로 인한 폭포 연쇄 반응을 경험하지 않습니다.
1. 기본 모드
위의 그림은 회로 차단기 (Curcuit Breaker)의 구조로, 두 개의 기본 상태 (닫고 열린)와 기본 트립 동작이 있습니다.
가까운 상태에서 클라이언트는 장애물없이 회로 차단기를 통해 직접 공급 업체에 서비스를 요청합니다. 공급 업체의 반환 값은 회로 차단기에 의해 클라이언트에게 직접 반환됩니다.
개방 상태에서 클라이언트가 공급 업체에 서비스 요청을 시작한 후 회로 차단기는 요청을 공급 업체로 전송하지 않지만 클라이언트를 직접 반환하면 클라이언트와 공급 업체 간의 경로가 파손됩니다.
여행 : 가까운 상태에서, 공급 업체가 시간이 계속되고 오류가 계속되면 지정된 임계 값에 도달 한 후 회로 차단기에서 트립이 발생하고 회로 차단기 상태가 닫기에서 열려 있습니다.
2. 확장 모드
기본 회로 차단기 모드에서 회로 차단기가 개방 상태에있을 때 회로 차단기가 호출되지 않도록하지만 공급 업체가 서비스를 복원 한 후 회로 차단기를 재설정하기위한 추가 조치도 필요합니다. 실질적인 방법 중 하나는 공급 업체의 서비스가 복원되는지 여부를 정기적으로 감지하고 일단 복원되면 상태가 닫히도록 설정됩니다. 회로 차단기 레트리의 상태는 반쯤 열립니다.
3. 회로 차단기에 행사를 사용하십시오.
공급 업체는 일반적으로 매우 안정적입니다. 일단 실패가 발생하면 검사 및 복구 시간이 오랜 시간이 걸리고 짧은 시간에 빠르게 수리 할 수 없으므로이 서비스는 회로 차단기 모드를 사용하는 데 더 적합합니다. 그렇지 않으면 핑 폰 효과로 이어질 수 있습니다.
3. 회로 차단기는 경우에 적합하지 않습니다.
응용 프로그램이 원격 서비스를 호출하거나 공유 리소스에 액세스하려고하지 않도록하기 위해 작업이 실패 할 가능성이 높으면이 패턴이 적합하지 않을 수 있습니다.
메모리 내 데이터 구조와 같은 로컬 전용 리소스에 액세스하는 응용 프로그램을 처리합니다. 이 환경에서는 일반적으로 적합하지 않으며 회로 차단기를 사용하면 시스템 오버 헤드 만 증가합니다.
다음은 Spring Cloud의 회로 차단기를 사용하는 방법에 대한 직접적인 소개입니다.
SpringCloud Netflix는 Hystrix라는 회로 차단기 라이브러리의 이름을 구현합니다. 마이크로 서비스 아키텍처에는 일반적으로 여러 수준의 서비스 호출이 있습니다. 다음은 마이크로 서비스 아키텍처에서 API를 통해 백엔드 마이크로 서비스에 액세스하는 브라우저의 개략도입니다.
마이크로 서비스 시간 초과의 실패는 폭포 연쇄 반응으로 이어질 수 있습니다. 아래 그림에서 Hystrix는 자율 피드백 회로 차단기를 통해 이런 일이 발생하지 않습니다.
그림의 서비스 B는 어떤 이유로 든 실패하고 사용할 수 없습니다. 모든 서비스 요청 B가 시간을 초과합니다. B 로의 호출이 특정 임계 값에 도달하지 못하면 (5 초 이내에 20 개의 실패가 Hystrix에 의해 정의 된 기본값입니다) 링크는 열린 상태에있게되며 모든 서비스에 대한 통화 B가 실행되지 않으며 대신 회로 차단기가 제공 한 링크를 나타내는 폴백 메시지가 표시되지 않습니다. Hystrix는 개발자 가이 Fallbak 메시지를 정의 할 수있는 해당 메커니즘을 제공합니다.
Open의 링크는 폭포 오류를 차단하여 홍수 또는 잘못된 서비스가 고칠 시간을 가질 수 있도록합니다. 이 폴백은 또 다른 Hystrix 보호 통화, 정적 데이터 또는 법적 널 값일 수 있습니다. 폴백은 체인 구조를 형성 할 수 있으므로 바닥의 다른 비즈니스 서비스를 호출하여 정적 데이터를 반환하는 첫 번째 폴백입니다.
다음으로, 포인트에 도달하여 Hello World 중 하나가 느슨해지지 않도록 이전 두 Hello World 서비스 클러스터에 회로 차단기를 추가하여 시스템이 체인 타임 아웃에 실패했습니다.
1. Maven 프로젝트의 POM.XML에서 회로 차단기를 지원하기 위해 Hystrix 라이브러리를 추가하십시오 (이전 장에서 소개 된 리본 또는 Feign 프로젝트).
<pectionency> <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Hystrix </artifactid> </fectionency>
2. 리본 애플리케이션에서 회로 차단기를 사용하십시오
1). 스프링 부팅 스타트 업 클래스에 @enablecircuitbreaker 주석을 추가하십시오
@springbootApplication@enablecIrcuiteRoveryClient@enableCircuiteRuberPublic Class ServiceribbonApplication {public static void main (String [] args) {springApplication.run (serviceribbonApplication.class, args); }2). @HyStrixCommand 주석으로 서비스에 액세스하는 방법에 주석을 달 수 있습니다
@ServicePublic 클래스 HelloService {@autowired resttemplate resttemplate; @HyStrixCommand (flancbackMethod = "ServiceFailure") public String gethellocontent () {return resttemplate.getForObject ( "http : // service-helloworld/", String.class); } public String ServiceFailure () {return "Hello World Service를 사용할 수 없습니다!"; }}@HyStrixCommand 주석은 gethellocontant () 메소드를 캡슐화하는 회로 차단기를 정의합니다. Service-Helloworld IT 액세스가 임계 값에 도달하지 못하면 Service-Helloworld는 더 이상 호출되지 않습니다. 대신 FallbackMethod로 정의 된 ServiceFailure ()를 반환합니다. @HyStrixCommand 주석에 의해 정의 된 FollbackMethod 메소드를 정의 할 때 특별한주의를 기울여야하는 두 가지 점이 있습니다.
먼저, 반환 값 및 매개 변수 유형의 폴백 메드 유형은 @HyStrixCommand에 의해 주석이 달린 메소드와 정확히 동일해야합니다. 그렇지 않으면 런타임에 예외가 발생합니다. 예를 들어,이 예에서는 ServiceFailure ()의 리턴 값과 gethellocontant () 메소드의 리턴 값은 둘 다 문자열입니다.
둘째, 기본 서비스가 실패하면 FallbackMethod는 @hystrixcommand (이 예에서 GethelloContant)에 의해 주석이 달린 전체 메소드를 대체하지 않고 RestTemplate를 통해 액세스하는 특정 서비스 만 교체하지 않습니다. 시스템 출력에서 실패하더라도 콘솔 출력에 여전히 "Call Service-Helloworld"가 있음을 알 수 있습니다.
유레카 서비스를 시작하고 두 개의 Helloworld 서비스 만 시작한 다음 그 중 하나를 방해하고 (중단 된 마이크로 서비스 중 하나를 시뮬레이션) http : // localhost : 8901/를 방문한 다음 밸런싱으로 인해 다음 두 페이지가 교대로 나타나는 것을 볼 수 있습니다. 두 번째 보류 서비스가 리본에 정의 된 오류 처리 방법으로 대체된다는 것을 알 수 있습니다.
4. Feign Applications에서 회로 차단기를 사용하십시오
1). Feign은 이미 회로 차단기를 지원하므로 리본의 방법에 대해 생각할 필요가 없으며 Spring Boot 스타트 업 클래스에 추가 주석을 추가하십시오.
2). @feignclient 주석으로 폴백 클래스를 추가하십시오. @feignclient에 의해 수정 된 인터페이스를 구현해야합니다.
@feignclient (name = "service-helloworld", follback = helloworldservicefailure.class) public 인터페이스 helloworldservice {@requestmapping (value = "/", method = requestmethod.get) public string sayhello (); }3). helloworldservicefailure 클래스를 만들려면 @feignclient에 의해 수정 된 helloworldservice 인터페이스를 구현해야합니다. 스프링 컨테이너에 콩을 생성하기 위해 @Component 또는 @Service 주석을 추가합니다.
@ComponentPublic Class HelloWorldServiceFailure는 HelloworlDService {@override public string sayhello () {System.out.println ( "Hello World Service를 사용할 수 없습니다!")을 구현합니다. 반품 "Hello World Service를 사용할 수 없습니다!"; }}4). Spring Cloud 이전의 Brixton 버전에서 Feign은 기본적으로 회로 차단기를 자동으로 활성화했지만 최근 Dalston 버전은 기본 구성을 변경하여 금지했습니다.
이유는 https://github.com/spring-cloud/spring-cloud-netflix/issues/1277을 참조하십시오. 이 시점에주의를 기울이십시오. 따라서 Feign에서 회로 차단기를 사용하려면 Application.yml에 다음 구성을 추가해야합니다.
Feign : Hystrix : enabled : true
5). Feign 응용 프로그램을 시작하고 http : // localhost : 8902/hello를 방문하여 리본과 동일한 효과를보십시오.
참조 : http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.