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

Goにおける API Client実装パターン / API Client implementation pattern in Go

mtskhs
October 28, 2019

Goにおける API Client実装パターン / API Client implementation pattern in Go

Go Conference 2019 Autumn における登壇資料(Level:Beginner)です。

- マイクロサービスアーキテクチャによる開発が普及してきている現在、REST APIにおけるHTTPリクエスト処理が求められる場面は多い。その際、APIリクエストに関する重要な概念を理解し、Clientとして適切に実装することが求められる。

- 本発表では、マイクロサービス間のデータ連携システムを開発・運用した経験を持つ発表者が、HTTPリクエスト処理に関する「重要な概念とGoにおける実装パターン」や「よくある実装パターン」について述べる。

- サンプルコード:https://github.com/matsu0228/apiClientExample-GoConference2019Autumn
- Goにおけるテストについては、 [AgileTestingDays2018に参加して、Goにおけるテストノウハウを整理した](https://qiita.com/matsu0228/items/c9f69b036f0ab47b617e) 記事もおすすめです。

mtskhs

October 28, 2019
Tweet

More Decks by mtskhs

Other Decks in Technology

Transcript

  1. About me 松木久幸 @mtskhs Backend Engineer Gopher Dojo 1期生 2

    Service • EC @ NTT Resonant • スポーツAI解説アプリ(SpoLive) @ NTT Communications Interest • Agile (シリコンバレーで3ヶ月働いて 体感した自律型組織のススメ) https://speakerdeck.com/matsu0228/organizationtheory-of-engineering • Agile Testing Days 2018 レポート https://speakerdeck.com/matsu0228/report-of-agiletestingdays2018
  2. Bad Example of API Client 考えるべきこと 6 • エラーコード(200 OK以外)が返

    却されたら? • ネットワークが一時的に切断され たら? • 利用するAPIが複雑化(認証が追 加される・リクエストの種類増える 等)したら? • `net/http` を使えば簡単?!
  3. Contents 1. 重要な概念とGoにおける実装 1.1. エラー時のリトライ処理 1.2. 冪等性の担保 1.3. RequestOptionsを用いた汎用的な設計 2.

    よくある実装パターン 2.1. JSON decode pattern 2.2. 認証 2.3. Test設計 7 Sample Code : https://github.com/matsu0228/apiClientExample-GoConference2019Autumn
  4. Idempotency - 冪等性の担保 よくある事例 • 100件のPOST通信のうち90件は成功・10件失敗した場合、 すでに処理済みのものを再度POSTしたら、処理済エラーが返却され てバッチがコケる • サービスAへの処理は成功したが、サービスBへの処理は失敗した

    (RDBでいうトランザクション) 解決策 • 手元で、処理IDと処理ステータスをもたせる ◦ 成功した90件: 処理済 / 失敗の10件: 未処理のまま ◦ サービスAは成功 / Bは未処理 (リトライ or Aの取り消し) 12
  5. Highly scalable design - 汎用的な実装 • request生成時に考えること ◦ ドメインは初期設定 +

    リクエスト毎にURL Path設定 ◦ 各リクエストに、共通のHeader追加 ◦ リクエストごとに、固有のHeader追加 13
  6. Contents 1. 重要な概念とGoにおける実装 1.1. エラー時のリトライ処理 1.2. 冪等性の担保 1.3. RequestOptionsを用いた汎用的な設計 2.

    よくある実装パターン 2.1. JSON decode pattern 2.2. 認証 2.3. Test設計 17 Sample Code : https://github.com/matsu0228/apiClientExample-GoConference2019Autumn
  7. Testing strategy 26 refer from: https://deeeet.com/writing/2016/10/25/go-interface-testing/ “Symmetric API Testing” •

    レスポンス結果をローカルディスクに保存 • テストに上記ファイルを利用して試験(httptestレスポンスとして設定する等)