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
サーバサイドKotlinでgRPCをやってみよう
Search
Takehata Naoto
September 09, 2019
Programming
1
7.7k
サーバサイドKotlinでgRPCをやってみよう
2019年9月9日 「Kotlin Fest Reject Conference 2019」の発表資料です。
Takehata Naoto
September 09, 2019
Tweet
Share
More Decks by Takehata Naoto
See All by Takehata Naoto
組織貢献をするフリーランスエンジニアという生き方
n_takehata
2
3.1k
「2024年版 Kotlin サーバーサイドプログラミング実践開発」の補講 〜O/Rマッパー編〜
n_takehata
2
630
2024年版 Kotlin サーバーサイドプログラミング実践開発
n_takehata
7
5.5k
Server-Side目線で見る、Kotlin Festの楽しみ方
n_takehata
0
440
KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする
n_takehata
1
1.3k
KotlinConf 2023 現地参加レポート
n_takehata
1
340
サーバーサイドKotlinクイズ
n_takehata
0
210
サーバーサイドでのKotlin Coroutines
n_takehata
0
1.2k
KotlessとDynamoDBで自分のツイートを収集するサーバーレスアプリケーションを作る
n_takehata
0
420
Other Decks in Programming
See All in Programming
Building Scalable Mobile Projects: Fast Builds, High Reusability and Clear Ownership
cyrilmottier
2
260
AIコードエディタの基盤となるLLMのFlutter性能評価
alquist4121
0
200
gen_statem - OTP's Unsung Hero
whatyouhide
1
200
Qiita Bash
mercury_dev0517
1
190
Devin入門と最近のアップデートから見るDevinの進化 / Introduction to Devin and the Evolution of Devin as Seen in Recent Update
rkaga
9
4.8k
Rollupのビルド時間高速化によるプレビュー表示速度改善とバンドラとASTを駆使したプロダクト開発の難しさ
plaidtech
PRO
1
160
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
1.3k
プロダクト横断分析に役立つ、事前集計しないサマリーテーブル設計
hanon52_
2
390
Compose Hot Reload is here, stop re-launching your apps! (Android Makers 2025)
zsmb
1
480
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
150
タイムゾーンの奥地は思ったよりも闇深いかもしれない
suguruooki
1
580
メモリウォールを超えて:キャッシュメモリ技術の進歩
kawayu
0
1.9k
Featured
See All Featured
Done Done
chrislema
183
16k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
It's Worth the Effort
3n
184
28k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.6k
Building Adaptive Systems
keathley
41
2.5k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.3k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.7k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
520
Building Applications with DynamoDB
mza
94
6.3k
Typedesign – Prime Four
hannesfritz
41
2.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Transcript
サーバーサイドKotlinでgRPCをやってみよう ⽵端 尚⼈ @n_takehata 2019/9/9 Kotlin Fest Reject Conference 2019
⾃⼰紹介
概要 ⽵端 尚⼈ 所属:株式会社アプリボット 職種:バックエンドエンジニア 好きな⾔語:Kotlin Twitter:@n_takehata 2006.04 公務員 2007.12
SES 2011.01 サイバーエージェント 2014.04 アプリボット
登壇、執筆など • CEDEC 2018、2019登壇 https://speakerdeck.com/n_takehata/cedec- 2018 • Kotlin Fest 2018登壇(LT⼤会)
• 雑誌Software Design 2019年2〜4⽉号に てサーバーサイドKotlinについての短期連 載執筆
Kotlin Fest 2019に申し込んだテーマ
Kotlin × gRPCを使⽤した次世代のサーバーサイド開発
Rejected…
セッション⼀覧をよく⾒ると
gRPCよりGraphQLなのか︕︕
サーバーサイドKotlinでgRPCをやってみよう ⽵端 尚⼈ @n_takehata 2019/9/9 Kotlin Fest Reject Conference 2019
タイトルパクりました ※ @shiraj_iさんごめんなさい
今⽇はgRPCもいいなって 思ってもらいたいです︕
アジェンダ 1.gRPCとはなにか? 2.Protocol Buffersについて 3.サーバーサイドKotlinでgRPCを使うには
2019/9/9 gRPCとはなにか︖ 1
gRPCとは︖ • Google製のRPCフレームワーク • HTTP/2、Protocol Bufferesを標準でサポートし、ハイパ フォーマンスな通信を実現 • RESTに代わる通信⽅式の⼀つとしても期待されている
特徴
• Protocol Bufferesによるインターフェース定義共通化 • Java、C#、Goなど様々な⾔語に対応 • 各⾔語のコード⾃動⽣成が可能 • HTTP/2による⾼速で柔軟な通信
パフォーマンス(RESTとの⽐較)
平均リクエスト時間 (ms) 平均レスポンス時間 (ms) gRPC 2.92 3.6 REST 7.16 12.78
※2018年3⽉当時の検証結果です リクエストが約2倍、レスポンスが約4倍速かった (条件付き)
2019/9/9 Protocol Buffersについて 2
Protocol Buffersとは︖ • 通信のインターフェースを定義できるIDLの⼀種 • protocというコマンドで、定義ファイルからインターフェース に合わせた様々な⾔語のコードを⽣成できる (Java、C#、C++、Python、Go、Ruby、PHP、Dart) • 定義した構造のバイナリデータで通信する
サンプル
①リクエスト、レスポンスのパラメータを定義 ②APIのインターフェースを定義 .protoという拡張⼦で定義 service Greeter { rpc SayHello (HelloRequest) returns
(HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ① ②
使いたい⾔語を指定してコンパイル
protocコマンドの例(Golang) protoc --go_out=plugins=grpc:../pb hello.proto
⽣成されるコード • Messageのデータ構造に合わせたModelクラス • データのシリアライズ、デシリアライズ • gRPCのサーバー実装のBaseクラス(プラグイン必要) • gRPCのクライアントStub (プラグイン必要)
• etc…
コンパイルイメージ
⽣成したファイルの実⾏イメージ ⾃動⽣成のServer、Stubのプログラムを介して 通信を実装できる
通信部分の実装が容易に • 定義ファイルさえ書けば、パラメータのクラスなどを作成する ⼿間が不要 • サーバー、クライアント間の実装の齟齬も防げる • GraphQLやSwaggerとも通づる機構
2019/9/9 サーバーサイドKotlinでgRPCを使うには 2
KotlinでのgRPCを使うには • ⾃動⽣成のコードはJavaで作成する(Kotlinには⾮対応) • Spring Bootを使っている場合はgrpc-spring-boot-starterを使う のが⼿軽 • コード⽣成はprotocを直接使わず、Gradleプラグインで実⾏で きる
⼿順
Gradleにプラグイン、依存関係を追加 compile("io.github.lognet:grpc-spring-boot-starter:3.3.0") id("com.google.protobuf") version "0.8.9" ①Protocol Buffersをコンパイルするためのプラグイン ②Spring BootでgRPCを扱うためのStarter
コードジェネレータの設定 ①使⽤するprotocのライブラリ、バージョンを指定 ②gRPCのコードを⽣成するプラグインを指定 protobuf { protoc { artifact = "com.google.protobuf:protoc:3.5.1-1"
} plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } } generateProtoTasks { all().each { task -> task.plugins { grpc } } } generatedFilesBaseDir = "$projectDir/src/" } ① ②
コンパイルタスクの実⾏ generateProtoタスクがprotocを実⾏ ./gradlew generateProto
ファイルが⽣成される • xxxOuterClass.java • service、messageで定義したクラスを含むクラス • シリアライズ、デシリアライズなどをやってくれる • xxxGrpc.java •
xxxOuterClassを使⽤してgRPCで通信するサーバー処理やクライアン トStubなどを含んだクラス
サーバー側のコードの実装 ①⾃動⽣成のBaseクラスを継承 ②gRPCのサービスとして起動時に読み込ませるアノテーション @GRpcService class GreeterService: GreeterGrpc.GreeterImplBase() { override fun
sayHello(request: HelloRequest, responseObserver: StreamObserver<HelloReply>) { val replyBuilder = HelloReply.newBuilder().setMessage("Hello " + request.name) responseObserver.onNext(replyBuilder.build()) responseObserver.onCompleted() } } ① ②
クライアント側のコードの実装 ①接続の設定 ②Stubのインスタンス⽣成 ③Stubのメソッド実⾏ fun execSayHello(name: String) { val request
= HelloRequest.newBuilder().setName(name).build() val channel = ManagedChannelBuilder.forAddress("localhost", 6565).build() val stub = GreeterGrpc.newBlockingStub(channel) stub.sayHello(request) } ① ② ③
まとめ
サーバーサイドKotlinでgRPCを使うには • Gradleにprotobufのプラグイン、grpc-spring-boot-starterの依存関係 を追加 • protoファイルを定義しコンパイル • ⽣成されたコードを継承し、アノテーションを付けて実装 参考: https://blog.takehata-engineer.com/entry/server-side-kotlin-grpc-project-
creation-to-start-confirmation
ご清聴ありがとうございました