일반적인 Discovery Service의 작동 모습입니다.  마이크로 서비스에서 이러한 기능이 필요한 이유는 간단합니다.

운영중에 API 를 탄력적으로 늘리고 줄인다고 해봅시다.  Discovery Service는 이것을 감지하여 환경설정의 조정없이 유연하게

사용자에게 서비스를 계속 제공해줄수 있으며,  이것은 장애 상황에서도 유용합니다.  제공 서비스의 노드가 갑자기 Down되었다고

해봅시다. 그러면 DiscoveryService는 이것을 감지하고 접근을 차단합니다.


여기서는 유레카라는 Discovery Service를 Spring Boot에서 간단하게 사용해보겠습니다.

작동 샘플 : http://git.webnori.com/projects/SB2/repos/springcloud/browse/eureka-serviceregistry

서버설정

application.properties
server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
pom.xml
<!-- Eureka Server -->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application
@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceregistryApplication {

   public static void main(String[] args) {
      SpringApplication.run(EurekaServiceregistryApplication.class, args);
   }
}


클라이언트 설정

application.properties
spring.profiles.active=local

spring.application.name=lobbyapi
# N.B. this is the default:

# 앞장에서 설정한 콘피그 서버 Url입니다.
spring.cloud.config.uri=http://localhost:8888

management.security.enabled=false

pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application
@EnableDiscoveryClient
@SpringBootApplication
public class LobbyapiApplication {

   public static void main(String[] args) {
      SpringApplication.run(LobbyapiApplication.class, args);
   }
}

로컬개발환경

언젠가는 이 로컬환경을 도커에 집약 시킬것이지만, 로컬 장비에서 모든것을 확인하려면

구성소의 서버를 여러대 띄워야합니다.

  • configservice : 환경서버로 여기에 유레카 정보를 등록할것입니다.
  • eureka : 디스커버리서버입니다.
  • someapi : api를 여러대 띄워 유레카에서 감지하는지 확인 할것입니다.


lobbyapi.yml
---
spring:
  profiles: local
  
server:
  port: 9000

eureka:
    instance:
        prefer-ip-address: true
        ip-address: 127.0.0.1

message: "hello, spring cloud -local"
---
spring:
  profiles: local2
  
server:
  port: 9001

eureka:
    instance:
        prefer-ip-address: true
        ip-address: 127.0.0.1

message: "hello, spring cloud -local"

---

일반적으로 동일한 기능의 API는 한가지 동일한 포트에 다른 노드에 뛰우지만, 로컬환경에서는 동일노드에

다른 포트로 띄우는 시도를 하였습니다.

  • 1노드 UP : mvn spring-boot:run -Dspring.profiles.active="local"

  • 2노드 UP : mvn spring-boot:run -Dspring.profiles.active="local2"

중앙 설정 : http://git.webnori.com/projects/SB2/repos/cloudconfig/browse


유레카 실행화면

URL : localhost:8761

유레카 서비스는 간단한 모니터링 페이지를 제공해줍니다. 물론 모니터링이 주요 기능이 아니며

이것을 이용하는 서비스는 단지 어떠한 API (여기서는 LOBBYAPI)를 호출하기위해  9000포트에 뛰웠는지 9001포트에 뛰웠는지 

신경쓸필요가 없습니다. 또한 로컬IP정보를 알필요가 없습니다. 어떠한 유레카 존에 조인이 되었는지만 확인하면 되며   

Rest("LOBBYAPI").GET("/ABC") 와 같이 어플리케이션 이름으로만 로드밸런스가 되는 API를 호출할수가 있습니다.

어떻게 RestAPI 호출이 단순한 네임으로 가능하게되는지 다음장에서 살펴보도록 하겠습니다.


참고링크:


  • No labels