파란하늘의 지식창고
반응형

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도 손쉽게 사용이 가능하다.
나중에 사용해 보면서 여기에 추가로 작성할지 모르겠다.

https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-circuitbreaker

반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요