Industrialisation des contrats d'interface avec netflix feign
1. Industrialisation des contrats d’interface
Centraliser les contrats avec Netflix/Feign
Quoi ? Netflix c’est fait pour se détendre devant une série non ?
Par Idriss Neumann, le 09/05/2016
2. Sommaire
❖ Vous avez dit “centraliser” ?
➢
➢
❖ Utilisation de Feign
➢
➢
➢
➢
➢
❖ Stratégie de migration des appels RestTemplate vers
Feign
❖ Conclusion / Questions
7. Utilisation de Feign
Créer un contrat d’interface
// Version Jax-rs
@Path(“/v1/users”)
public interface UserService {
@GET
@Path(“/{id}”)
User getById(@PathParam("id") String id);
@POST
@Path(“/”)
User create(User user);
@PUT
@Path(“/{id}”)
void update(@PathParam(“id”), User user);
@DELETE
@Path(“/{id}”)
void delete(@PathParam(“id”));
}
// Version Feign
public interface UserService {
@RequestLine(“GET /v1/users/{id}”)
@Headers("accept: text/xml")
User getById(@Param("id") String id);
@RequestLine(“GET {href}”)
@Headers("accept: text/xml")
User getByHref(@Param("href") String href);
@RequestLine(“GET /v1/users/?email={email}”)
User getByEmail(@Param("email") String email);
@RequestLine(“DELETE /v1/users/{id}”)
@Headers("Authorization: Bearer {accessToken}")
void delete(Param(“accessToken”) String accessToken);
}
8. Utilisation de Feign
Créer un client
public class UserClient extends AbstractClient implements UserService {
public UserClient(String url, RequestInterceptor interceptor) {
super(url, interceptor);
// Supposons que l’object mapper Jackson est héritée d’une abstract
feignClient = Feign.builder()
.client(buildHttpClient())
.requestInterceptor(interceptor)
.encoder(new JacksonEncoder(OBJECT_MAPPER))
.decoder(new JacksonDecoder(OBJECT_MAPPER))
.target(UserService.class, url);
// Pour du Jax-rs ajouter .contract(new JAXRSContract())
}
// Implémenter les méthodes et déleguer
}
9. Utilisation de Feign
Instanciation d’un client dans Spring et utilisation
// Instanciation
@Bean(name = "userServiceClient")
public UserService userService(@Value("${endpoint.url}") String endpoint) {
return new UserClient(endpoint, (RequestInterceptor) requestTemplate -> {
requestTemplate.header(“header_key”, “header_value”);
});
}
// Utilisation
@Autowired
private UserService userService;
// ...
userService.getById(id);