spring 의 CloudNetflix Hystrix 탄성 클 라 이언 트 알 아 보기

1.왜 클 라 이언 트 탄성 모드 가 있어 야 합 니까?
모든 시스템 이 고장 이 나 고 분포 식 시스템 의 단일 고장 확률 이 높다.응용 프로그램 을 어떻게 구축 하여 고장 에 대처 하 느 냐 가 모든 소프트웨어 개발 자 들 이 일 하 는 관건 적 인 부분 이다.그러나 통상 적 으로 시스템 을 구축 할 때 대부분의 엔지니어 들 은 인 프 라 시설 이나 관건 적 인 서비스 가 철저하게 고장 나 는 것 을 고려 하고 집단 관건 적 인 서버,서비스 간 의 부하 균형 과 타지 배치 등 기술 을 사용한다.비록 이러한 방법 들 은 구성 요소 시스템 의 철저한 고장 을 고려 했 지만,그들 은 탄성 시스템 을 구축 하 는 일부분 의 문 제 를 해결 했다.서비스 가 붕 괴 될 때 이 서비스 와 실 효 를 쉽게 감지 할 수 있 기 때문에 응용 프로그램 은 이 를 용서 할 수 있 습 니 다.그러나 서비스 운행 이 느 릴 때 이 서비스 성능 이 점점 낮 아 지고 돌아 가 는 것 이 매우 어렵 습 니 다.다음 과 같은 몇 가지 원인 때 문 입 니 다.
4.567917.서비스의 등급 강 하 는 간헐 적 인 고장 으로 시작 하여 되 돌 릴 수 없 는 추 세 를 형성 할 수 있 습 니 다.-시작 은 일부 서비스 호출 이 느 려 지고 갑자기 응용 프로그램 용기 가 스 레 드(모든 스 레 드 가 호출 이 완료 되 기 를 기다 리 고 있 습 니 다)가 소 진 될 때 까지 완전히 무 너 질 수 있 습 니 다4.567917.응용 프로그램의 일반적인 디자인 은 원 격 자원 의 철저한 고장 을 처리 하 는 것 이지 일부 등급 이 내 려 가 는 것 이 아니다.-보통 서비스 가 완전히 죽지 않 으 면 응용 프로그램 은 자원 이 다 떨 어 질 때 까지 이 서 비 스 를 계속 호출 할 것 이다성능 이 비교적 나 쁜 원 격 서 비 스 는 매우 큰 잠재 적 인 문 제 를 초래 할 수 있다.그들 은 검 측 하기 어 려 울 뿐만 아니 라 연쇄 반응 을 일 으 켜 전체 응용 프로그램의 생태 시스템 에 영향 을 줄 수 있다.적절 한 보호 조치 가 없 으 면 성능 이 좋 지 않 은 서 비 스 는 응용 프로그램 전 체 를 신속하게 무 너 뜨 릴 수 있다.클 라 우 드 를 바탕 으로 마이크로 서 비 스 를 바탕 으로 하 는 응용 프로그램 은 특히 이런 유형의 단말기 의 영향 을 받 기 쉽다.이런 응용 은 대량의 세분 화 된 분포 식 서비스 로 구성 되 기 때문에 이런 서 비 스 는 사용자 의 업 무 를 완성 할 때 서로 다른 인 프 라 시설 과 관련된다.
2.클 라 이언 트 탄성 모드 가 무엇 입 니까?
클 라 이언 트 탄성 모드 는 원 격 서비스 에 오류 가 발생 하거나 좋 지 않 을 때 원 격 자원(다른 마이크로 서비스 호출 또는 데이터 베이스 조회)을 보호 하 는 것 입 니 다.이러한 모델 의 목 표 는 클 라 이언 트 가'빠 른 실패'를 하고 데이터 베이스 연결,스 레 드 탱크 와 같은 자원 을 소모 하지 않 으 며 원 격 서비스 문제 가 클 라 이언 트 소비자 에 게 전파 되 는 것 을 피하 고'눈사태'효 과 를 일 으 키 는 것 이다.spring cloud 는 주로 네 가지 클 라 이언 트 탄성 모드 를 사용 합 니 다.
클 라 이언 트 부하 균형(client load balance)모드
차단기(circuit breaker)모드
이 모드 는 회로 의 차단기 를 모방 한 것 이다.소프트웨어 차단기 가 있 으 면 원 격 서비스 가 호출 될 때 차단기 가 이 호출 을 감시 하고 호출 시간 이 너무 길 면 차단기 가 개입 하여 호출 을 중단 합 니 다.또한 원 격 자원 에 대한 호출 실패 횟수 가 특정한 한도 값 에 이 르 면 빠 른 실패 전략 을 사용 하여 앞으로 실 패 된 원 격 자원 을 호출 하 는 것 을 막 을 것 입 니 다.
예비(fallback)모드
원 격 호출 에 실 패 했 을 때 대체 코드 경 로 를 실행 하고 이상 이 발생 하지 않 고 다른 방식 으로 작업 을 처리 하려 고 합 니 다.간단하게 이상 을 던 지 는 것 이 아니 라 원 격 조작 에 응급 조 치 를 제공 하 는 것 이다.
격벽(bulkhead)모드
격벽 모델 은 조선 의 기초 개념 에 세 워 진 것 이다.우 리 는 배 한 척 이 여러 개의 수밀 선(선창 벽)으로 나 눌 수 있다 는 것 을 알 고 있 기 때문에 소수의 몇 개의 부위 가 누수 되 더 라 도 배 전체 가 침수 되 지 는 않 을 것 이다.이 개념 을 원 격 호출 에 가 져 옵 니 다.모든 호출 이 같은 스 레 드 풀 로 처리 된다 면 느 린 원 격 호출 이 프로그램 전 체 를 무 너 뜨 릴 수 있 습 니 다.격벽 모드 에서 모든 원 격 자원 을 격 리 하고 각자 의 스 레 드 탱크 를 분배 하여 서로 영향 을 주지 않도록 할 수 있다.
다음 그림 은 이러한 모델 이 마이크로 서비스 에 어떻게 활용 되 는 지 보 여 준다.

