Spring Cloud Netflix Eureka
Service Discovery
- 마이크로서비스의 정보(위치 등)을 등록할 수 있음
- 외부의 요청이나 서비스가 마이크로서비스의 정보를 검색하기 위해 사용됨
- 이게 Eureka임
Eureka의 구성요소
- Service Discovery : 외부에서 마이크로서비스를 찾아주는 기능
- Service Registry : 각각의 서비스가 자신의 위치 정보를 특정 서버에 등록하는 작업
Eureka Service Discovery - 프로젝트 생성
Maven으로 진행
강의와 다르게 버전은 현재에 맞게 선택했다.
- Dependencies 등록
- Spring Could Discovery > Eureka Server 선택
Spring Boot 버전도 현재에 맞게 선택했다.
(다른 프로젝트는 강의와 동일하게 바꿔주었다. 버전 2.4.2)
📌 MVN REPOSITORY (https://mvnrepository.com/)
• Apache Maven 빌드 도구를 사용하는 프로젝트에서 종속성(라이브러리)을 관리하기 위한 중앙 저장소이다.
• Maven Repository에 많은 라이브러리와 프로젝트에서 사용하는 여러 종속성들이 호스팅되어 있다.
• 다양한 Dependencies를 추가하고 싶으면 복사해 와서 pom.xml에 붙여넣기해서 쓰면 된다.
- application.properties → application.yml 수정
properties 예시
- key-value형식
# Sample properties file
# Database Configuration
db.url=jdbc:mysql://localhost:3306/mydatabase
db.username=admin
db.password=secretpassword
# Server Configuration
server.port=8080
server.host=localhost
yml파일
server:
port: 8761
spring:
application:
name: discoveryservice // 마이크로 서비스에 고유한 id 부여
eureka:
client:
register-with-eureka: false // 레지스트리에 자신을 등록할 건지에 대한 여부
fetch-registry: false
register-with-eureka: false (디폴트 true)
- 레지스트리에 자신을 등록할 건지에 대한 여부
fetch-registry: false (디폴트 true)
- 레지스트리에 있는 정보를 가지고 올건지에 대한 여부
- true설정 시 검색할 때마다 Eureka server를 호출 대신 레지스트리가 로컬로 캐싱
❓ 서버를 돌리고 있는데 왜 클라이언트 설정이 필요한가?
유레카 라이브러리가 포함된 채 스프링부트가 기동이 되면 기본적으로 유레카 클라이언트 역할로서 어딘가에다가 등록하는 작업을 시도한다.
기본적으로 ture로 설정이 되기 때문에 현재 작업하고 있는 것을 클라이언트 역할로서 전화번호부에 등록하듯이 자신의 정보를 자신한테 등록하는 의미가 없는 작업이 된다.
그래서 false로 지정한다.
다시말해서, 유레카 서버 자체는 기동을 하되 자기 자신의 정보를 외부에 있는 다른 마이크로 서비스가 유레카 서버로부터 어떤 정보를 주고받는 역할을 할 필요가 없기 때문에 자기자신을 등록하지 않는다.
그냥 서버로서 기동만 되면 된다.
DiscoverserviceApplication.java 수정
@EnableEurekaServer
이 어노테이션에 의해 이 프로젝트가 EurekaServer가 된다.
@SpringBootApplication
@EnableEurekaServer // 이 어노테이션으로 유레카 서버의 역할로서 서버로 역할을 해서 스프링 부트에 의해 기동
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
서버 실행 후, 127.0.0.1:8761 또는 ip:8761로 접속하면 Eureka의 대시보드를 확인할 수 있다.
📌 localhost vs. 127.0.0.1 vs. 192.168.0.105
📌 localhost (= 127.0.0.1 )
localhost는 호스트 이름으로, 컴퓨터 자체를 나타냅니다.대부분의 운영 체제에서 localhost는 127.0.0.1로 매핑되어 있습니다.로컬 루프백 주소로, 컴퓨터 자체에서 동작 중인 서비스에 접근할 때 사용됩니다.
📌 127.0.0.1 (= localhost)
127.0.0.1은 로컬 루프백 주소로, 컴퓨터 자체를 나타냅니다.로컬 네트워크에서 사용되며, 외부에서는 접근할 수 없습니다.
📌 192.168.0.105
192.168.0.105는 로컬 네트워크에서 사용되는 IPv4 주소입니다.이 주소는 컴퓨터가 로컬 네트워크에 연결되어 있을 때, 로컬 네트워크의 다른 장치들과 통신할 때 사용됩니다.외부에서는 이 주소를 통해 해당 컴퓨터에 직접 접근할 수 없습니다.
User Service - 방법1) 프로젝트 생성
1. 프로젝트 생성
Maven 사용
- Spring Boot 버전
Spring Boot 버전은 사진에서는 3.2.1로 만들었지만,
@EnableEurekaServer이 사용이 안되어 pom.xml에서 수동으로 강의와 버전을 맞춰주었다.(버전 2.4.2)
- dependencies등록
- Spring Boot DevTools
- Lombok
- Spring Web
- Eureka Discovery Client
UserServiceApplication.java 수정
@SpringBootApplication
@EnableDiscoveryClient // 서비스 디스커버리 어노테이션, 이거 추가!
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
@EnableDiscoveryClient (일반적으로 이걸 사용!)
- 스프링 클라우드에서 제공하는 일반적인 서비스 디스커버리 어노테이션
- Eureka 뿐만 아니라 다른 서비스 디스커버리 시스템들도 지원
- Consul, Zookeeper, etcd 등과 같은 다양한 백엔드 디스커버리 시스템을 사용
- 따라서 애플리케이션이 Eureka 뿐만 아니라 다른 디스커버리 시스템과도 통합 가능
- spring-cloud-common을 기반으로 한다.
@EnableEurekaClient
- @EnableDiscoveryClient의 서브셋으로, 주로 Eureka 서비스 디스커버리에 특화
- 애플리케이션이 오직 Eureka 서버와만 통합되어야 하는 경우에 사용
- DiscoveryClient를 구현해서 상품화 시켜 놓은 것
- spring-cloud-netfliex를 기반으로 한다.
일반적으로는 @EnableDiscoveryClient를 사용하여 애플리케이션을 다양한 서비스 디스커버리 시스템과 통합할 수 있게 하는 것이 권장된다. 그러나 Eureka만을 사용하고자 하는 경우에는 @EnableEurekaClient를 사용한다.
application.properties → application.yml로 수정
# 현재 프로젝트의 포트 번호 지정
server:
port: 9001
# 현재 프로젝트의 이름 지정
spring:
application:
name: user-service
# 현재 프로젝트의 eureka 설정
eureka:
client:
register-with-eureka: true # eureka 등록 여부
fetch-registry: true # eureka 서버로부터 인스턴스들의 정보를 주기적으로 가졍로 것인가
service-url: # 서버의 위치가 어디인지 항목을 지정.. 유레카 서버의 위치 폴더 지정..
defaultZone: http://127.0.0.1:8761/eureka # 이 곳에 마이크로서비스 정보를 등록하겠다.
DiscorveryService와 UserService 서버를 모두 실행 시킨 후,
127.0.0.1:8761 또는 ip:8761로 접속하면 USER-SERVICE로 등록된 것을 Eureka의 대시보드에서 확인할 수 있다.
pom.xml에서 등록해준 정보대로 뜬다.
USER-SERVICE : 현재 프로젝트 이름
UP : 등록됨
9001 : 현재 port번호
User Service 등록 - 동시에 여러 개 실행하기
2. 방법2) User Service 동시에 여러 개 실행하기 - Edit Cofigurations 설정 방법
우측 상단에서 Edit Configurations 클릭
copy버튼을 누르고 이름 변경
바로 실해하면 이런 오류가 뜨게된다.
기존에 만들었던 포튼가 9001이기 때문이다. 포트 번호가 중복되기 때문에 포트 번호를 바꿔주어야 한다.
다시 Edit Configrations로 돌아와서 Modify options를 클릭하고 VM Option을 추가해준다.
VM Option에서 포트 번호를 새롭게 지정해준다.
-Dserver.port=9002
-D : 옵션 추가
VM옵션에서 java클래스를 실행함에 있어서 부가적인 파라미터 옵션을 부여할 때 사용할 수 있는 방법이다.
이런 방법은 서버 자체 코드가 변경되는 것이 아니기 때문에 매번 실행할 때마다 포트값을 달리해서 지정 가능..
따라서 한 번 작성되어진 코드가 다시 빌드되고 다시 배포되어야 하는 과정이 아니라 서버를 기동하는 방법에 의해서 서버를 기동할 때 부가적인 이 파라미터를 전달함으로써 동적으로 변경될 수있는 서버 포트를 지정할 수 있다는 특징을 가지고 있다.
3. 방법3) User Service 동시에 여러 개 실행하기 - MVN 사용 방법 (빌드>패키징>커맨드 라인에서 직접 실행하는 방법)
💬 (링크) mvn 설치 오류 해결 - [ERROR] cmd에서는 버전 확인되나, 터미널에서는 확인이 안되는 오류
💬 (링크) 오류해결 - [ERROR] 커맨드 라인/터미널에서 새로운 port 기동하기
mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9004'
강의에서는 이렇게 알려주었지만, 오류가 났다.
명령어를 변경해주어 실행하니 됐다.
mvn spring-boot:run '-Dspring-boot.run.jvmArguments="-Dserver.port=9004"'
4. 방법4) User Service 동시에 여러 개 실행하기 - jar파일 이용 방법
강의는 맥인데 나는 윈도우라서 명령어가 달라지는 걸 방지하기 위해 git bash에서 진행했다.
1. 현재 진행하고 있는 파일로 이동
cd 현재 파일 위치
2. 파일 전체 확인
pom.xml이 있는 곳에서 진행
ls -al
3.기존에 만들었던 빌드되어 있는 것 삭제
mvn clean
target(맨아래)이 사라진 것을 확인할 수 있다.
💡 clean compile package 를 한 번에 할 수 있다. 따로 해도 되고
mvn clean compile package
4. mvn 다시 빌드
mvn compile package
mvn이 다시 빌드되어 target파일에 .jar파일 생겼다
❓ ./target 파일에는 무엇이 들어있을까?
ls -al ./target
❓ 윈도우일 경우 dir
.jar파일이 들어있다.
❓ 왜 0.0.1-SNAPSHOT인가?
pom.xml에서 버전이 0.0.1-SNAPSHOT이기 때문이다.
5. user-service-0.0.1-SNAPSHOT.jar 실행
git bash에서 할 때는 아래 명령어로 하십쇼..
java -jar -Dserver.port=9005 .\target\second-service-0.0.1-SNAPSHOT.jar
터미널에서 할 때는 아래 명령어로 하십쇼..
java -jar .\target\user-service-0.0.1-SNAPSHOT.jar --server.port=9005
실행이 잘 되고 있다.
5. 중지
ctrl + c : 실행중인 서비스 중지
exit : 터미널 자체 중지
모든 인스턴스 종류 후 Eureka 대시보드 확인
User Service - LoadBalancer
포트번호를 수동으로 지정해주면 다른 포트 번호와 충돌하는 경우가 발생할 수도 있다.
1. 포트번호 0으로 지정 후 실행
application.xml에서 포트번호를 0으로 지정하면 자동으로 포토 번호를 지정해 줄 수 있다.
server:
port: 0 // 포트번호 0으로 지정
포트번호가 자동으로 85484로 실행되었다.
Eureka 대시보드를 확인해보면 포트 번호가 0으로 나오는 것을 확인할 수 있다.
포트번호를 확인하려면 연두색 부분에 커서를 올려두면 왼쪽 아래에 작게 뜬다.(커서를 올려두었을 때만 볼 수 있으니 잘 확인하자)
2. User Service 여러 개 실행하기
참고 - 방법3) User Service 동시에 여러 개 실행하기 - MVN 사용 방법
위에서 처럼 포트번호를 지정해 줄 필요가 없다 .
pom.xml에서 포트번호가 0으로 되어 있어 있기 때문에 자동으로 충돌이 일어나지 않는 번호로 실행시킨다.
mvn spring-boot:run // 더욱 간단하다! 이걸 실행!
직접 포트번호 지정할 때 코드
mvn spring-boot:run '-Dspring-boot.run.jvmArguments="-Dserver.port=9004"'
포트번호가 50685로 실행되었다.
Eureka 대시보드 확인
실행한 인스턴스는 2개이지만, 여전히 1개의 인스턴스만 확인된다.
이유는 동적으로 할당된 port 번호를 인식하는 것이 아니라, 디폴트로 application.yml 파일에 작성된 port번호를 가져와서 링크를 생성하기 때문이다. 그래서 application.yml에 추가적인 설정을 해줘야 한다.
기존에 실행했던 프로젝트들은 종료하고
application.yml에 instance 추가해서 다시 실행해보자.
eureka:
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
Eureka 대시보드 확인
2개가 나오는 것을 확인할 수 있다. port 번호는 커서를 데거나 클릭해서 들어가면 확인 할 수 있다.
참고) Gradle로 진행할 경우 해당 링크 참고