마이크로 서비스에서 우리는 시스템을 여러 서비스 단위로 나누고 각 장치는 서비스 등록 및 구독 소비를 통해 상호 의존적입니다. 그러나 일부 서비스가 문제가 있으면 어떻게됩니까?
예를 들어, ABC (ABC)의 A ABC (Call B 및 B Call C)가 있습니다. 네트워크 지연 또는 C의 코드 문제로 인해 B는 오랫동안 응답을 얻지 못하므로 요청 B 호출 C가 중단되고 대기됩니다.
동시 액세스가 높은 경우, 이러한 현탁 된 스레드를 해제 할 수 없어서 후속 요청이 차단 될 수 없으며 결국 B도 끊어집니다. 유사하게, A가 끊어 질 수 있으며 전체 시스템이 충돌하게됩니다.
전체 문제를 해결하기 위해 Spring Cloud는 회로 차단기 및 스레드 분리와 같은 일련의 보호 기능을 포함하여 서비스 결함 내전 보호에 Hystrix를 사용합니다. 오늘 우리는 Hystrix를 통해 회로 차단기를 구현하는 방법을 살펴 보겠습니다.
1. 스프링 클라우드 hystrix 란 무엇입니까? 회로 차단기 란 무엇입니까?
Spring Cloud Hystrix는 Netflix의 오픈 소스 프레임 워크 인 Hystrix를 기반으로 구현되며 그 목적은 원격 시스템, 서비스 및 제 3 자에 액세스하는 노드를 제어하여 대기 시간 및 실패에 대한 강력한 결함 허용을 제공하는 것입니다.
회로 차단기는 집의 강한 전기 상자에 사용되는 누설 회로 차단기와 유사합니다. 서비스 장치가 실패하면 (전기 기기의 단락과 유사), 회로 차단기의 결함 모니터링 기능 (퓨즈와 유사)을 통해 오류 응답이 발신자에게 반환되어 장기 대기를 피하여 결함이 전체 시스템으로 확산되는 것을 방지합니다.
2. 회로 차단기가 없으면 페이지 표시
스프링 클라우드 소개 시리즈 2 : 서비스 거버넌스 (Eureka/Hello-Service/Hello-Consumer)의 세 가지 서비스를 여전히 기억하십니까? 우리는 이에 따라 실험을 수행합니다.
1. 포트 번호 1111로 유레카 서비스 등록 센터를 시작하십시오.
2. Hello-Service Service 제공 업체를 시작하십시오. 여기서는 포트 번호 9090,9091이 각각 두 가지 서비스를 시작합니다.
3. 포트 번호 9999와 함께 소비자에게 서비스를 제공하기 위해 Hello-Consumer를 시작하십시오. 현재 http : // localhost : 9999/hello-consumer를 여러 번 방문하는 데 아무런 문제가 없습니다.
4. 포트 번호 9091로 서비스를 끄고 http : // localhost : 9999/hello-consumer를 여러 번 방문하면 오류 가보고되었습니다.
추신 : 여기서는 리본을 통한로드 밸런싱을 달성했기 때문에 왜 여러 번 액세스 해야하는지 설명합니다. http : // localhost : 9999/hello-consumer에 액세스하면 hello-service에 액세스하는 두 가지 서비스를 설문 조사 할 것입니다. 포트 번호 9091로 서비스에 액세스 할 때 오류 가보고됩니다. 9090으로 서비스에 액세스하는 데 아무런 문제가 없습니다.
3. 회로 차단기 코드 구현
다음으로 코드를 구현하는 방법을 살펴 보겠습니다. 우리는 서비스 등록 센터 및 서비스 제공 업체를 수정하지 않으므로 서비스 소비자 Hello-Consumer 만 수정하면됩니다.
1. POM 파일을 수정하고 hystrix 종속성을 소개합니다
<project xmlns = "http://maven.apache.org/pom/4.0.0"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance"xsi : schemalocation = "http://maven.apache.org/pom/0.0.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> com.sam </groupid> <artifactid> hello-consumer </artifactid> <sivers> 0.0.1-snapshot> <pares> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트 스타터-팔렌트 </artifactid> <bersion> 1.5.1. release </version> </parent> <properties> <javaversion> 1.8 </javaversion> </properties> <peciplencymanagement> <pelovemencies> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <bersion> camden.sr6 </version> <type> pom </type> <scope> 가져 오기 </scope> </dependency> </speencemanagement> <<sonceptency 관리> <!-eureka client klublencies re->의 <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Eureka </artifactid> </fectionency> <!-리본 의존성을 소개하는 데 사용됩니다. 우리는 여기서 그것을 사용하고 있으며 다른 곳에서 그것을 소개하지 않을 것입니다-> <pectionement> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-ribbon </artifactid> </fexendency> <!-서비스 결함 공차 보호를 구현하기 위해 hystrix 종속성을 소개합니다. <artifactid> Spring-Cloud-Starter-Hystrix </artifactid> </dependency> </dependencies> </project>
2. 시작 클래스를 수정하고 주석을 추가하고 회로 차단기를 활성화하십시오.
@enablediscoveryclient@springbootApplication@enablecircuiteBreakerPublic class consumerapp {// bean은 메소드에 적용되어 메소드 리턴 값을 bean @bean @loadbalanced //@loadbalanced로 설정하는 데 사용됩니다. } public static void main (String [] args) {springApplication.run (consumerapp.class, args); }}현재이 스타트 업 클래스에는 세 가지 주석이 있음을 알 수 있습니다. 이것은 매우 번거 롭지 않습니까? 중요하지 않습니다. @SpringCloudApplication 주석을 사용할 수 있습니다
@SpringCloudApplicationPublic Class ConsumerApp {// bean은 메소드에 적용되며 메소드 리턴 값을 bean @bean @loadbalanced // @loadbalanced로 설정하는 데 사용됩니다. } public static void main (String [] args) {springApplication.run (consumerapp.class, args); }}@SpringCloudApplication = @EnableDiscoveryClient +@springbootApplication +@enablecircuitBreaker, 소스 코드에서 볼 수 있습니다.
@target (elementtype.type) @retention (retentionpolicy.runtime)@documented@inherited@springbootapplication@enablediscoveryclient@enablecircuitebreakerpublic @interface springcloudApplication {}3. ADD 서비스
@ServicePublic Class ConsumerService {@autowired resttemplate resttemplate; @HyStrixCommand (fallbackMethod = "errormsg") public string consumer () {// Hello-Service Service를 호출합니다. 서비스 이름은 특정 IP+Port RestTemplate.getForObject가 아닌 여기에서 사용됩니다. "Hello Consumer Finish !!!"를 반환합니다. } public String errormsg () {return "error !!!"; }}원래 컨트롤러의 RestTemPlate 호출 구현을 서비스에 넣고 @HyStrixCommand를 통해 콜백 메소드를 지정하고 오류가 발생하면이 메소드를 호출합니다.
4. 컨트롤러를 수정하십시오
/** *RESTTEMPLATE는 더 이상 여기에서 직접 호출되지 않지만 *호출 서비스 */ @restControllerPublic Class ConsecerController { @autowired // resttemplate resttemplate; 소비자 서비스 서비스; @requestmapping ( "/hello-consumer") public string helloconsumer () {// // Hello-Service Service를 호출합니다. 서비스 이름은 특정 IP+Port // resttemplate.getForObject가 아니라 여기에서 사용됩니다. return service.consumer (); }}5. 테스트, 다중 방문 및 오류가보고되면 다음 내용이 표시됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.