0%

MSA - 서비스 디스커버리

서비스의 위치를 어떻게 알수있을까?

클라우드 기반에서는 환경에따라 서비스의 위치가 유동적으로 변경될 수 있습니다.

  • 인스턴스의 동적할당
  • 오토 스케일링에 따른 중지 및 복구
1
2
3
4
5
6
7
client | --> service (0.0.0.0)
| --> service (0.0.0.1)
| --> service (0.0.0.2) # Changed ip to 0.0.0.5
| --> service (0.0.0.3) # New one

# 하드코딩된 연결정보가 외부 환경에 의해 변하거나 추가된다.
# 어떻게 대응해야하나??

서비스 디스커버리

따라서 클라이언트가 서비스를 호출할때 해당 서비스위 위치를 알아낼 수 있어야 하는데,
이 문제를 해소해주는것을 “서비스 디스커버리(service discovery)” 라고 합니다.

클라이언트 사이드 서비스 디스커버리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 서비스 구동시 내 서비스 정보를 service registry 에 등록
service (0.0.0.0) -- add(ip, port) --> | service registry
service (0.0.0.1) -- add(ip, port) --> |
service (0.0.0.2) -- add(ip, port) --> |
service (0.0.0.3) -- add(ip, port) --> |


# 클라이언트는 service registry 에서 연결될 서비스 정보를 조회
client | -- 1. Where is service --> | service registry
| <-- 2. return service ip & port -- |


# 클라이언트는 조회된 정보로 서비스 호출
client | --> service (0.0.0.3)

요약

  1. 서비스 인스턴스가 시작될때 service registry 에 서비스 정보를 등록합니다.
  2. service registry 는 이 서비스의 상태를 계속 체크합니다. (health check)
  3. 클라이언트는 service registry 에 연결하고자 하는 서비스를 조회합니다.
  4. service registry 는 연결된 서비스중 하나의 연결을 반환합니다. (load balancing)
  5. 클라이언트는 전달받은 연결정보로 서비스에 연결합니다.
  6. 서비스 인스턴스가 종료되면 service registry 에서는 해당 서비스를 제외합니다.

서버 사이드 서비스 디스커버리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 서비스 구동시 내 서비스 정보를 service registry 에 등록
service (0.0.0.0) -- add(ip, port) --> | service registry
service (0.0.0.1) -- add(ip, port) --> |
service (0.0.0.2) -- add(ip, port) --> |
service (0.0.0.3) -- add(ip, port) --> |


# 클라이언트는 proxy 서버에 요청
client | --> proxy server


# proxy 서버는 service registry 에서 연결될 서비스 정보를 조회
proxy server | -- 1. Where is service --> | service registry
| <-- 2. return service ip & port -- |


# proxy 서버는 조회된 정보로 서비스 호출
proxy server | --> service (0.0.0.3)

클라이언트 사이드 방식과 유사하지만 중간에 proxy 서버를 통해 서비스에 연결합니다.
이 방식의 특징은 클라이언트가 service registry 를 몰라도 되고 따로 구현할 필요가 없다는 점입니다.

service registry

모든 연결정보를 들고있는 서비스입니다.
연결될 서비스정보를 조회하고 체크해야하므로 고가용성이 요구됩니다.

service discovery 를 제공하는 오픈소스들

zookeeper
https://coding-start.tistory.com/66

consul
https://www.consul.io/

etcd
https://etcd.io/

Eureka
https://coe.gitbook.io/guide/service-discovery/eureka