Real code example: Spring boot with OpenFeign client, Hystrix and Spring Service Locator pattern — Part 2
The first part is here https://sunhong22187.medium.com/real-code-spring-boot-with-openfeign-client-hystrix-and-spring-service-locator-pattern-part-1-19b089d4fe56
In this part, we are gonna go through OpenFeign client.
OpenFeign Client
I have referred to these articles as below:
https://www.baeldung.com/spring-cloud-openfeign
https://spring.io/projects/spring-cloud-openfeign
OpenFeign Github repository:
https://github.com/OpenFeign/feign
Long story short, OpenFeign is a open source project, based on Spring Cloud Netflix Feign. Ultimately, Netflix decided to stop using Feign internally and ceased its development. As a result of this decision, Netflix fully transferred Feign to the open-source community under a new project named OpenFeign.
A declarative REST client for Spring Boot apps. Feign makes writing web service clients easier with pluggable annotation support, which includes Feign annotations and JAX-RS annotations.
https://www.baeldung.com/spring-cloud-openfeign
In this demo, I only use a simple interface to build a simple client to connect to JSON PLACEHOLDER fake API server
Feign client interface
We only need to define an interface which is annotated with annotation @FeignClient.
@FeignClient(name = "postClient", url = "https://jsonplaceholder.typicode.com", configuration = PostClientConfig.class)
public interface PostClient {
@GetMapping(value = "/posts", produces = MediaType.APPLICATION_JSON_VALUE)
public List<PostModel> listAllPosts(); @PostMapping(value = "posts", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public PostModel createPost(PostModel postRequest);
}
The name argument passed in the @FeignClient annotation is a mandatory, arbitrary client name, while with the url argument, we specify the API base URL.
Furthermore, since this interface is a Feign client, we can use the Spring Web annotations to declare the APIs that we want to reach out to.
Enable Feign client interface scanning
Next, we need to enable component scanning for interfaces that declare they are Feign clients.
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class SpringBootOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootOpenfeignApplication.class, args);
}
}
We can either declare @EnableFeignClients in Spring application main class or any configuration classes which are annotated with @Configuration.
Now, we are good to go for using this client class. In order to use, we only need to inject the Feign client interface in any Spring component classes.
@Slf4j
@AllArgsConstructor
public class PostAsynchronousService implements AsynchronousService<PostModel, PostModel> {
private PostClient postClient;
...
}
In example code above, I use Lombok to automatically generate constructor with one argument as PostClient type.
- @AllArgsConstructor: to generate constructor with argument(s) for all class's properties
Since we only have one class property as PostClient type, so the auto generated constructor will only have one argument.
After that, since we only have one constructor, so @Autowired annotation can be omitted, Spring will automatically initialize a PostClient bean (which was generated by OpenFeign library during startup application), then inject into the PostAsynchronousService class constructor.
This constructor injection will make sure we will have a PostClient bean ready before initializing PostAsynchronousService bean.
OpenFeign logging
Each Feign client will have its independent logger to application’s logger and the default logging level is NONE.
To enable logging level, we need to override logging level by configuration:
@Configuration
public class PostClientConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
The Logger.Level
object that you may configure per client, tells Feign how much to log. Choices are:
- NONE
, No logging (DEFAULT).- BASIC
, Log only the request method and URL and the response status code and execution time.- HEADERS
, Log the basic information along with request and response headers.- FULL
, Log the headers, body, and metadata for both requests and responses.
NOTE: Feign client logging levels are only worked when our application log level is DEBUG or the Feign interface package at least.
To run the demo, we can use the Unit Test class TestPostService.