Nacos 서비스 레지스트리와 OpenFeign 클라이언트 통합

마이크로서비스 아키텍처에서 Nacos의 역할 서비스 레지스트리는 마이크로서비스 간 통신 관리의 핵심입니다. Nacos는 서비스 공급자가 자신을 등록하고, 서비스 소비자가 인스턴스를 찾을 수 있도록 하는 동적 레지스트리를 제공합니다. 가장 큰 장점은 미들웨어에 대한 하드코딩된 엔드포인트를 제거하는 것으로, 서비스 공급자 인스턴스의 장애 발생 시 원활한 장애 조치를 가능하게 합니다.

1.1 서비스 공급자 구성 서비스 공급자는 Nacos 레지스트리에서 자신을 등록해야 합니다. Maven 프로젝트에 다음 의존성을 추가합니다:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

이어서 application.yml 파일을 구성에 추가합니다:

spring:
  cloud:
    nacos:
      server-addr: VM_IP_ADDRESS:8848

어플리케이션을 시작하면 Nacos 대시보드에 서비스가 자동으로 나타납니다.

1.2 서비스 소비자 구현 소비자 측에서 인스턴스를 검색하기 위해 동일한 Nacos 디스커버리 의존성을 사용합니다. 레지스트리 주소 구성은 동일합니다.

인스턴스 목록을 검색하기 위해서는 다음과 같이 DiscoveryClient 객체를 활용합니다:

private final DiscoveryClient discoveryClient;

@Service
public class ServiceConsumer {
    public List<DataDTO> fetchData() {
        List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE_NAME");
        if (CollectionUtils.isEmpty(instances)) {
            return Collections.emptyList();
        }
        // 간소화된 로드 밸런싱: 무작위 인스턴스 선택
        ServiceInstance instance = instances.get(ThreadLocalRandom.current().nextInt(instances.size()));
        String url = instance.getUri() + "/your-api-path";
        // RestTemplate을 통한 요청
        ResponseEntity<List<DataDTO>> response = restTemplate.exchange(
            url, 
            HttpMethod.GET, 
            null, 
            new ParameterizedTypeReference<>(){}
        );
        return response.getBody();
    }
}

1.3 Docker에서 Nacos 배포 MySQL을 통한 지속성 모드를 사용할 경우 custom.env 파일을 다음과 같이 구성합니다:

MYSQL_SERVICE_HOST=YOUR_DB_HOST
SPRING_DATASOURCE_USERNAME=your_db_user
SPRING_DATASOURCE_PASSWORD=your_db_pass

Nacos 서버를 실행하는 명령어는 다음과 같습니다:

docker run -d \
  --name nacos-server \
  --env-file ./custom.env \
  -p 8848:8848 \
  -p 9848:9848 \
  --restart always \
  nacos/nacos-server:v2.1.0-slim

악세스는 http://VM_IP:8848/nacos 에서 가능합니다 (기본 인증 정보: nacos/nacos).

서비스 간 호출용 OpenFeign OpenFeign은 선언적 HTTP 클라이언트로서, 마이크로서비스 통신 코드의 작성 부담을 줄여줍니다. 적극적인 로드 밸런싱 지원을 위해 Spring Cloud LoadBalancer와 결합하여 사용합니다.

2.1 OpenFeign 통합 방법 프로젝트에 다음 의존성을 추가합니다:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 부하 분산을 위해 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

메인 애플리케이션 클래스에 주석을 추가하여 활성화합니다:

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

2.2 Feign 클라이언트 인터페이스 타겟 서비스에 대한 프록시를 만들기 위한 인터페이스를 정의합니다:

@FeignClient(name = "target-service-name")
public interface DataServiceClient {
    @GetMapping("/items")
    List<ItemDTO> getItemsByIds(@RequestParam("ids") Collection<Long> idList);
}

이 클라이언트는 자동으로 인식되어 필요한 경우에 종속 주입 방식으로 호출됩니다.

태그: nacos OpenFeign Spring Cloud Alibaba 마이크로서비스 서비스 디스커버리

8월 24일 05:16에 게시됨