Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Consumer Driven Contracts and Your Microservice Architecture

732 views

Published on

Consumer driven contracts (CDC) are like TDD applied to the API. It’s especially important in the world of microservices. Since it’s driven by consumers, it’s much more user friendly. Of course microservices are really cool, but most people do not take into consideration plenty of potential obstacles that should be tackled. Then instead of frequent, fully automated deploys via a delivery pipeline, you might end up in an asylum due to frequent mental breakdowns caused by production disasters.

We will write a system using the CDC approach together with Spring Boot, Spring Cloud Contract verifier. We’ll show you how easy it is to write applications that have a consumer driven API and that will allow a developer to speed up the time of writing his better quality software.

Published in: Technology
  • Be the first to comment

Consumer Driven Contracts and Your Microservice Architecture

  1. 1. Consumer Driven Contracts and Your Microservice Architecture Marcin Grzejszczak Adib Saikali @mgrzejszczak @asaikali 1
  2. 2. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ About Marcin Spring Cloud developer at Pivotal working mostly on ● Spring Cloud Sleuth ● Spring Cloud Contract ● Spring Cloud Pipelines Connect with me ● Twitter: @mgrzejszczak ● Blog: http://toomuchcoding.com 2
  3. 3. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Advisory Platform Architect at Pivotal helping customers ● Adopt cloud native application architecture patterns ● Define strategy for modernizing legacy monolithic apps ● Succeed with PCF Connect with me ● Twitter: @asaikali About Adib 3
  4. 4. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Just Another Day at Work 4
  5. 5. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How the code is currently organized 5
  6. 6. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Application Architecture 6 Legacy service Customer Rental History Service Payment processor Mainframe Audit service Insurance service ● Interservice calls are over http ● Legacy service that is hard to test due the dependencies it has on other downstream services
  7. 7. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Hard Coded Object Stubs 7 Legacy service Customer Rental History Service Payment processor Mainframe Audit service insurance service Hard coded Customer Rental History Service Stub
  8. 8. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Problems with hand coding stubs 8 ● 1225 line JSON response ● Hard to keep hard coded stub in sync with the api being stubbed ● Stub does not test that requests are made correctly to the remote service
  9. 9. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Let’s see some code https://github.com/marcingrzejszczak/the-legacy-app 9
  10. 10. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs From Contracts 10 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven/Gradle Plugin Wiremock stub definition stored in -stubs.jar OutputsReads Stub jar files are published to a maven repo
  11. 11. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Auto Generated Remote Stub 11 Legacy service Customer Rental History Service Payment processor Mainframe Audit service insurance service Auto-generated Customer Rental History Service Stub Stubs can be launched on specified a port number using the @AutoConfigureStubRunner annotation on test classesAudit Service integration test
  12. 12. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud Contract Auto-Generated Stub Workflow 12 01 02 03 04 Developer codes a contract defining the interaction between a consumer and the API using the Spring Cloud Contract Groovy DSL Spring Cloud Contract Maven/gradle plugin generates wiremock stubs from contract definitions packaged in -stubs.jar published in a maven repository CI/CD Server runs tests Spring Cloud Contract starts wiremock during the test execution and configures it with the scenario specified by the contract Developer writes an integration test and annotates it with @AutoConfigureStubRunner specifying the port number for the stub to run on
  13. 13. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How to involve other teams? https://github.com/marcingrzejszczak/2017-s1p-external-contracts 13
  14. 14. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud Contract plugin does more than that... 14
  15. 15. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs & Tests From Contracts 15 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven Plugin Generates Wiremock stub definition stored in -stubs.jar Reads Stub jar files are published to a maven repo junit integration tests that execute the contract against the api
  16. 16. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Auto Generated tests & stubs 16 Legacy service Customer Rental History Service Payment processor Mainframe Audit service Insurance service Auto-generated Legacy Service Stub Stubs can be launched on specified a port number using the @AutoConfigureStubRunner annotation on test classes Auto-generated junit integration tests Auto-generated Legacy Service Stub Auto-generated stubs
  17. 17. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Producer of an API ● Accept pull requests from consumers containing contract definitions ● Add spring cloud contract maven/gradle plugin to the build file ● Run generated contract integration tests against api ● Publish generated -stubs.jar files to the maven repo Spring Cloud Contract Workflow Consumer of an API ● Write a contract that defines the interaction with the API ● Send a pull request to the producer to contribute the consumer contract ● Write integration tests that uses the generated wiremock stubs ● Run integration tests as part of CD pipeline 17
  18. 18. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Hard Problems ● How can something be added to a service without breaking the clients? ● How can something be removed from a service without breaking the clients? ● How can a service developer find out how clients are using their service? ● How to enable short release cycles and continuous delivery of services? 18
  19. 19. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Service Evolution Patterns ● Single Message Argument ● Dataset Amendment ● Tolerant Reader ● Schema Versioning ● Extension Points ● Consumer-Driven Contracts 19
  20. 20. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Provider Contract • The implementer of a service defines the interface of the service everyone uses the same interface 20 Service Client A Client B
  21. 21. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Contract ● The consumer of a service defines their interface to the service within the conventions / spirit of provider contract 21 Service Client A Client B
  22. 22. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts Workflow ● Every consumer of a service must write an executable integration test that defines how the consumer uses the service ● Each test must only test what the client cares about ● Consumer tests are sent as pull requests to the service producer 22
  23. 23. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts 23 Source: http://martinfowler.com/articles/consumerDrivenContracts.html
  24. 24. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts 24 http://www.servicedesignpatterns.com/WebServiceEvolution/ConsumerDrivenContracts
  25. 25. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Benefits of Consumer Driven Contracts ● Align service providers with the business goals of their consumer through the consumer driven contracts ● Provide insights into how a service is being used by its consumers ● Make evolving services easier by reducing the amount of co-ordination required to evolve interfaces ● Help in the configuration of continuous delivery pipelines ○ Spring Cloud Pipelines - https://cloud.spring.io/spring-cloud-pipelines/ 25
  26. 26. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs & Tests From Contracts 26 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven Plugin Generates Wiremock stub definition stored in -stubs.jar Reads Stub jar files are published to a maven repo junit integration tests that execute the contract against the api
  27. 27. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ @RunWith(SpringRunner.class) @SpringBootTest(classes = TheLegacyApp.class, properties = "api.url=http://localhost:8765", webEnvironment = NONE) @AutoConfigureStubRunner( ids = "com.example:the-legacy-app-stubs:+:stubs:8765" , workOffline = true ) public class CustomerWithStubRunnerTests { @Autowired CustomerRentalHistoryManager manager; @Test public void should_return_charge_collection() { Charges charges = manager.listAllCharges("foo"); BDDAssertions.then(charges.getCharges()) .hasSize(25); } } Using Stubs on the Client Side 27 Stub Runner Automatically runs a WireMock server and feeds it with stubs downloads the JAR with the stubs or uses classpath to find them
  28. 28. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ● Messaging (Spring Integration / Stream / Apache Camel) ● Integration with Spring Mock MVC ● Maven and Gradle plugins ● Scenarios ● Dynamic pieces ● Stub Runner Boot ● JUnit rule ● Spring Cloud integration ● Pact support What else 28
  29. 29. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Messaging 29
  30. 30. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ MockMvc 30
  31. 31. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Maven & Gradle 31
  32. 32. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Scenarios 32
  33. 33. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Dynamic Pieces 33
  34. 34. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Dynamic Pieces 34
  35. 35. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ NodeJs app 35
  36. 36. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Doesn’t work 36
  37. 37. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Stub Runner Boot 37
  38. 38. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (java -jar) 38
  39. 39. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (Spring Cloud Cli) 39
  40. 40. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (Spring Cloud Cli) 40
  41. 41. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ NodeJs works 41
  42. 42. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Not a Spring app? JUnit Rule FTW! 42
  43. 43. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud integration 43
  44. 44. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Pact support 44
  45. 45. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 45
  46. 46. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learn More. Stay Connected. ▪ Read the docs http://cloud.spring.io/spring-cloud-contract/ ▪ Talk to us on Gitter https://gitter.im/spring-cloud/spring-cloud-contract Twitter: twitter.com/springcentral YouTube: spring.io/video LinkedIn: spring.io/linkedin Google Plus: spring.io/gplus 46
  47. 47. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Disclaimer Statement 47
  48. 48. asaikali mgrzejszczak

×