2020년 6월 27일 토요일

Spring boot Eureka 해보자

Spring boot Cloud Eureka 

마이크로서비스에서 다수의 서버들에 대한 정보를 관리하는게 필요하다. 유레카가 그거다. 유레카서버를 두고 각 클라이언트들이 유레카서버에 등록하면 된다.
스프링부트에서는 의존성추가해서 서버-클라이언트 지정하면 끝. 노드제이에스 같은경우 라이브러리로 가능.

유레카 서버는 음..그냥 현재 클라우드에 구성된 하위 마이크로 서비스들에 대한 구성값을 저장할 뿐이다. 사용자의 요청에 따른 라우팅 , 또는 로드밸런싱을 위해서는 Zuul 서비스를 연동한다.

유레카 서버는 30초마다 등록된 클라이언트에 핑을 보내서 이용가능한 서비스인지 확인하다. 로드밸런싱을 위해 리본(클라이언트 로드밸런서?) 를 사용한다.

1. Spring boot Cloud Eureka Server
의존성과 포트 설정만 지정하면 일단 서버 기동은 끝. 스프링부트 정말 좋다.
- spring initializr 사이트에서 eureka 의존성 추가해서 프로젝트 생성, web도 추가.
다른언어로 개발됬거나 별도로 디스커버리서버(유레카 서버가 들고 있는정보) 가 필요할때는 제공되는 유레카 API를 이용한다.
( /eureka/apps, euraka/instance 등등..)

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

- application.yml 에 서버 설정
server:
port: 8761 <-- 포트는 맘대로 보통 8761 인가보다

# -- Eureka
eureka:
instance:
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka: false <-- 서버자신이 유레카에 등록할지를 결정, 지가 서버이면서 클라이언트도 가능
fetch-registry: false <-- 클라이언트들이 로컬에 서버로부터 받은 클라이언트리스트정보를 로컬에 캐싱할지 결정 server: enable-self-preservation: false <-- true일때는 클라이언트가 죽어도 서버에서 죽지 않은걸로 인식, 보통 false 다

- application에 유레카 서버라고 설정
@EnableEurekaServer
@SpringBootApplication
public class DemoApplication {

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

}
이제 서버주소만 입력해도 정보가 출력된다. 유레카!
** resource 밑에 static, template가 있으면 화이트 지랄 화면이 보인다. 폴더 지우고 리빌드 하고 실행.
여러대의 서버에서 구성하고자 할떄는
spring:
profiles: default
application:
name: eureka-server-clustered
server:
port: 8761
eureka:
instance:
hostname: 192.168.0.103
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://192.168.0.106:8761/eureka/,http://192.168.0.107:8761/eureka/
식으로 디폴트존을 여러개(서로 얽히게끔) 둔다. 일단 peer-to-peer 라고 서버상태를 전부 복제하는 방식이다.
https://projects.spring.io/spring-cloud/spring-cloud.html#_peer_awareness



2. Spring boot Cloud Eureka Client
유레카 클라이언트 의존성을 추가하고 actuator 도 의존성 추가필요. 액튜에이터가 있어야 서버가 클라이언트의 상태를 파악하지.
유레가 서버가 heartbeat 를 보내주는데, 클라이언트가 이를 못받으면 유레카서버는 클라이언트를 삭제한다.
클라이언트는 서버로부터 레지스트리(클라이언트목록)을 캐싱하고 주기적으로 변경사항을 점검한다
- 일단 의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

- application.yml 생성
server:
  port: ${PORT:8081}

spring:
  application:
    name: ${NAME:customerservice} <-- 같은 서비스를 여러개(여러서버)를 두고 서비스하고 싶을떄는 이름을 같게 하면
유레카에서 같은 이름끼리 묶어서 표시한다. 이를 zuul등에서 같은 service-id (serviceId: customerservice) 로 지정하면 라운드로빈 방식으로 서버를 돌아가며 요청한다. 따라서 같은 이름의 서비스서버중 1번 서버에는 출력'가'로 되는데, 2번 서버에는 출력'나'로 되어있으면 가->나->가->나..순으로 데이터가 표시된다.

eureka:
  client:
    serviceUrl:
    defaultZone: ${EUREKA_URL:http://127.0.0.1:8761/eureka/}
    enabled: true
  instance:
    preferIpAddress: true

- 애플리케이션이 유레카 클라이언트라고 지정
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaclientApplication {

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

}
- 이제 유레카 서버페이지에 접속해서 새로고침하면 실행중인 클라이언트 목록이 보인다. 클라이언트의 스타터스를 클릭하면 클라이언트의 액튜에이터 정보페이지가 열린다.
- java -jar -DPORT=8082 -DNAME=taeho  eurekaclient-0.0.1-SNAPSHOT.jar


참고 떙큐
https://projects.spring.io/spring-cloud/spring-cloud.html#_peer_awareness
https://lion-king.tistory.com/12?category=855644
https://coe.gitbook.io/guide/service-discovery/eureka 
https://develop-yyg.tistory.com/5
https://jinhyy.tistory.com/52 <-- 위에게시물을 복불한곳 , 개념이 없는건지....

0 comments:

댓글 쓰기