Más contenido relacionado La actualidad más candente (20) Similar a Consumer Driven Contracts and Your Microservice Architecture (20) Más de Marcin Grzejszczak (13) Consumer Driven Contracts and Your Microservice Architecture2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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