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

GoとMicroserviceでDDDやってみました

 GoとMicroserviceでDDDやってみました

hitsuji-haneta

April 20, 2020
Tweet

More Decks by hitsuji-haneta

Other Decks in Programming

Transcript

  1. やってみました
    Go
    MicroService
    DDD


    2020/04/20
    DDD Talk Meetup Online

    View Slide

  2. 高橋翔太
    hitsuji-haneta
    LasTrust株式会社
    h1tsuj1_haneta
    https://lastrust.io
    ・ブロックチェーン証明書の発行
    ・証明書の管理アプリの開発
    (ヒツジハネタ)
    ࣗݾ঺հ

    View Slide

  3. 教育機関・金融機関・自治体など
    ࣗݾ঺հ
    個人の見えざる価値を可視化する

    View Slide

  4. Go
    Sendai
    2020/7/4
    Conference

    View Slide

  5. Go言語+MicroServicesで構築していた
    弊社サービスにDDDを導入してみました
    ・DDDを導入しようとしたきっかけ
    ・マイクロサービスから見たDDD
    ・Go言語から見たDDD(アーキテクチャ)
    ・所感

    View Slide

  6. DDDは初心者です
    よくない設計もあるかも知れないので
    お気づきの方は懇親会で教えて下さい

    View Slide

  7. Service A
    Service C
    Service B
    %%%ಋೖͷ͖͔͚ͬɹ
    サービスの数が増えてきた
    ○○を元にした設計
    ✕✕な感じの設計
    Service D Service E
    △△風な設計
    つらい…

    View Slide

  8. %%%ಋೖͷ͖͔͚ͬɹ
    → ちゃんとドキュメントを残せばいい?
    → 最小限にしたい
    → チームとして共通の設計認識を持って
      それを規律としていきたい
    個々のサービスの設計思想がバラバラ&追えない
    DDDはどうだろう??

    View Slide

  9. Go言語
    マイクロサービス

    View Slide

  10. Go言語
    マイクロサービス

    View Slide

  11. ϚΠΫϩαʔϏε͔Βݟͨ%%%ɹ
    Service A
    Service C
    Service B
    DDDを元にした設計
    DDDを元にした設計
    Service D Service E
    DDDを元にした設計
    見やすい!
    レビューしやすい!

    View Slide

  12. ϚΠΫϩαʔϏε͔Βݟͨ%%%ɹ
    Service A
    Service C
    Service B
    Service D Service E
    予期していなかった効果
    → 境界づけられたコンテキスト
    実はマージした方が
    いいのでは?

    View Slide

  13. ϚΠΫϩαʔϏε͔Βݟͨ%%%ɹ
    それまで
    「責務の分離」に応じてサービスを区切っていた
    DDD導入後
    BUT 意外にそこの解釈は人による…
    基準ができた!

    View Slide

  14. Go言語
    マイクロサービス

    View Slide

  15. (Pݴޠ͔Βݟͨ%%%ɹ
    Go言語の特徴
    ・実行速度が速い
    ・並列処理が簡単
    ・シンプルな言語構造
    Class構文がない
    Interfaceはある
    でも継承はない

    View Slide

  16. (Pݴޠ͔Βݟͨ%%%ɹ
    どういうこと?
    type dog struct {
    id uint
    name string
    }
    func(d *dog) Cry() string {
    return “Bow!"
    }
    type Animal interface {
    Cry() string
    }
    func test(a Animal) {
    fmt.Printf(a.Cry())
    }
    メソッドは構造体(struct)に紐付ける
    Interfaceに定義されたメソッドと
    同じものが定義された構造体はそ
    のInterfaceとして使用できる

    View Slide

  17. (Pݴޠ͔Βݟͨ%%%ɹ
    Goで有名な考え方
    accept interfaces, return structs.
    関数はインターフェースを受け入れて
    構造体を返すように作りましょう

    View Slide

  18. type someStc struct {
    id uint
    name string
    }
    type SomeIf interface {
    CreateStc() someStc
    }
    func Test(i SomeIf) *someStc {
    return i.CreateStc
    }
    (Pݴޠ͔Βݟͨ%%%ɹ
    Func
    Interface
    ダックタイピングに近い
    Interfaceは使う人が定義する
    (同じpackage内とか)
    Struct

    View Slide

  19. (Pݴޠ͔Βݟͨ%%%ɹ
    IssueCertificate()
    Issuerドメイン
    証明書を発行して
    ストレージに格納
    S3 GCS ファイル
    システム
    Storage
    Adapter
    S3
    Adapter
    外から渡す
    インターフェースは
    どこで定義する?

    View Slide

  20. (Pݴޠ͔Βݟͨ%%%ɹ
    Issuerドメイン
    IssueCertificate()
    Storage
    Adapter
    S3
    Adapter
    Interfaceは使う人が定義
    シンプルになった!

    View Slide

  21. まとめ
    ・マイクロサービスの設計に明確な基準ができた
    ・「accept interfaces, return structs.」の
      考え方を使えば置き場所の悩みがスッキリする
    懸念
    ・Interfaceの置き方がコレでいのかという
     不安はある。詳しい方の見解聞きたい!

    View Slide

  22. ありがとうございました!

    View Slide