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

Architecture & Go kit

morikuni
September 21, 2018

Architecture & Go kit

morikuni

September 21, 2018
Tweet

More Decks by morikuni

Other Decks in Programming

Transcript

  1. DDD (ドメイン駆動設計) • データではなくドメインモデルを中 心とした設計 • 境界付けられたコンテキストに従っ てサービスを分割する Sales Context

    Opportunity Support Context Territory Customer Product Pipeline Ticket Customer Product 境界付けられたコンテキスト : モデルが有効な範囲
  2. Event Storming • モデリング手法 • ビジネス内で発生するイベントを洗 い出す ◦ TicketCreated ◦

    ProductSold • イベントの関連が理解しやすいよ うなモデルを構築する https://www.slideshare.net/aloyer/event-storming-notes
  3. Go kitの思想 • Service ◦ Business logicを書くところ • Endpoint ◦

    Serviceを抽象化するところ • Transport ◦ HTTPやgRPCからEndpointを呼び出すところ
  4. Service • 通常のGoのinterfaceとして定義する type Service interface { Sum(ctx context.Context, a,

    b int) (int, error) Concat(ctx context.Context, a, b string) (string, error) }
  5. Endpoint • Go kitが提供しているinterface • RequestとResponseを interface{} で抽象化している type Endpoint

    func(ctx context.Context, request interface{}) (response interface{}, err error) type Middleware func(Endpoint) Endpoint
  6. Transport (HTTP) type DecodeRequestFunc func(context.Context, *http.Request) (request interface{}, err error)

    type EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error func NewService( e endpoint.Endpoint, dec DecodeRequestFunc, enc EncodeResponseFunc, options ...ServerOption, ) *Server // implements http.Handler
  7. Transport (gRPC) type DecodeRequestFunc func(context.Context, interface{}) (request interface{}, err error)

    type EncodeResponseFunc func(context.Context, interface{}) (response interface{}, err error) func NewService( e endpoint.Endpoint, dec DecodeRequestFunc, enc EncodeResponseFunc, options ...ServerOption, ) *Server
  8. パッケージ構成 ❏ cmd ❏ internal ❏ auth ❏ service.go ❏

    endpoints.go ❏ transport.go ❏ dna ❏ ctxlog ❏ usage • main以外をinternalパッケー ジに突っ込んでいる ◦ 別のプロジェクトからは参照不 可 ◦ IDEなどの補完にも出ない • Flat package ◦ 境界づけられたコンテキスト ◦ authにserviceからtransportまで 入っている
  9. ブロックで初期化 • 初期化したい変数を定義 • ブロックを作って初期化 • 一時変数を閉じ込める ◦ ブロック ⇔

    関数 var authrepo *auth.SQLiteRepository { var err error authrepo, err = auth.NewSQLiteRepository(*authURN) if err != nil { logger.Log("during", "auth.NewSQLiteRepository", "err", err) os.Exit(1) } } var authsvc *auth.Service { authsvc = auth.NewService(authrepo, authEventsTotal) } var api http.Handler { r := mux.NewRouter() r.PathPrefix("/auth/").Handler(http.StripPrefix("/auth", auth.NewHTTPTransport(authsvc))) api = ctxlog.NewHTTPMiddleware(r, logger) }
  10. まとめ • マイクロサービス化にあたって ◦ DDD, Event Stormingでモデリング ◦ Go kitで実装

    • 個人的には interface{} はできるだけ避けたいので Go kitは使わなさそう...
  11. • Architecture & Domain Modeling with Go Kit ◦ https://gophers.slack.com/archives/CCF41LFDW/p1535410195000100

    • Go kit ◦ https://github.com/go-kit/kit • Go kit - Architecture and design ◦ https://gokit.io/faq/#design-mdash-how-is-a-go-kit-microservice-modeled • Sympatico ◦ https://github.com/peterbourgon/sympatico 参考資料