3.spring cloud 에서 사용
넷 플 릭 스 의 하 이 스 트 릭 스 라 이브 러 리 를 사용 하여 상기 탄성 모드 를 실현 합 니 다.이전 항목 을 계속 사용 하여 licensingservice 서비스 에 탄력 적 인 모델 을 구현 합 니 다.
1.코드 수정
도입 에 의존 하 다
먼저 POM 파일 을 수정 하고 다음 두 개의 의존 도 를 추가 합 니 다.

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!--        ,spring-cloud-starter-hystrix    ,   Camden.SR5        1.5.6,             ,            java.lang.reflect.UndeclaredThrowableException   com.netflix.hystrix.exception.HystrixRuntimeException,
             -->
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.9</version>
</dependency>
그리고 시작 클래스 에@EnableCurction Breaker 를 추가 하여 Hystrix 를 사용 합 니 다.
2.차단기 실현
먼저 organizationservice 프로젝트 의 OrganizationController 를 수정 합 니 다.아 날로 그 지연 은 두 번 마다 스 레 드 sleep 를 2 초 간격 으로 합 니 다.

@RestController
public class OrganizationController {
private static int count=1;
@GetMapping(value = "/organization/{orgId}")
public Object getOrganizationInfo(@PathVariable("orgId") String orgId) throws Exception{
if(count%2==0){
TimeUnit.SECONDS.sleep(2);
}
count++;
Map<String, String> data = new HashMap<>(2);
data.put("id", orgId);
data.put("name", orgId + "  ");
return data;
}
}
방법 에@Hystrixcand 를 추가 하면 시간 초과 단락 을 실현 할 수 있 습 니 다.Spring 에서 이 주석 클래스 를 검색 하면 동적 으로 대 리 를 생 성하 여 이 방법 을 포장 하고 원 격 호출 을 처리 하 는 스 레 드 풀 을 통 해 이 방법 에 대한 모든 호출 을 관리 합 니 다.
licensingservice 서비스 에 있 는 OrganizationByRibbonService,OrganizationFeignClient 를 수정 하여 그 방법 에@Hystrixcand 의 주 해 를 추가 합 니 다.
그 다음 에 인터페이스 localhost:10011/licensingByRibbon/11313,localhost:10011/licensingByFeign/11333 을 방문 합 니 다.여러 번 방문 하면 오류 com.netflix.hystrix.exception.HystrixRuntime Exception 을 던 지 는 것 을 발견 할 수 있 습 니 다.차단기 가 유효 합 니 다.기본 적 인 상황 에서 시간 은 1s 입 니 다.

