Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Models, Modules, and Microservices

Models, Modules, and Microservices

Talk last held on W-JAX 2019

Henning Schwentner

November 05, 2019
Tweet

More Decks by Henning Schwentner

Other Decks in Programming

Transcript

  1. Starring With
    Directed by
    In the role of
    Also Starring

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. H3NN1NG

    View Slide

  6. Schw3ntn3r

    View Slide

  7. @hschwentner

    View Slide

  8. View Slide

  9. Foto: Steindy/Wikipedia

    View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. View Slide

  17. @hschwentner
    Do I get a car for this?

    View Slide

  18. View Slide

  19. View Slide

  20. CUSTOMER
    TELLS WISH FOR
    1
    SALESPERSON
    SIGNS
    TO
    GIVES
    FOR
    CONTRACT
    3
    RISIK MANAGER
    CONTRACT
    PASSES ON
    TO
    4
    CONTRACT
    VOTES
    CHECKS
    CALCULATES
    5
    6
    7
    CALCU-
    LATES
    TO
    8
    2
    CAR
    CREDIT
    RATING
    INSTALLMENT
    CAR
    RESALE
    VALUE
    CONTRACT

    View Slide

  21. @hschwentner
    How do we design a
    program for that?

    View Slide

  22. View Slide

  23. @hschwentner
    #dddesign

    View Slide

  24. @hschwentner
    Was ist das
    für 1 Design?

    View Slide

  25. @hschwentner
    Vong Domain her

    View Slide

  26. -DRIVEN DESIGN

    View Slide

  27. Software
    Domain

    View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. CUSTOMER
    SIGNS
    CONTRACT
    3
    RISK MANAGER
    CONTRACT
    VOTES
    7
    <>
    LeasingContract
    sign()
    vote()

    View Slide

  32. <>
    LeasingContract
    sign()
    vote()

    View Slide

  33. Object orientation

    View Slide

  34. <>
    LeasingContract
    sign()
    vote()
    extend()
    terminate()
    sell_to_refinance()
    ...

    View Slide

  35. @hschwentner
    The One Big Model

    View Slide

  36. View Slide

  37. View Slide

  38. @hschwentner
    Reality:
    Not one big model
    But several mixed models

    View Slide

  39. BBOM
    Foto: Benutzer:Summi/Wikipedia/CC-BY-SA-3.0-migrated

    View Slide

  40. View Slide

  41. View Slide

  42. @hschwentner
    “Whoever uses a canonical model
    has lost control over his life.”
    – Karl Lagerfeld

    View Slide

  43. @hschwentner
    »Wer ein unternehmensweites
    Modell einsetzt, hat die Kontrolle
    über sein Leben verloren«
    – Karl Lagerfeld

    View Slide

  44. @hschwentner
    Why is that?

    View Slide

  45. View Slide

  46. View Slide

  47. @hschwentner
    Too Big
    to be understood
    as a whole

    View Slide

  48. View Slide

  49. View Slide

  50. @hschwentner
    Model?

    View Slide

  51. A tool to understand the
    world

    View Slide

  52. ?

    View Slide

  53. ?

    View Slide

  54. ?

    View Slide

  55. View Slide

  56. View Slide

  57. View Slide

  58. View Slide

  59. CUSTOMER
    TELLS WISH FOR
    1
    SALES-PERSON
    SIGNS
    TO
    GIVES
    FOR
    CONTRACT
    3
    RISIK MANAGER
    CONTRACT
    PASSES ON
    TO
    4
    CONTRACT
    VOTES
    CHECKS
    CALCULATES
    5
    6
    7
    CALCU-
    LATES
    TO
    8
    2
    CAR
    CREDIT
    RATING
    INSTALLMENT
    CAR
    RESALE
    VALUE
    CONTRACT
    SALES
    RISK MANAGMENT

    View Slide

  60. <>
    LeasingContract
    sign()
    vote()

    View Slide

  61. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()

    View Slide

  62. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()
    SALES
    RISK
    MANAGEMENT

    View Slide

  63. Bounded Context

    View Slide

  64. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()
    SALES
    RISK
    MANAGEMENT

    View Slide

  65. View Slide

  66. @hschwentner
    Clear Boundaries

    View Slide

  67. View Slide

  68. @hschwentner
    Code
    Team
    Database

    View Slide

  69. @hschwentner
    Strategic Design

    View Slide


  70. View Slide

  71. View Slide

  72. View Slide

  73. View Slide

  74. View Slide

  75. Team Head
    Team Tail
    Team Body
    Team Legs

    View Slide

  76. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  77. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()

    View Slide

  78. @hschwentner
    Implementing
    Multiple Models

    View Slide

  79. @hschwentner
    JVM:
    Packages
    Jigsaw-Modules

    View Slide

  80. @hschwentner
    .NET:
    DLLs

    View Slide

  81. @hschwentner
    PHP:
    Namespaces

    View Slide

  82. @hschwentner
    JavaScript:
    Revealing Module Pattern
    TypeScript:
    Modules

    View Slide

  83. @hschwentner
    Generally:
    Microservices
    Self-Contained Systems
    Verticals

    View Slide

  84. @hschwentner
    Multiple Models in Java

    View Slide

  85. @hschwentner
    How?

    View Slide

  86. Packages

    View Slide

  87. @hschwentner
    1 bounded context
    =
    1 package

    View Slide

  88. package leasingninja.sales;
    class LeasingContract { /*...*/ }
    package leasingninja.riskmanagement;
    class LeasingContract { /*...*/ }

    View Slide

  89. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()
    <>
    leasingninja.sales
    <>
    leasingninja.riskmanagement

    View Slide

  90. Problems:
    * No real encapsulation
    * No nesting
    * only a logical group of
    classes

    View Slide

  91. Only public and package
    private

    View Slide

  92. But: all classes of a bounded
    context in one package ->
    already quite ok

    View Slide

  93. @hschwentner
    Project Jigsaw

    View Slide

  94. @hschwentner
    Real capsule

    View Slide

  95. @hschwentner
    package leasingninja.sales.ui;
    package leasingninja.sales.domain;
    package leasingninja.sales.infrastructure;

    View Slide

  96. @hschwentner
    package leasingninja.sales.ui;
    package leasingninja.sales.domain;
    package leasingninja.sales.infrastructure;
    package leasingninja.sales.api;

    View Slide

  97. @hschwentner
    /*
    module-info.java
    */
    module leasingninja.sales {
    exports leasingninja.sales.api;
    }

    View Slide

  98. leasingninja.sales.api
    leasingninja.sales.*
    Interface
    Not accessible
    from outside

    View Slide

  99. @hschwentner
    /*
    module-info.java
    */
    module leasingninja.riskmanagement {
    requires leasingninja.sales;
    }

    View Slide

  100. RISK
    MANAGE-MENT
    SALES

    View Slide

  101. Rule:
    reverse domain names

    View Slide

  102. @hschwentner
    /*
    module-info.java
    */
    module de.wps.leasingninja.sales {
    exports de.wps.leasingninja.sales.api;
    }

    View Slide

  103. @hschwentner
    /*
    module-info.java
    */
    module de.wps.leasingninja.riskmanagement {
    requires de.wps.leasingninja.sales;
    }

    View Slide

  104. @hschwentner
    Modular JAR

    View Slide

  105. @hschwentner
    Maybe even better fitting:
    services mit
    uses/provides with

    View Slide

  106. @hschwentner
    Multiple Models in .NET

    View Slide

  107. @hschwentner
    How?

    View Slide

  108. Assembly

    View Slide

  109. @hschwentner
    1 bounded context
    =
    1 DLL

    View Slide

  110. namespace Leasingninja.Sales
    {
    class LeasingContract { /*...*/ }
    }
    namespace Leasingninja.Riskmanagement;
    {
    class LeasingContract { /*...*/ }
    }

    View Slide

  111. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()
    <>
    Leasingninja.Sales
    <>
    Leasingninja.Riskmanagement

    View Slide

  112. @hschwentner
    Architecture inside a
    Bounded Context (DLL)

    View Slide

  113. @hschwentner
    namespace Leasingninja.Sales.UI {}
    namespace Leasingninja.Sales.Application {}
    namespace Leasingninja.Sales.Domain {}
    namespace Leasingninja.Sales.Infrastructure {}

    View Slide

  114. @hschwentner
    namespace Leasingninja.Sales.UI {}
    namespace Leasingninja.Sales.Application {}
    namespace Leasingninja.Sales.Domain {}
    namespace Leasingninja.Sales.Infrastructure {}
    namespace Leasingninja.Sales {}

    View Slide

  115. @hschwentner
    namespace Leasingninja.Sales.Domain
    {
    [Entity]
    internal class LeasingContract { /*...*/ }
    }
    namespace Leasingninja.Sales
    {
    [DomainEvent]
    public class ContractSigned { /*...*/ }
    }

    View Slide

  116. Leasingninja.Sales
    Leasingninja.Sales.UI
    Leasingninja.Sales.Application
    Leasingninja.Sales.Domain
    Leasingninja.Sales.Infrastructure
    Interface
    Not accessible
    from outside

    View Slide

  117. RISK
    MANAGE-MENT
    SALES

    View Slide

  118. @hschwentner
    Multiple Models in PHP

    View Slide

  119. @hschwentner
    How?

    View Slide

  120. Namespace

    View Slide

  121. @hschwentner
    1 bounded context
    =
    1 namespace

    View Slide

  122. namespace Leasingninja\Sales;
    class LeasingContract { /*...*/ }
    >
    namespace Leasingninja\Riskmanagement;
    class LeasingContract { /*...*/ }
    >

    View Slide

  123. FQCN
    (Fully qualified class name =
    full namespace + class name)

    View Slide

  124. <>
    LeasingContract
    sign()
    <>
    LeasingContract
    vote()
    <>
    Leasingninja.Sales
    <>
    Leasingninja.Riskmanagement

    View Slide

  125. Problems:
    * No encapsulation
    * only a logical group of
    classes

    View Slide

  126. But: all classes of a bounded
    context in one namespace ->
    better than nothing

    View Slide

  127. @hschwentner
    Architecture inside a
    Bounded Context

    View Slide

  128. @hschwentner
    namespace Leasingninja\Sales\UI;
    namespace Leasingninja\Sales\Application;
    namespace Leasingninja\Sales\Domain;
    namespace Leasingninja\Sales\Infrastructure;

    View Slide

  129. @hschwentner
    namespace Leasingninja\Sales\UI;
    namespace Leasingninja\Sales\Application;
    namespace Leasingninja\Sales\Domain;
    namespace Leasingninja\Sales\Infrastructure;
    namespace Leasingninja\Sales;

    View Slide

  130. Leasingninja.Sales
    Leasingninja.Sales.UI
    Leasingninja.Sales.Application
    Leasingninja.Sales.Domain
    Leasingninja.Sales.Infrastructure
    Interface
    (should)
    not be
    accessible from
    outside

    View Slide

  131. Convention:
    Access only 1 dot
    2 dot only in same BC

    View Slide

  132. RISK
    MANAGE-MENT
    SALES

    View Slide

  133. View Slide

  134. @hschwentner
    Multiple Models with
    Microservices

    View Slide

  135. View Slide

  136. View Slide

  137. View Slide

  138. Distributed System

    View Slide

  139. Fallacies of distributed
    computing:
    The network is reliable.
    Latency is zero.
    Bandwidth is infinite.
    The network is secure.
    Topology doesn't change.
    There is one administrator.
    Transport cost is zero.
    The network is homogeneous.

    View Slide

  140. Verticals
    Self-Contained Systems
    Microservices

    View Slide

  141. View Slide

  142. View Slide

  143. Micro-
    service A
    Presentation
    Domain
    Infrastructure
    Application
    Micro-
    service B
    Direct Access
    to DB
    Micro-
    service C

    View Slide


  144. View Slide

  145. View Slide

  146. View Slide

  147. View Slide

  148. @hschwentner
    Independent Deployability

    View Slide

  149. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  150. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  151. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  152. RISK
    MANAGE-MENT
    SALES

    View Slide

  153. RISK
    MANAGE-MENT

    View Slide

  154. RISK
    MANAGE-MENT
    SALES

    View Slide

  155. @hschwentner
    Core Domain

    View Slide

  156. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  157. Team Emma
    Team Berta
    Team Erna
    Team Lisl

    View Slide

  158. View Slide

  159. View Slide

  160. RISK
    MANAGE-MENT
    SALES

    View Slide

  161. View Slide

  162. @hschwentner
    How to split the monolith

    View Slide

  163. 1) How should it be?
    2) How is it?
    3) How to move the “is” to the “ideal”?
    RISK
    MANAGE-
    MENT
    SALES

    View Slide

  164. 1) How should it be?
    1) Collaborative Modelling
    2) “ideal” context map
    2) How is it?
    1) Architecture Analysis
    2) As-is context map
    3) How to move the “is” to the “ideal”?
    1) Extract a supporting domain to learn
    2) Then extract core(s)

    View Slide

  165. <>
    LeasingContract
    sign()
    vote()
    SALES
    RISK
    MANAGEMENT
    <>
    LeasingContract
    sign()
    vote()
    BIG BALL
    OF MUD
    <>
    LeasingContract
    sign()
    vote()

    View Slide

  166. @hschwentner
    Always Microservices?

    View Slide

  167. Simon Brown

    View Slide

  168. Distributed
    Big Ball Of Mud
    Modulith Microservices
    Monolithic
    Big Ball Of Mud

    View Slide

  169. View Slide

  170. @hschwentner
    Consulting

    View Slide

  171. @hschwentner
    Team organization

    View Slide

  172. View Slide

  173. View Slide

  174. View Slide

  175. “Organizations which design systems
    are constrained to produce designs
    which are copies of the
    communication structures of
    these organizations.”
    Melvin Conway

    View Slide

  176. Melvin Conway
    (1967)
    “Organizations which design systems
    are constrained to produce designs
    which are copies of the
    communication structures of
    these organizations.”

    View Slide

  177. “The organization of the software and
    the organization of the software team
    will be congruent.”
    Eric Raymond

    View Slide

  178. “If you have four groups working on a compiler,
    you'll get a 4-pass compiler.”
    Eric Raymond

    View Slide

  179. @hschwentner
    Conclusion

    View Slide

  180. 1. Model your domain
    2. Split => several models
    (3. Distribute models)

    View Slide

  181. Strategic Design must
    Microservices can

    View Slide

  182. @hschwentner
    Further Reading

    View Slide

  183. @hschwentner
    LeasingNinja.io

    View Slide

  184. @hschwentner
    speakerdeck.com/hschwentner

    View Slide

  185. Foto: H. Schwentner

    View Slide

  186. Foto: H. Schwentner

    View Slide

  187. Foto: Amazon

    View Slide

  188. View Slide

  189. View Slide

  190. 15$ online:
    leanpub.com/domainstorytelling
    Frag mich nach
    Deiner Kopie
    Einführung mit allem
    was man wissen muss
    Überblick
    Rabatt!
    https://leanpub.com/domainstorytelling/c/wjax2019

    View Slide

  191. @hschwentner
    What now?

    View Slide

  192. @hschwentner
    Consulting

    View Slide

  193. View Slide

  194. Workshop
    Domain-Driven Design concrete
    wps.de/ddd

    View Slide

  195. @hschwentner
    Foto: Henning Schwentner

    View Slide

  196. View Slide

  197. View Slide

  198. View Slide

  199. @hschwentner
    FEEDBACK

    View Slide

  200. View Slide

  201. View Slide

  202. View Slide

  203. View Slide

  204. View Slide

  205. View Slide

  206. Henning Schwentner
    @hschwentner
    [email protected]
    DDD
    DDD
    Slides: speakerdeck.com/hschwentner
    Book: leanpub.com/domainstorytelling

    View Slide