스프링 환경에서 간편하게 외부 api를 호출할 수 있는 라이브러리인 feign client를 사용해보도록 하겠습니다.
restTemplate 보다 훨씬 더 간편하게 api를 호출 할 수 있습니다.
유레카 서버에서 주기적으로 다른 서비스들의 정보를 가져오고 이를 로컬에 캐싱한다고 하였습니다. 그리고 이 정보를 이용하여 서비스 고유명만으로 통신이 가능합니다.
수정함(2022.08.16)
- 환경 설정
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
build.gradle에 spring cloud library를 설치해준다 (이거 안 해서 삽질함..)
ext {
set('springCloudVersion', "2021.0.3")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
구현하고 싶은 상황
serviceA(Bblcareer)에 있는 인사 내역을 serviceB(Bbl-payment)에서 보고 싶다면???
1. 내 BblcareerApplication 에 @EnableFeignClients 어노테이션으로 Feign Client임을 설정합니다.
@SpringBootApplication
@EnableJpaAuditing
@EnableFeignClients //요기
@EnableEurekaClient
public class BblCareerApplication {
public static void main(String[] args) {
SpringApplication.run(BblCareerApplication.class, args);
}
}
2. BblPayment도 마찬가지로 설정해준다.
@EnableJpaAuditing
@EnableFeignClients
@SpringBootApplication
public class BblPaymentApplication {
public static void main(String[] args) {
SpringApplication.run(BblPaymentApplication.class, args);
}
}
3. 정보를 받길 원하는 모듈에 소통을 할 수 있는 feign interface를 만들어준다. 여기서는 Bblcareer의 인사 정보를 payment에서 받기 원하니깐 payment에 feign interface를 만들어주어야 한다. 다음과 같이 Bblcareer controller의 실제 인사 내역을 받는 api를 동일하게 작성해준다.
@RestController
@Slf4j //로깅을 위함
@RequiredArgsConstructor
@PropertySource("classpath:/application.properties")
@RequestMapping(value = "/careers")
public class CareerController {
private final CareerServiceImpl careerService;
@ApiOperation("전체 인사 내역 조회")
@GetMapping("/all")
public List<CareerDto.CAREERINFO> showAll() {
return careerService.showAll();
}
@ApiOperation("개인 인사 내역 조회")
@GetMapping("/{memberIdentity}")
public CareerDto.CAREERINFO show(@PathVariable String memberIdentity) {
return careerService.show(memberIdentity);
}
career controller에서 /careers/memberIdentity
해당 api를 payment에서 호출하는 방법
@FeignClient(name="모듈 이름", url="Bblcareer포트번호")
@FeignClient(name = "bbl-career",url = "localhost:8011")
public interface FeignCommunicator {
@RequestMapping(
method= RequestMethod.GET,
value="/careers/{memberIdentity}")
String getMemberIdentity(@PathVariable("memberIdentity") String memberIdentity);
}
이제 사용하고 싶은 상황에 다음과 같이 호출하면 된다.
- 예시로 paymentController에서 Career의 인사 내역을 불러오는 api를 새로 만든 후
- Feign Communicator을 주입받는다 - private final FeignCommunicator fegin;
- feign.getMemberIdentity() 함수를 호출하면 bblcareer의 모듈에 있던 값이 나온다.
@RestController
@RequiredArgsConstructor
public class PaymentController {
private final FeignCommunicator feign;
@RequestMapping("/getCareerInfo/{memberIdentity}")
public String getCareerInfo(@PathVariable String memberIdentity){
String Info = feign.getMemberIdentity(memberIdentity);
return Info;
}
}

'한이음 프로젝트' 카테고리의 다른 글
[한이음] 스프링 AWS S3 파일 업로드 및 controller 에러 해결 (5) | 2022.08.29 |
---|---|
[한이음] MSA 프로젝트(5) - Spring Cloud Gateway 사용하기 (2) | 2022.08.17 |
[한이음]Controller는 SRP(단일 책임 원칙)을 지키는걸까..? (1) | 2022.08.11 |
[한이음]MSA프로젝트(3)- 서비스 호출 구현 (2) | 2022.08.03 |
[한이음] MSA프로젝트- (2) Eureka 서버&클라이언트 설정 (0) | 2022.08.02 |