11
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

Industrialisation des contrats d'interface avec netflix feign

Embed Size (px)

Citation preview

Page 1: Industrialisation des contrats d'interface avec netflix feign

Industrialisation des contrats d’interfaceCentraliser 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

Page 2: Industrialisation des contrats d'interface avec netflix feign

Sommaire❖ Vous avez dit “centraliser” ?

➢➢

❖ Utilisation de Feign➢➢➢➢➢

❖ Stratégie de migration des appels RestTemplate vers Feign

❖ Conclusion / Questions

Page 3: Industrialisation des contrats d'interface avec netflix feign

Vous avez dit centraliser ?Analyse d’impact simplifiée

Page 4: Industrialisation des contrats d'interface avec netflix feign

Vous avez dit centraliser ?Simplification de la gestion des dépendances / micros-jars

Page 5: Industrialisation des contrats d'interface avec netflix feign

Vous avez dit centraliser ?Simplification de la gestion des dépendances / micros-jars

Page 6: Industrialisation des contrats d'interface avec netflix feign

Utilisation de FeignPourquoi Feign ?

❖❖❖❖

Page 7: Industrialisation des contrats d'interface avec netflix feign

Utilisation de FeignCré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);

}

Page 8: Industrialisation des contrats d'interface avec netflix feign

Utilisation de FeignCré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

}

Page 9: Industrialisation des contrats d'interface avec netflix feign

Utilisation de FeignInstanciation 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);

Page 10: Industrialisation des contrats d'interface avec netflix feign

Stratégie de migration des appels RestTemplate vers Feign

❖❖❖

❖❖

❖❖

❖❖

❖❖

Page 11: Industrialisation des contrats d'interface avec netflix feign

Questions