Eureka 연동
Eureka Client 추가 - pom.xml, application.yml
apigateway-service, first-service, second-service 3개의 프로젝트에 모두 추가
dependencies 확인(pom.xml 확인) - 세 개 프로젝트에 모두 적용
pom.xml
apigateway-service, first-service, second-service 3개의 프로젝트에 eureka-client 의존성 추가
Maven일 경우
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Gradle일 경우
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
application.yml 설정 - 세 개 프로젝트에 모두 적용
apigateway-service, first-service, second-service
3개의 프로젝트에 모두 추가
# 유레카에 등록하겠다!
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka # 유레카 주소는 여기!
apigateway-service에는 추가적으로 route 설정 변경
uri에 마이크로서비스 이름을 넣는다.
eureka 대시보드에서 인스턴스 명을 확인하고 넣거나, 인스턴스 명을 대문자로 넣으면 된다.
route의 uri 속성을 변경한다. lb는 로드 밸런서의 약자이고 그 뒤에는 유레카 인스턴스 이름이다.
클라이언트로부터 Path=/first-service/** 로 요청 정보가 전달되면
discorvery service에 등록되어 있는 마이크로 서비스 중
MY-FIRST-SERVICE로 포워딩 시킨다.
routes:
- id: first-service
uri: lb://MY-FIRST-SERVICE # ✔ 마이크로 서비스 이름을 넣어주면 됨..
predicates:
- Path=/first-service/**
filters:
- CustomFilter
- id: second-service
uri: lb://MY-SECOND-SERVICE # ✔
predicates:
- Path=/second-service/**
filters:
- CustomFilter
apigateway-service의 application.yml 전체보기
server:
port: 8000
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter #GlobalFilter클래스 이름
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- id: first-service
uri: lb://MY-FIRST-SERVICE # 마이크로 서비스 이름을 넣어주면 됨..
predicates:
- Path=/first-service/**
filters:
# - AddRequestHeader=first-request, first-request-header2
# - AddResponseHeader=first-response, first-response-header2
- CustomFilter
- id: second-service
uri: lb://MY-SECOND-SERVICE
predicates:
- Path=/second-service/**
filters:
# - AddRequestHeader=second-request, second-request-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter
- name: LoggingFilter # 추가적인 파라미터를 넣고 싶다면 "name:"을 넣어야 한다.
args:
baseMessage: Hi, there.
preLogger: true
postLogger: true
실행결과 확인
postman으로 확인했다. 잘된다!
First Service, Second Service 프로젝트를 각각 2개씩 기동하기
참고) User Service 등록 - 동시에 여러 개 실행하기
First Service - Edit Configurations 설정으로 실행
참고 - 방법2) User Service 동시에 여러 개 실행하기 - Edit Cofigurations 설정 방법
Edit Configurations에서 하나 더 기동
VM옵션에 port번호 입력
-Dserver.port=9091
Second Service - .jar실행
참고 - 방법4) User Service 동시에 여러 개 실행하기 - jar파일 이용 방법
터미널에서 clean, compil, package 한번에 가능
mvn clean compile package
.jar 파일 터미널에서 실행
git bash에서 할 때는 아래 명령어로 하십쇼..
java -jar -Dserver.port=9093 .\target\second-service-0.0.1-SNAPSHOT.jar
터미널에서 할 때는 아래 명령어로 하십쇼..
java -jar .\target\second-service-0.0.1-SNAPSHOT.jar --server.port=9093
Eureka 대시보드 확인
실행한 포트가 모두 잘 등록되었다.
Postman 확인
다 잘나온다.
▶ First Service가 2개 중 어느 게 실행되고 있는지 어떻게 알 수 있을까?
⁂ 랜덤 포트를 적용한다.
MVN을 사용해서 해보자
참고1 - 방법3) User Service 동시에 여러 개 실행하기 - MVN 사용 방법 (빌드>패키징>커맨드 라인에서 직접 실행하는 방법)
참고2 - User Service - LoadBalancer
port를 0으로 했을 때는 instance-id를 추가해주는게 좋다.
왜냐하면 Eureka 대시보드에서 2개를 기동했더라도 1개만 뜨기 때문이다.
server:
port: 0 // ✔ 여기 포트 변경!
spring:
application:
name: my-first-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
// ✔ 여기 추가!
포트 0으로 한 것을 인텔리제이로 하나 실행하고
터미널에서 하나 더 실행하면 포트가 자동으로 주어져 실행된다.
mvn spring-boot:run
First Service의 Contoller에서 추가
💡 port 가져오는 방법
방법1. HttpServletRequest
방법2. 환경변수(pom.xml)에 할당된 정보값을 LocalServerPort로 가져오기
@RestController
@RequestMapping("/first-service")
@Slf4j
public class FirstServiceController {
Environment env;
public FirstServiceController(Environment env) {
this.env = env;
}
@GetMapping("/check")
public String check(HttpServletRequest request) {
// 💡 port 가져오는 방법1. HttpServletRequest
log.info("Server port={}", request.getServerPort());
// 💡 port 가져오는 방법2. 환경변수(pom.xml)에 할당된 정보값을 LocalServerPort로 가져오기
return String.format("Hi, there. This is a message from First Service on PORT %s.", env.getProperty("local.server.port"));
}
}
postman에도 잘보이고
First Service 콘솔에서도 port를 가져온다.
실행할 때마다 실행된 포트의 콘솔에서 포트를 보여준다.