$30 off During Our Annual Pro Sale. View Details »

goaを使ったAPI開発/api-development-with-goa

decafe09
March 25, 2017

 goaを使ったAPI開発/api-development-with-goa

decafe09

March 25, 2017
Tweet

More Decks by decafe09

Other Decks in Technology

Transcript

  1. goaΛ࢖ͬͨAPI։ൃ
    Go Conference 2017 Spring / @decafe09

    View Slide

  2. ࣗݾ঺հ
    খ໺ࣉ ढ़໵ (@decafe09)
    • γφδʔϚʔέςΟϯάגࣜձࣾ
    • Goྺ 2೥

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    goaΛ࢖ͬͨAPI։ൃͰࠔͬͨ͜ͱͱղܾࡦ

    View Slide

  4. goa
    https://github.com/goadesign/goa
    • ϚΠΫϩαʔϏε޲͚ϑϨʔϜϫʔΫ
    • DSLͰॻ͍ͨAPIσβΠϯ͔Βίʔυ΍
    SwaggerΛੜ੒Ͱ͖Δ

    View Slide

  5. ։ൃͷྲྀΕ

    View Slide

  6. design
    DSL
    DSLͰAPIσβΠϯΛॻ͘

    View Slide

  7. var _ = Resource("account", func() {
    DefaultMedia(Account)
    BasePath("/accounts")
    Action("show", func() {
    Routing(
    GET("/:accountID"),
    )
    Description("Retrieve account with given id.")
    Params(func() {
    Param("accountID", Integer, "Account ID", func() {
    Minimum(1)
    })
    })
    Response(OK)
    Response(NotFound)
    Response(BadRequest, ErrorMedia)
    })
    }
    DSLͰͷσβΠϯ

    View Slide

  8. goagen ίϚϯυͰίʔυੜ੒
    Swagger΋ੜ੒Ͱ͖Δ
    design API
    DSL goagen

    View Slide

  9. ίʔυੜ੒
    goagen ίϚϯυͰίʔυੜ੒
    ެࣜαϯϓϧ https://github.co/goadesign/goa-cellar
    goagen main -d github.com/goadesign/goa-cellar/design
    ੜ੒ର৅ σβΠϯ

    View Slide

  10. func main() {
    // Create service
    service := goa.New("cellar")
    // Mount middleware
    service.Use(middleware.RequestID())
    service.Use(middleware.LogRequest(true))
    service.Use(middleware.ErrorHandler(service, true))
    service.Use(middleware.Recover())
    // Mount "account" controller
    c := NewAccountController(service)
    app.MountAccountController(service, c)
    // Start service
    if err := service.ListenAndServe(":8081"); err != nil {
    service.LogError("startup", "err", err)
    }
    }
    ੜ੒͞Εͨίʔυ

    View Slide

  11. ੜ੒͞ΕͨίʔυΛϕʔεʹ࣮૷
    design API
    ࣮૷

    View Slide

  12. func main() {
    // Create service
    service := goa.New("cellar")
    // Mount middleware
    service.Use(myMiddleware.RestrictIP())
    service.Use(middleware.RequestID())
    service.Use(middleware.LogRequest(true))
    service.Use(middleware.ErrorHandler(service, true))
    service.Use(middleware.Recover())
    // Mount "account" controller
    c := NewAccountController(service)
    app.MountAccountController(service, c)
    // Start service
    if err := service.ListenAndServe(":8081"); err != nil {
    service.LogError("startup", "err", err)
    }
    }
    service.Use(myMiddleware.RestrictIP())
    ϛυϧ΢ΣΞΛ௥Ճ

    View Slide

  13. ಥવͷAPI࢓༷มߋʂ
    ʢ͋Δ͋Δʣ

    View Slide

  14. DSLΛमਖ਼ͯ͠goagenͰίʔυ࠶ੜ੒
    design API
    goagen ࠶ੜ੒
    मਖ਼

    View Slide

  15. ੜ·ΕΔࠩ෼
    design API
    ࠶ੜ੒
    API
    ࣮૷

    View Slide

  16. खಈͰͷࠩ෼Ϛʔδ
    design API
    ࠶ੜ੒
    API
    ࣮૷

    View Slide

  17. ΍ͬͯΒΕΔ͔ͬʂ

    View Slide

  18. ։ൃΛ࢝ΊΔͱࠔΔͱ͜Ζ
    σβΠϯͷมߋͰίʔυΛ࠶ੜ੒͢Δࡍɺɹɹ
    ࠩ෼Λݟͳ͕ΒखಈϚʔδ͠ͳ͍ͱ͍͚ͳ͍ɻ

    View Slide

  19. ։ൃΛ࢝ΊΔͱࠔΔͱ͜Ζ
    σβΠϯͷมߋͰίʔυΛ࠶ੜ੒͢Δࡍɺɹɹ
    ࠩ෼Λݟͳ͕ΒखಈϚʔδ͠ͳ͍ͱ͍͚ͳ͍ɻ
    ɹɹɹɹɹσβΠϯʹґଘ͠ͳ͍෦෼͕
    ɹɹɹɹɹੜ੒͞ΕΔίʔυʹؚ·Ε͍ͯΔ

    View Slide

  20. func main() {
    // Create service
    service := goa.New("cellar")
    // Mount middleware
    service.Use(middleware.RequestID())
    service.Use(middleware.LogRequest(true))
    service.Use(middleware.ErrorHandler(service, true))
    service.Use(middleware.Recover())
    // Mount "account" controller
    c := NewAccountController(service)
    app.MountAccountController(service, c)
    // Start service
    if err := service.ListenAndServe(":8081"); err != nil {
    service.LogError("startup", "err", err)
    }
    }
    σβΠϯʹґଘ͠ͳ͍

    View Slide

  21. σβΠϯ͔Βࣗ෼ͷ࢖͍΍͍͢Α͏ʹίʔυੜ੒͍ͨ͠

    View Slide

  22. ͦΕpluginͰͰ͖ΔΑ

    View Slide

  23. goa Plugin Generators
    https://goa.design/extend/generators/
    goagenͷpluginͰDSL͔Βࣗ༝ʹίʔυੜ੒
    goagen gen -d github.com/goadesign/goa-cellar/design \
    —pkg-path=/go/path/to/genresnames
    goagen gen
    plugin

    View Slide

  24. goagen main
    templateमਖ਼͢Δ͚ͩͰ͍͚Δʂ
    https://github.com/goadesign/goa/blob/v1.1.0/goagen/gen_main/
    generator.go

    View Slide

  25. func main() {
    // Create service
    service := goa.New("cellar")
    // Mount middleware
    service.Use(middleware.RequestID())
    service.Use(middleware.LogRequest(true))
    service.Use(middleware.ErrorHandler(service, true))
    service.Use(middleware.Recover())
    // Mount "account" controller
    c := NewAccountController(service)
    app.MountAccountController(service, c)
    // Start service
    if err := service.ListenAndServe(":8081"); err != nil {
    service.LogError("startup", "err", err)
    }
    }
    ͜ΕΛ

    View Slide

  26. func main() {
    // Create service
    service := goa.New("cellar")
    // Mount middleware
    mountMiddleware(service)
    // Mount "account" controller
    c := NewAccountController(service)
    app.MountAccountController(service, c)
    // Start service
    if err := service.ListenAndServe(":8081"); err != nil {
    service.LogError("startup", "err", err)
    }
    }
    ͜͏ʂ

    View Slide

  27. ϑΝΠϧΛ෼͚Δ
    // middleware.go
    func mountMiddleware(service *goa.Service) {
    // Put Your Code
    service.Use(middleware.RequestID())
    service.Use(middleware.LogRequest(true))
    service.Use(middleware.ErrorHandler(service, true))
    service.Use(middleware.Recover())
    }
    main.go͔Β੾Γग़ͯ͠ɺผϑΝΠϧʹ͢Δɻ
    ϛυϧ΢ΣΞ͕૿͑ͯ΋ίʔυੜ੒ͷӨڹΛड͚ͳ͍

    View Slide

  28. ࢓༷มߋʹ଱͑ΒΕΔʂ

    View Slide

  29. ΄͔ʹ΋΍Γํ͸͋Δͱࢥ͍·͕͢

    View Slide

  30. goagenͰࠔͬͨΒ
    plugin࡞ͬͯΈ·͠ΐ͏

    View Slide

  31. ͓·͚

    View Slide

  32. swrt
    https://github.com/decafe09/swrt
    swagger.jsonͷϧʔςΟϯάΛCLIͰ֬ೝɻ
    $ swrt -f swagger/swagger.json
    http://localhost:8081
    GET /cellar/_ah/health
    GET /cellar/accounts
    POST /cellar/accounts
    GET /cellar/accounts/{accountID}
    PUT /cellar/accounts/{accountID}
    DELETE /cellar/accounts/{accountID}
    GET /cellar/accounts/{accountID}/bottles

    View Slide

  33. ΈΜGoಡΜͰ࡞Γ·ͨ͠

    View Slide

  34. goaͷࢀߟαΠτ
    • ެࣜαΠτ https://goa.design/ja/
    ೔ຊޠ൛͋Γ͕ͱ͏͍͟͝·͢ m(_ _)m
    • goaΛ࢝ΊΑ͏ @ikawaha ͞Μ
    http://ikawaha.hateblo.jp/entry/
    2016/09/11/095129
    ͱͯ΋Θ͔Γ΍͍͢Ͱ͢ m(_ _)m

    View Slide

  35. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide