Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goaで始めるマイクロサービス
Search
Naoto Kido
June 08, 2025
Technology
0
28
Goaで始めるマイクロサービス
Goaと言うGo言語のフレームワークを使用し、マイクロサービスを構築する最初のステップを解説してます。
Naoto Kido
June 08, 2025
Tweet
Share
More Decks by Naoto Kido
See All by Naoto Kido
ObjectTとは
naoido
0
3
学生団体メンバー向け自己紹介
naoido
0
5
CloudflareでSPA開発
naoido
1
16
Other Decks in Technology
See All in Technology
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
160
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
230
kubellが考える戦略と実行を繋ぐ活用ファーストのデータ分析基盤
kubell_hr
0
140
おやつは300円まで!の最適化を模索してみた
techtekt
PRO
0
270
LLMを搭載したプロダクトの品質保証の模索と学び
qa
0
760
カミナシ社の『ID管理基盤』製品内製 - その意思決定背景と2年間の進化 #AWSUnicornDay / Kaminashi ID - The Big Whys
kaminashi
3
800
DevIO2025_継続的なサービス開発のための技術的意思決定のポイント / how-to-tech-decision-makaing-devio2025
nologyance
0
180
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
19
9k
ChatGPTとPlantUML/Mermaidによるソフトウェア設計
gowhich501
1
120
AWS環境のリソース調査を Claude Code で効率化 / aws investigate with cc devio2025
masahirokawahara
2
1.3k
Autonomous Database - Dedicated 技術詳細 / adb-d_technical_detail_jp
oracle4engineer
PRO
4
9.9k
異業種出身エンジニアが気づいた、転向して十数年経っても変わらない自分の武器とは
macnekoayu
0
290
Featured
See All Featured
Faster Mobile Websites
deanohume
309
31k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
The Language of Interfaces
destraynor
161
25k
Balancing Empowerment & Direction
lara
3
610
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Why Our Code Smells
bkeepers
PRO
339
57k
Practical Orchestrator
shlominoach
190
11k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Become a Pro
speakerdeck
PRO
29
5.5k
Building Applications with DynamoDB
mza
96
6.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Embracing the Ebb and Flow
colly
87
4.8k
Transcript
Goaで始めるマイクロサービス Naoto Kido(なおいど) 1
1. はじめに 自己紹介 名前: Naoto Kido(naoido) 所属: 福岡デザイン&テクノロジー専門学校 3年 好きな言語:
Java, Go 2
2. マイクロサービスとは 3
概要 マイクロサービスとは、モノリス(1つのサーバーに全ての機能が含まれている)とは違い、 1つのアプリケーションを小さな独立したサービスに分割して開発する手法です。 1つのアプリケーションを複数の独立したコンポーネントに分割することで、 従来の開発手法よりビルド、テスト、デプロイ、アップデートを簡単に実行できることになります。 4
マイクロサービスとの出会い ドメイン駆動開発を調査している時にマイクロサービスの存在を知り、 ハッカソンで複数の言語を使用したバックを作成する際に使用したことでマイクロサービスの沼にハマっていきました。 ハッカソン参加したての頃はモノリスでの開発で1つのバックエンドを複数人で同時に作業していました。 しかし、コンフリクトが発生したり、仕様が勝手に書き換えられたりするという問題がありました。 担当箇所をサーバーごと切り分けることでタスクの管理を楽にし、 担当箇所はお気に入りの言語で開発するなどの恩恵をもたらしてくれました。 5
作成したマイクロサービス達 6
刹那 https://topaz.dev/projects/575f49eb3bc26cf370b1 7
QRコード神経衰弱 url: https://topaz.dev/projects/a939290be6545eff5895 8
マイクロサービスのメリット モノリシックな開発でよくあった「デスマーチ」陥る心配が少なくなる。 各ドメインごとにアジャイル開発で同時に作業を進めることができるため、迅速な開発が可能になる。 9
どうやって実装するのか → Goa 10
3. Goaとは 11
公式サイト情報 従来の開発では、実装が設計を主導し、一貫性の欠如や技術的負債につながることがありました。Goaはこのパラダイム を反転させます。設計が唯一の真実の源となり、以下を自動的に生成します。 本番環境対応のサーバーコード 型安全なクライアントライブラリ 包括的なAPIドキュメント トランスポート層の実装(HTTP/gRPC) 入力バリデーションとエラー処理 12
Goaの開発ステップ 1. designを書く 2. designからトランスポート層などの生成 3. ベースのファイル群を生成 4. ビジネスロジックの実装 5.
サーバーを起動 13
1. Designを書く // サービスを定義 var _ = Service("greet", func() {
// サービスの説明 Description("Greet service") // gRPCの有効化・サービス共通のgRPC設定 GRPC(func() { Package("greet.v1") }) // メソッド(エンドポイント)の定義 Method("Greet", func() { Description("Greet method") // 戻り値をStringで定義する Result(String) GRPC(func() { Response(CodeOK) }) }) }) 14
2. designからトランスポート層などの生成 goa gen goa-example/microservices/greet/design 実装に必要なトランスポート層を生成してくれます。 genされたファイルは編集しません。 design.goを変更するたび goa gen
しなおす必要があります。 greet ├── design/ # 生成元のdesginを定義する場所 ├── gen # 生成されたファイル群 │ ├── greet # サービスとクライアントに必要なファイル群 │ │ ├── client.go │ │ ├── endpoints.go │ │ └── service.go │ └── grpc # gRPC関連のファイル群 │ ├── cli │ │ └── greet │ │ └── cli.go │ └── greet │ ├── client/ # このサービスを使うためのクライアントファイル群 │ ├── pb/ # protoやそこから生成されるファイル群 │ │ ├── goagen_greet_greet.pb.go │ │ ├── goagen_greet_greet.proto │ │ └── goagen_greet_greet_grpc.pb.go │ └── server/ ├── go.mod └── go.sum 15
3. ベースのファイル群を生成 goa example goa-example/microservices/greet/design designを元にビジネスロジックを記述するためのベースファイルを生成してくれます。 greet ├── cmd │
├── greet # サーバーを起動するためのファイル群 │ │ ├── grpc.go │ │ └── main.go │ └── greet-cli # クライアント用のファイル群 │ ├── grpc.go │ └── main.go ├── design │ └── design.go ├── gen/ # goa genで生成されたディレクトリ ├── go.mod ├── go.sum └── greet.go # メソッドを実装するファイル 16
4. ビジネスロジックの実装 生成されたファイル(greet.go) // greet service example implementation. // The
example methods log the requests and return zero values. type greetsrvc struct{} // NewGreet returns the greet service implementation. func NewGreet() greet.Service { return &greetsrvc{} } // Greet method func (s *greetsrvc) Greet(ctx context.Context) (res string, err error) { log.Printf(ctx, "greet.Greet") return } 17
5. サーバーを起動 #ビルド $ go build ./cmd/greet #起動 $ ./greet
18
4. モノレポでのディレクトリ構成 19
モノレポでのディレクトリ構成 今回作ったサンプル: https://github.com/naoido/goa-monorepo-example . ├── build # ビルド関連資材 │ └──
Dockerfile ├── go.work # go workspace ├── microservices # マイクロサービスを格納する │ ├── auth │ │ ├── design │ │ │ └── design.go │ │ ├── go.mod │ │ └── go.sum │ ├── chat │ │ ├── chat.go │ │ ├── design │ │ │ └── design.go │ │ ├── go.mod │ │ └── go.sum │ └── greet │ ├── design │ │ └── design.go │ ├── go.mod │ ├── go.sum │ └── greet.go └── pkg # 共通のパッケージを定義 └── security ├── context.go ├── go.mod ├── go.sum └── security.go 20
つまずいた点 goa genでpkg配下で定義したものを使用するため、 go.modでreplaceして相対的に読み込むようにする replace goa-example/pkg/security => ../../pkg/security 21
5. まとめ マイクロサービスを活用することで、ドメイン単位に開発メンバーをアサインし開発をすることができるため、従来より も早く変更に強い開発ができるようになる。 Goaを使用するとDesign-Firstの力で一貫性のあるバックエンド開発を行うことができます。 gRPCを用いたマイクロサービスを作成する場合はより力を発揮するので是非使ってみてください! よきマイクロサービスライフを! 22