반응형
CreateMSA(MicroService Architecture)를 서로를 호출하다보면
코드의 복잡성이 높아지는데 Feign으로 복잡성을 낮출수 있습니다.
- Feign은 Rest 기반 서비스 호출을 추상화하는 Spring cloud Netflix 라이브러
- Feign을 사용하면 코드의 복잡성을 낮춤
- 선언적 동작 식으로 인터페이스를 클러이언트에서 작성하고 인터페이스를 통해 REST api를 호출
- Spring에서 런타임에 인터페이스 구현체를 제공하여 개발자는 비즈니스에 집중할 수 있음
관련 정보는 아래 사이트에서 확인할 수 있습니다.
spring.io/projects/spring-cloud-openfeign
이어진 포스팅은 base 프로젝트를 기반으로 만들었으나
spring cloud는 개별적으로 폴더를 만들어서 진행하도록 하겠습니다.
1. Provider
패키지 구성은 아래와 같습니다.
1-1. 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
1-2. application.yml
server:
port: 8880
1-3. ProviderContoller.java
package com.otrodevym.feignprovider;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/v1/provider", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProviderContoller {
@GetMapping("/member/{id}")
public String member(@PathVariable("id") int id) {
String memberName = "YONG";
return memberName;
}
}
2. Consumer
패키지 구성은 아래와 같습니다.
2-1. 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2-2. application.yml
server:
port: 8881
2-3. ConsumerClient.java
package com.otrodevym.feignconsumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import javax.websocket.server.PathParam;
@FeignClient(name = "member-client", url = "localhost:8880/api/v1/provider")
public interface ConsumerClient {
@GetMapping("/member/{id}")
String member(@PathVariable("id") int id);
}
2.4 ConsumerContoller.java
package com.otrodevym.feignconsumer;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/v1/consumer", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
public class ConsumerContoller {
private final ConsumerClient consumerClient;
@GetMapping("/getMemberName/{id}")
public String getMemberName(@PathVariable("id") int id) {
return consumerClient.member(id);
}
}
3. Postman 테스트
http://localhost:8881/api/v1/consumer/getMemberName/555
반응형
'개발(합니다) > Java&Spring' 카테고리의 다른 글
[spring boot 설정하기-15] spring cloud config(2) 암호화 설정 및 테스트 소스 (0) | 2021.05.07 |
---|---|
[spring boot 설정하기-14] spring cloud config(1) 설정 및 테스트 소스 (1) | 2021.05.06 |
[spring boot 설정하기-12] admin(+security) 설정 및 테스트 소스 (0) | 2021.05.01 |
[spring boot 설정하기-11] actuator 설정 및 테스트 소스 (0) | 2021.04.30 |
[spring boot 설정하기-10] dev-tools 설정 및 테스트 소스 (0) | 2021.04.28 |