Zookeeper
- Apache 재단 오픈소스 프로젝트
- 구성 정보 유지 관리,분산 동기화 제공하고 그룹 서비스를 제공하는 중앙 집중식 서비스
- Apache 내부 프로젝트 중 동물(hadoop, pig, hive) 을 zookeeper(사육사)가 관리 해준다는 의미?
- 디자인 목표
- 간단하게 설계
- 복제
- 서버들끼리 연결되어 서로 데이터가 복제
- 순서 존재
- 업데이트 순서 기록, 기록된 숫자 주키퍼 트랜잭션에 사용(이를 통해 동기화가 가능)
- 빠른 속도
- Server
- 설정
- 최신 버전 다운로드
- 프로젝트 폴더 내 jar 파일 이용하여 Standalone 방식으로 동작 가능
- 설정 파일 생성
- conf/zoo.cfg
- tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
- tickTime
- ZooKeeper에서 사용하는 기본 시간 단위 (milliseconds)
- 하트 비트를 수행하는 데 사용
- dataDir
- 메모리 내 데이터베이스 스냅 샷 저장할 위치
- clientPort
- client 연결을 대기하는 포트
- server start
- java -cp zookeeper-3.4.13.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg
- Client
- https://start.spring.io 에서 프로젝트 다운로드
- 다운 받은 프로젝트 내 application.properties 혹은 application.yml정보 설정
- server.port: 8080
spring.application.name: libqa-client
spring:
cloud:
zookeeper:
connect-string: localhost:2181
- build.grale 수정
- dependencies {
compile('org.springframework.cloud:spring-cloud-starter-zookeeper-all') {
exclude group: 'org.apache.zookeeper', module: 'zookeeper'
}
compile('org.apache.zookeeper:zookeeper:3.4.12') {
exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
- client start
- 다중 client 확인을 위해서 client project 복사
- howling-client application.yml 수정
- server.port: 8081
spring.application.name: howling-client
spring:
cloud:
zookeeper:
connect-string: localhost:2181
- server.port: 8082
spring.application.name: howling-client
spring:
cloud:
zookeeper:
connect-string: localhost:2181
- service discovery 테스트
- @GetMapping("/callHowling/{applicationIndex}")
public String callHowling(@PathVariable Integer applicationIndex) {
List<ServiceInstance> clients = discoveryClient.getInstances("howling-client");
String uri = clients.get(applicationIndex).getUri().toString();
String requestUrl = uri + "/howling";
this.discoveryClient.getServices().forEach(client ->
System.out.println(client));
ResponseEntity<String> stockResponse =
restTemplate().exchange(requestUrl, HttpMethod.GET, null, new ParameterizedTypeReference<String>() {});
return stockResponse.getBody();
}
eureka와 zookeeper 다른점eureka는 client의 spring.application.name이 host 정보라서 찾을수 있음zookeeper는 discoveryClient.getInstances("howling-client") 방식으로 spring.application.name으로 service를 찾아야함
- 상위 문제점 해결
- 설정의 문제
- 위치
- @Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
- annotation
- @Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableFeignClients
- @SpringBootApplication
@EnableDiscoveryClient
참고 : https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_designGoals
https://zookeeper.apache.org/doc/current/zookeeperStarted.html
https://github.com/yongpwi/spring-cloud-zookeeper-client
https://github.com/yongpwi/spring-cloud-zookeeper-client2
https://github.com/yongpwi/spring-cloud-zookeeper-client3