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.

33degree Krzysztof Debski - Let's build a solid base for a scale

1,056 views

Published on

Published in: Technology, Education
  • Be the first to comment

33degree Krzysztof Debski - Let's build a solid base for a scale

  1. 1. @DebskiChris #33rdDegree Krzysztof Dębski Allegro Group Let’s build a solid base for a scale
  2. 2. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Agenda The Allegro Situation How to build a new World? The way to improve What’s in it for you?
  3. 3. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris The Allegro Situation
  4. 4. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Allegro
  5. 5. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Allegro 6 million LOC
  6. 6. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY 400 people in IT Allegro
  7. 7. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris A New Hope
  8. 8. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY A New Hope
  9. 9. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY A New Hope
  10. 10. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY A New Hope? Service Oriented Ambiguity
  11. 11. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Domain Driven Design
  12. 12. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris (Micro)Services
  13. 13. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY (Micro)Services Business needs User Transaction Offer
  14. 14. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY (Micro)Services Independent User Transaction Offer
  15. 15. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY (Micro)Services API User Transaction Offer
  16. 16. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY (Micro)Services Polyglot Cassandra MongoDB Oracle User Transaction Offer
  17. 17. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY (Micro)Services Smart Endpoints Cassandra MongoDB Oracle Offer Transaction User
  18. 18. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY The first approach Service Auto deployable Auto monitored Auto scalable Auto healable Auto discoverable … and many more features
  19. 19. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris How to build a new World?
  20. 20. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY The first project Service Jetty Server War file Spring Gradle
  21. 21. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s REST JAX-RS / JSR Compliant @Path("/users") @Consumes(CONTENT_TYPE_JSON) @Produces(CONTENT_TYPE_JSON) public class UsersEndpoint { // [...] @GET public UserCollectionResponse findAllUsers() { //[...] } }
  22. 22. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s expose our methods Swagger @Path("/users") @Api(value = "/users") @Consumes(CONTENT_TYPE_JSON) @Produces(CONTENT_TYPE_JSON) public class UsersEndpoint { // [...] @ApiOperation(value=“Get all users”, response=UserCollectionResponse.class) @GET public UserCollectionResponse findAllUsers() { //[...] } }
  23. 23. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s expose our methods Swagger @Path("/users") @Api(value = "/users") @Consumes(CONTENT_TYPE_JSON) @Produces(CONTENT_TYPE_JSON) public class UsersEndpoint { // [...] @ApiOperation(value=“Get all users”, response=UserCollectionResponse.class) @GET public UserCollectionResponse findAllUsers() { //[...] } }
  24. 24. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s expose our methods Swagger
  25. 25. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper
  26. 26. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper Register
  27. 27. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper
  28. 28. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper Get User
  29. 29. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper Get User
  30. 30. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And make them discoverable Offer User Discovery ZooKeeper Get User Get offer for user
  31. 31. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Multiple API versions Content negotiation @Path("/users") @Consumes(”application/json”) @Produces(”application/json”) public class UsersEndpoint { // [...] @GET public UserCollectionResponse findAllUsers() { //[...] } }
  32. 32. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Multiple API versions Content negotiation @Path("/users") @Consumes(”application/vnd.allegro.user.v1+json”) @Produces(”application/vnd.allegro.user.v1+json”) public class UsersEndpoint { // [...] @GET public UserCollectionResponse findAllUsers() { //[...] } } curl --dump-header - -H ”Accept: application/vnd.allegro.user.v1+json" -X GET http://localhost:8080/users
  33. 33. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Multiple API versions Content negotiation @Path("/users") @Consumes(”application/vnd.allegro.user.v1+json”) @Produces(”application/vnd.allegro.user.v1+json”) public class UsersEndpoint { // [...] @GET @Produces(“application/vnd.allegro.user.v2+json”) public UserCollectionResponse findAllUsers() { //[...] } } curl --dump-header - -H ”Accept: application/vnd.allegro.user.v2+json" -X GET http://localhost:8080/users
  34. 34. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY And it became slow…
  35. 35. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Lower startup time External Jetty Service Jetty Server War file
  36. 36. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Lower startup time Embedded Jetty Service Jetty Server Jar file
  37. 37. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Lower startup time Embedded Jetty Service Jetty Server Jar file
  38. 38. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Lower startup time Embedded UnderTow Service Jetty ServerUndertow Jar file
  39. 39. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Lower startup time Immutable Images Service Undertow Zip file Server Immutable image
  40. 40. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY How to configure it? Service java –jar service.jar
  41. 41. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY How to configure it? Service ZooKeeper java –jar service.jar –Dzookeeper.address=zookeper.service
  42. 42. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY How to configure it? Service ZooKeeper java –jar service.jar –Dzookeeper.address=zookeper.service –Denvironment=prod prod.properties
  43. 43. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY How to configure it? Service ZooKeeper java –jar service.jar –Dzookeeper.address=zookeper.service –Denvironment=prod -Dservice.name=testService prod.properties
  44. 44. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris Tests
  45. 45. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Do you test your tests? Pitest
  46. 46. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Integration tests Test without mocks Run from IDE public class UsersIntegrationTest { private static Map<String, String> overrideConfiguration = Maps.newHashMap(); static { overrideConfiguration.put("property.name", "This was overwritten value"); } @ClassRule public static final RestServiceStarted DEPLOYED_SERVICE = new RestServiceStarted(overrideConfiguration); private WebTarget getUsersResourceWebTarget() { return DEPLOYED_SERVICE.getWebTarget().path("users"); } }
  47. 47. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris Monitoring
  48. 48. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s see what’s happening NxLog LogStash Kibana
  49. 49. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Let’s see what’s happening Graphite # Metrics metrics.reporters.graphite.enabled=true metrics.reporters.graphite.host=graphite.service metrics.reporters.graphite.port=2003 metrics.reporters.graphite.prefix=stats.Prod.service metrics.reporters.interval=30
  50. 50. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Monolith Alert
  51. 51. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Monolith Alert Multi module project support
  52. 52. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Monolith Alert Multi module project support
  53. 53. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris The way to improve
  54. 54. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Authentication OAuth2
  55. 55. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Patch Support Standardized by IETF https://tools.ietf.org/html/rfc6902 PATCH /user/1 HTTP/1.1 Host: user.service.local Content-Length: 312 Content-Type: application/json-patch+json [ {”op”: ”test”, ”path”: ”/firstname”, ”value”: ”Jane”}, {”op”: ”add”, ”path”: ”/maidenname”, ”value”: ”Smith”}, {”op”: ”replace”, ”path”: ”/lastname”, ”value”: ”Doe”}, {”op”: ”remove", ”path”: ”/meetings”}, {”op”: ”move”, ”from”: ”/balance”, ”path”: ”sharedbalance”}, {”op”: ”copy”, ”from”: ”/a”, ”path”: ”/b”} ]
  56. 56. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Simplify annotations Swagger? @Path("/users") @Api(value = "/users") @Consumes(CONTENT_TYPE_JSON) @Produces(CONTENT_TYPE_JSON) public class UsersEndpoint { // [...] @ApiOperation(value=“Get all users”, response=UserCollectionResponse.class) @GET public UserCollectionResponse findAllUsers() { //[...] } }
  57. 57. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Deployment Docker support
  58. 58. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris What’s in it for you?
  59. 59. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Use the latest tools GradleW in CI ENV and parent POM issues. Don’t do DDOS yourself and your partners.
  60. 60. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Change is the only constant Deployment tools Service API provider Dependency injection HTTP Server Cargo Docker Ecosystem Swagger Jersey addon Guice Spring Jetty Undertow
  61. 61. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Focus on right metrics How to have 100% code coverage? public class UserMediaType { public static final String V1_JSON = "application/vnd.allegro.user.v1+json” public static final String V2_JSON = "application/vnd.allegro.user.v2+json” }
  62. 62. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Focus on right metrics import org.junit.Test; import static net.trajano… public class MediaTypesTest { @Test public void mediaTypesShouldBeValidUtilityClasses() throws Throwable { assertUtilityClassWellDefined(UserMediaType.class); } } You don’t need 100% code coverage!
  63. 63. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Tools also lie Metrics tend to lie Configuration: default PHP metrics Tested file: 4535 CLOC Imperative programming
  64. 64. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Tools also lie How many violations are there?
  65. 65. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Tools also lie How many violations are there? 4 At least according to Sonar.
  66. 66. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Learn to REST REST is not so obvious /api/bi/XYZ123/1 /recommendations/1/items /offer/100?output=ESI/JSON
  67. 67. #33rdDegree @DebskiChris Allegro The New World Improvement WIIFY Community Involve all developers in building the Bootstrap. Or they will build their own tools. Łukasz Drumiński Mateusz Gajewski @wendigo
  68. 68. Allegro The New World Improvement WIIFY #33rdDegree @DebskiChris Q & A

×