저번 [SpringBoot, MSA #3] 에서 Eureka Server 를 만들고, api gateway 를 생성해서 Eureka client로 등록해보았죠!
이번엔 마이크로서비스를 만들어서 Eureka Client로 등록하고 api gateway로 요청을 했을때 해당 요청의 마이크로서비스로 route가 잘되는지 확인해보겠습니다.
1. Java17, maven, 프로젝트 이름은 client-microservice1 으로 하고 Next.
2. 버전은 3.4.0, 의존성은 Lombok, Eureka Discovery Client, Spring Web 추가하고 Finish.
3. @EnableDiscoveryClient 어노테이션 추가
package cohttp://m.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class ClientMicroservice1Application {
public static void main(String[] args) {
SpringApplication.run(ClientMicroservice1Application.class, args);
}
}
4. controller 패키지를 생성하고, FirstServiceController 를 생성합니다. 호출하면 포트를 간단하게 찍어주는 기능만 넣어줍니다.
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/service1")
public class FirstServiceController {
@Value("${server.port}")
private String port;
@GetMapping("/check")
public String check() {
System.out.println("#### port number = " + port + " ####");
return String.format("First Service on PORT %s", port);
}
}
5. application.properties를 appilcation.yml 로 수정하고 아래 내용처럼 수정해줍니다.
포트는 8081로 설정하고, eureka client로 등록해줄게요.
주의사항은 spring.application.name 의 값과 api gateway application.yml 에서 등록했던 routes.id가 같아야해요.
server:
port: 8081
spring:
application:
name: service1
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka # Eureka Server 명시
6. 프로젝트를 실행시키고, 아까 Spring Eureka 대시보드에서 확인해보면 API-GATEWAY, SERVICE1 이 인스턴스로 등록 되어있죠!
이제 전체 그림에서 서비스A가 Eureka Server로 서비스 등록된 것입니다.
Eureka API 를 이용해서 Eureka Instance를 조회해볼 수 도 있어요.
Get /eureka/apps
Eureka Instance를 삭제하는 방법도 있습니다.
DELETE /eureka/apps/{appID}/{instanceID}
appID 의 경우 위의 목록에서 'app' 에 해당되는 부분이고, instanceID는 'instanceID'에 해당하는 값입니다.
7. api gateway는 8000포트로 실행시켜놨으니 localhost:8000/service1/check 을 호출해보면
아까 서비스1 에서 컨트롤러에 만들어놨던 포트를 출력해주는 메소드가 실행됐습니다.
이제 apigateway 로 요청을 날리면 해당 서비스의 주소나 포트를 몰라도 응답을 받을 수 있어요.
api gateway : 8000
eureka server : 8761
eureak client (service1) : 8081
이제 위의 프로세스대로 실행됩니다.
1. 클라이언트로부터 요청이 들어오면 API Gateway는 Eureka Server를 통해 해당 엔드포인트의 실제 주소값을 반환받음.
2. API Gateway는 Eureka Server로부터 받은 주소에 요청을 함.
3. 응답을 받고 클라이언트에게 응답한다.
결론
API Gateway는 서비스의 실제 주소값을 몰라도 ID값만 유지되고, 가지고 있다면 통신이 가능해집니다.
결국 service들의 url이 변경되거나, 수정사항이 있어도 해당 서비스에서만 수정하면 되고, 이는 결국 유지보수를 더 용이하게 만들어줍니다.
통신을 할때 spring feingn 기능이나 여러가지를 더 붙여서 써볼 수도 있어요. 여러분도 서비스를 몇개더 생성해보고 등록해보면서 테스트 해보시길 바라요!
끝.
'공부내용 정리 > 스프링' 카테고리의 다른 글
[STS4] Github에 있는 SpringBoot(Gradle) 프로젝트 실행이 안될 때 (1) | 2025.03.18 |
---|---|
[SpringBoot] Log 남길 때 혼나지 않기 (0) | 2025.01.09 |
[SpringBoot, MSA #3] Spring Cloud Gateway, Eureka Server 테스트하기(짱쉬움) (1) | 2024.12.18 |
[SpringBoot, MSA #2] Spring Cloud Gateway, 스프링 클라우드 게이트웨이 개념 (1) | 2024.12.16 |
[SpringBoot, MSA #1] 마이크로서비스 아키텍쳐, MSA란? (1) | 2024.12.16 |