{
"timestamp": 1543823192424,
"status": 500,
"error": "Internal Server Error",
"exception": "com.netflix.hystrix.exception.HystrixRuntimeException",
"message": "OrganizationFeignClient#getOrganization(String) timed-out and no fallback available.",
"path": "/licensingByFeign/11313/"
}
주해 파 라 메 터 를 설정 하여 시간 을 수정 할 수 있 습 니 다.시간 초과 시간 을 2s 이상 설정 하면 시간 오 류 를 알 리 지 않 습 니 다.(Feign 설정 이 왜 실 패 했 는 지 모 르 겠 습 니 다.ribbon 에 서 는 정상 입 니 다.)일반적으로 설정 파일 에 설정 을 씁 니 다.

@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "20000")
})
3.예비 처리
원 격 자원 의 소비자 와 자원 자체 에'중개인'이 존재 하기 때문에 개발 자 는 서비스 고장 을 차단 하고 대체 방안 을 선택 할 수 있다.Hystrix 에서 예비 처 리 를 하면 쉽게 이 루어 집 니 다.
1.ribbon 에서 의 실현
@Hystrixcand 주석 에 속성 fallback Method="methodName"을 추가 하면 실행 에 실 패 했 을 때 예비 방법 을 실행 합 니 다.방비 방법 은 보호 되 는 방법 과 같은 종류 에 있어 야 하 며,방법 서명 은 반드시 같 아야 한다.licensingservice 에서 service 가방 에 있 는 OrganizationByRibbon Service 류 를 다음 과 같이 변경 합 니 다.

@Component
public class OrganizationByRibbonService {
private RestTemplate restTemplate;
@Autowired
public OrganizationByRibbonService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
},fallbackMethod = "getOrganizationWithRibbonBackup")
public Organization getOrganizationWithRibbon(String id) throws Exception {
ResponseEntity<Organization> responseEntity = restTemplate.exchange("http://organizationservice/organization/{id}",
HttpMethod.GET, null, Organization.class, id);
return responseEntity.getBody();
}
public Organization getOrganizationWithRibbonBackup(String id)throws Exception{
Organization organization = new Organization();
organization.setId("0");
organization.setName("        ");
return organization;
}
}
응용 프로그램 을 시작 합 니 다.localhost:10011/licensingByRibbon/1133/를 여러 번 방문 하면 호출 에 실 패 했 을 때 예비 방법 을 사용 합 니 다.
2.feign 에서 실현
feign 에서 예비 모드 를 실현 하려 면 feign 인터페이스의 실현 클래스 를 작성 한 다음 feign 인터페이스 에서 이 클래스 를 지정 해 야 합 니 다.licensingservice 를 예 로 들 면.먼저 client 패키지 에 Organization FeignClient Impl 류 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.

