넷플릭스 유레카를 사용하여 서비스 디스커버리 구현.
Dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
@EnableEurekaServer 유레카서버 활성화
@SpringBootApplication
@EnableEurekaServer
public class DiscorveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscorveryserviceApplication.class, args);
}
}
application.yml설정
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
#register-with-eureka: false 유레카 서버에 자기 자신을 클라이언트로 등록하지 않도록 하는 설정.
#이건 디스커리리 서버 역할을 하는 유레카 서버이므로 클라이언트로써 디스커버리서버에 등록되지 않도록 false로 설정한다.
register-with-eureka: false
#클라이언트로써 eureka서버에서 eureka레지스트리 정보를 가져올지 여부를 설정한다.
#위와 마찬가지로 클라이언트가 아니므로 false로 설정.
fetch-registry: false
서버 기동시키고 127.0.0.1:8761로 접속해보면 아래와 같은 창이 뜬다.
서버는 완료했으니 클라이언트를 설정해보자.
Dependency
netflix-eureka-server가 아닌 client로 주입해야한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@EnableDiscoveryClient 디스커버리 클라이언트 활성화.
@EnableEurekaClient로 해도 된다고 함.
@SpringBootApplication
@EnableDiscoveryClient
public class UserserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserserviceApplication.class, args);
}
}
클라이언트 yml설정
server:
port: 9001
spring:
application:
name: userservice
eureka:
client:
register-with-eureka: true # EUREKA 서버로부터 인스턴스들의 정보를 주기적으로 가져올것인지 성정하는 속성. true로 설정하면 갱신 된 정보를 받겠다는 설정.
fetch-registry: true
service-url: #서버의 위치가 어디인지 그 항목을 지정하는 부분. 유레카서버 위치 폴더를 지정한다.
defaultZone: http://127.0.0.1:8761/eureka #eureka라는 엔드포인트에 현재 여기서 가지고 있는 마이크로서비스를 등록한다.
클라이언트 하나 더 생성하려면
여기 들어가서 왼쪽 상단에 + 버튼 클릭해서 하나더 추가로 만들면 된다.
하지만 그냥 저렇게 UserserviceApplication-2를 새로 추가하면 기존의 UserserviceApplication과 port번호 9001과 겹쳐서 UserserviceApplication-2가 실행이 되지 않는다. 그래서 vm option을 추가해서 -Dserver.port=9002로 설정해주어야한다.
그럼 UserserviceApplication-2가 실행되면서 main class의 매개변수로 vm option값이 전달되면서 9002로 바뀌면서 정상 작동한다.
이제 두개의 클라이언트를 실행할수 있게 되었다. 두개를 띄우고 다시 유레카 서버에 접속해보면
instances에 보면 만들었던 USERSERVICE가 있고 상태값에 포트로 설정했던 9001과 9002 두개의 마이크로서비스가 등록되어 있다.
만약 클라이언트 요청이 userservice로 전달이 된다고 하면 디스커버리 서비스 안에서 9001번으로 전달될지 9002번으로 전달될지 어떠한 인스턴스가 살아있는지 이 정보값을 게이트웨이나 라우팅 서비스에게 전달 해주게 되면 두개의 서비스에 의해서 분산된 서비스가 실행되게할 수 있다.
다음은 툴에서 제공하는 run으로 실행하는게 아니라 커맨드라인으로 스프링을 띄우는 방법을 살펴본다.
https://maven.apache.org/download.cgi 메이븐을 새로 다운로드하고
터미널 열어서
vi .bash_profile로 접속후
export M_HOME=/Library/apache-maven-3.3.9
export PATH=$PATH:$M_HOME/bin
환경변수 설정하고
esc누르고 :wq!로 저장후
source ~/.bash_profile
로 변경된 설정 완료시키고 인텔리제이 터미널에 가서도 source ~/.bash_profile해줘야 한다. 안해주면 mvn -version해도 안뜸..
인텔리제이 터미널 창에
mvn spring-boot:run '-Dspring-boot.run.jvmArguments="-Dserver.port=9004"'
명령어로 만든 프로젝트를 메이븐으로 실행 시킴. 그냥 mvn spring-boot:run으로 실행시키면 아까와같이 포트가 겹치므로 포트번호를 따로 인자값으로 설정해주어야 한다.
이번엔 터미널로 실행하는 법을 알아보자.
userservice디렉토리로 이동한다.
~/Downloads/project/userservice
ls -al 명령어로 userservice폴더안에 있는 리스트를 확인해보면
target이 있는걸 확인한 후 mvn clean을 해준다.
기존에 빌드되어 있는 정보들이 삭제되게 된다.
그리고 다시 빌드를 해야하니까 mvn compile package를 입력한다. 스프링이 기동되면서
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ userservice ---
[INFO] Building jar: /Users/lby/Downloads/project/userservice/target/userservice-0.0.1-SNAPSHOT.jar
정보에 이런 문구가 뜬다. 빌드된걸 살펴보면 내 경로 Users/lby/Downloads/project/userservice에 /target이라는 폴더가 생성되었고 그 안에 userservice-0.0.1-SNAPSHOT.jar 가 생성 되었다.
ls -al ./target 명령어를 입력하면
userservice-0.0.1-SNAPSHOT.jar
userservice-0.0.1-SNAPSHOT.jar.original
이 생성되어 있는걸 볼수있다.
다시 pwd로 현재 경로를 확인하고
ls로 target이 있는지 확인하고 java -jar -Dserver.port=9004 ./target/userservice-0.0.1-SNAPSHOT.jar
로 실행시켜준다.
결과는 아까 실행 했던 클라이언트들을 포함해서 터미널로 실행한것까지 총 4개의 마이크로서비스가 등록된걸 확인할 수 있다.
아까 툴에서 mvn spring-boot로 run하는 방법(mvn spring-boot:run)도 있고 저렇게 명령어 java -jar를 가지고 jar파일로 실행시키는 방법도 있다. 이렇게 여러가지 기동하는 방법을 알아봤는데 모두 모두 port를 새로 만들어줘야하는 불편함이 있다. 그건 다음 블로그에 정리 해보겠다.
'Spring Cloud(MSA)' 카테고리의 다른 글
Users Microservice - 인증과 권한 기능 개요 (0) | 2022.09.21 |
---|---|
API-GATEWAY설정 (0) | 2022.09.19 |
Discoveryservice에 포트번호 변경없이 등록하기 (0) | 2022.09.19 |
Cloud Native Application (0) | 2022.09.18 |
Cloud Native Architecture (1) | 2022.09.18 |