Spring Cloud OpenFeign 소개
eureka에 여러 application이 등록되었으면 이제 이 정보를 사용하여 호출을 할 수 있게 된다.
msa를 사용하게 되면 각 서버들 간 호출의 종속성을 끊어 사용할 수 있다.
도메인도 마찬가지인데 이렇게 끊어놓은 각 서버 간 호출을 매번 restTemplate을 사용하여 작성하면 작성하는 것도 일이고 유지보수 하는 것도 일이다.
https://github.com/OpenFeign/feign
OpenFeign을 사용하면 api 호출 설정을 간소화하여 interface 선언만으로 호출을 관리할 수 있게 된다.
이런 방식을 선언적 웹 서비스 클라이언트(declarative web service client)라고 한다.
Feign은 Neflix OSS 프로젝트의 일부로 Netflix가 처음 만들었고 이후 Netflix는 내부적으로 feign을 사용하지 않기로 결정하면서 오픈 소스 커뮤니티로 완전히 이전하여 OpenFeign이 되었다.
https://www.baeldung.com/netflix-feign-vs-openfeign
https://github.com/OpenFeign/feign
Spring은 이 OpenFeign을 사용하기 위한 Spring Cloud OpenFeign을 제공하고 있다.
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
Spring Cloud OpenFeign 설정하기
Spring Cloud OpenFeign을 사용하려면 다음과 같이 의존성을 추가하고
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@EnableFeignClient를 설정해 주면 된다.
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring Cloud OpenFeign 사용하기
하나의 예를 들어보자.
예를 들어 user 정보를 다음과 같이 제공하는 api가 있고 해당 spring application name이 "bluesky-api-user"라고 하면
@RestController
@RequestMapping(value = "/api/user/userDetails", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserDetailsController {
@Autowired
private UserDetailsManager userDetailsManager;
@GetMapping("/search/loadUserByUsername")
public UserDetails loadUserByUsername(String username) {
return userDetailsManager.loadUserByUsername(username);
}
@PostMapping
public UserDetails createUser(@RequestBody User user) {
userDetailsManager.createUser(user);
return user;
}
@PutMapping
public UserDetails updateUser(@RequestBody User user) {
userDetailsManager.updateUser(user);
return user;
}
@DeleteMapping
public void deleteUser(String username) {
userDetailsManager.deleteUser(username);
}
}
이 api를 호출해서 사용할 수 있도록 하는 OpenFeign client는 다음과 같이 작성하면 된다.
@FeignClient로 선언하고 value에 eureka에 등록된 대상 application 정보를 설정한다.
@FeignClient(value = "bluesky-api-user", path = "/api/user/userDetails")
public interface UserDetailsClient {
@GetMapping("/search/loadUserByUsername")
public Optional<UserDetails> loadUserByUsername(@RequestParam String username);
@PostMapping
public Optional<UserDetails> createUser(@RequestBody User user);
@PutMapping
public Optional<UserDetails> updateUser(@RequestBody User user);
@DeleteMapping
public void deleteUser(@RequestParam String username);
}
이렇게 만든 client를 사용한 간단한 예제는 아래와 같다.
public static SomeService {
@Autowired
private UserDetailsClient userDetailsClient;
public void someMethod() {
UserDetails userDetails = userDetailsClient.loadUserByUserName("someUser");
//... 이하 생략
}
}
이렇게 Spring Cloud OpenFeign을 사용하면 api가 많아도 api를 호출하는 client를 만드는데 큰 비용이 들지 않고 빠르게 만들어 사용할 수 있다.
. 위에선 Eureka Server와 연동해서 사용한 경우인데 만약 Eureka를 사용하지 않은 경우 아래처럼 url값을 명시하면 된다.
Eureka Server를 연동하지 않아도 Spring Cloud OpenFeign을 사용할 수 있다.
@FeignClient(value = "bluesky-api-user", path = "/api/user/userDetails", url = "http://localhost:1234")
public interface UserDetailsClient {
// ... 내용 생략
}
. 써보면서 유의해야 할 부분은 @GetMapping이나 @DeleteMapping의 경우 파라미터에 대해 @RequestParam 선언을 하지 않으면 POST 요청으로 처리가 되는 부분이 있었다.
spring 쪽 로그 레벨을 DEBUG까지 낮춰야 응답이 제대로 되지 않는지, GET이 아닌 POST로 요청을 한 것인지 확인 할 수 있다.
. Spring Cloud OpenFeign에 Spring Cloud CircuitBreaker도 손쉽게 사용이 가능하다.
나중에 사용해 보면서 여기에 추가로 작성할지 모르겠다.
'Study > Java' 카테고리의 다른 글
Spring Session 사용해 보기 (0) | 2023.02.03 |
---|---|
Spring Boot Thymeleaf 사용해 보기 (0) | 2023.02.01 |
Spring Boot Admin 사용해 보기 (0) | 2023.01.30 |
Spring Boot Actuator 사용해 보기 (0) | 2023.01.29 |
Spring Security, Spring Security OAuth2 Client를 MSA로 구성해 보기 (0) | 2023.01.28 |
Spring Cloud Netflix Eureka Server 사용해 보기 (0) | 2023.01.26 |
mysql:mysql-connector-java -> com.mysql:mysql-connector-j 변경 및 Spring Boot 2.7.8 이후 mysql-connector-java 의존성 관리 제거 (0) | 2023.01.25 |
Spring Framework 6.0.x 이후 Web 에러 처리 - ProblemDetail 사용하기 (0) | 2023.01.18 |
java record 사용시 @JsonIgnore 설정 주의점 (0) | 2023.01.14 |
[오류수정반영예정] STS 4.17.x, 4.18.x 무한 로딩 현상 (0) | 2023.01.05 |