@Component
public class OrganizationFeignClientImpl implements OrganizationFeignClient{
@Override
public Organization getOrganization(String orgId) {
Organization organization=new Organization();
organization.setId("0");
organization.setName("         ");
return organization;
}
}
그리고 OrganizationFeignClient 인터페이스의 설명 을 수정 하고@FeignClient("organizationservice")를@FeignClient(name="organizationservice",fallback=OrganizationFeignClient Impl.class 로 변경 합 니 다.
프로젝트 를 다시 시작 하고 localhost:10011/licensingByFeign/11333/를 여러 번 방문 하면 예비 서비스 가 작 동 하 는 것 을 발견 할 수 있 습 니 다.
예비 서 비 스 를 사용 할 지 여 부 를 확인 할 때 다음 두 가 지 를 주의해 야 합 니 다.
4.567917.예비 비 는 자원 체조 시 또는 실패 시 행동 방안 을 제공 하 는 체제 이다.백업 으로 체 조 를 캡 처 한 후 로그 기록 만 한다 면 try.catch 만 있 으 면 됩 니 다.HystrixRuntime Exception 이상 을 캡 처 할 수 있 습 니 다4.567917.예비 방법 에 따라 실 행 된 조작 에 주의 하 세 요.예비 서비스 에서 다른 분포 식 서 비 스 를 호출 하려 면@Hystrixcand 방법 으로 포장 예비 방법 을 주석 해 야 합 니 다4.격벽 모델 실현
마이크로 서 비 스 를 기반 으로 하 는 응용 프로그램 에 서 는 보통 여러 개의 마이크로 서 비 스 를 호출 하여 특정한 임 무 를 수행 해 야 합 니 다.격벽 이 적용 되 지 않 는 모드 에서 이 호출 은 기본적으로 같은 스 레 드 를 사용 하여 호출 을 수행 합 니 다.이 스 레 드 는 전체 자바 용기 의 요청 을 처리 하기 위해 예약 되 어 있 습 니 다.따라서 대량의 요청 이 존재 하 는 상황 에서 한 서비스 에 성능 문제 가 발생 하면 자바 용기 안의 모든 스 레 드 가 점용 되 고 새로운 요청 을 막 아 용기 가 완전히 무 너 질 수 있 습 니 다.
Hystrix 는 스 레 드 풀 을 사용 하여 원 격 서비스 에 대한 모든 호출 을 위임 합 니 다.기본 적 인 상황 에서 이 스 레 드 풀 은 10 개의 작업 스 레 드 가 있 습 니 다.그러나 이렇게 하면 운행 이 느 린 서비스 가 모든 라인 을 차지 하기 쉽다.모든 Hstrix 는 사용 하기 쉬 운 메커니즘 을 제공 하고 서로 다른 원 격 자원 호출 간 에'격벽'을 만들어 서로 다른 서비스의 호출 을 서로 다른 라인 탱크 에 격 리 시 켜 서로 영향 을 주지 않 게 한다.
격 리 된 스 레 드 풀 을 구현 하려 면@Hystrixcand 에 스 레 드 풀 의 주 해 를 추가 해 야 합 니 다.여 기 는 ribbon 을 예 로 들 면(Feign 유사)입 니 다.licensingservice 에서 service 가방 에 있 는 Organiziton ByRibbon Service 류 를 수정 하고 getOrganization With Ribbon 방법의 주 해 를 다음 과 같이 바 꿉 니 다.

@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
}, fallbackMethod = "getOrganizationWithRibbonBackup",
threadPoolKey = "licenseByOrgThreadPool",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "10")
})
max QueueSize 속성 값 을-1 로 설정 하면 SynchronousQueue 를 사용 하여 모든 입력 요청 을 저장 합 니 다.동기 화 대기 열 은 처리 중인 요청 수량 이 스 레 드 탱크 의 크기 를 초과 하지 않도록 강제 합 니 다.1 이상 의 값 으로 설정 하면 링크 드 BlockingQueue 를 사용 합 니 다.
메모:예제 코드 에 서 는 하 드 인 코딩 속성 값 이 Hystrix 주석 에 있 습 니 다.실제 응용 환경 에서 일반적으로 설정 항목 을 Spring Cloud Config 에 설정 하여 통일 적 으로 관리 할 수 있 습 니 다.
이번 에는 모든 코드 를 사용 합 니 다클릭 하여 점프
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기