Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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.6k
サーバサイド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
「2024年版 Kotlin サーバーサイドプログラミング実践開発」の補講 〜O/Rマッパー編〜
n_takehata
2
480
2024年版 Kotlin サーバーサイドプログラミング実践開発
n_takehata
6
3.8k
Server-Side目線で見る、Kotlin Festの楽しみ方
n_takehata
0
340
KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする
n_takehata
1
340
KotlinConf 2023 現地参加レポート
n_takehata
1
310
サーバーサイドKotlinクイズ
n_takehata
0
170
サーバーサイドでのKotlin Coroutines
n_takehata
0
1.1k
KotlessとDynamoDBで自分のツイートを収集するサーバーレスアプリケーションを作る
n_takehata
0
370
書籍『Kotlin サーバーサイドプログラミング実践開発』のこだわりとおすすめポイント
n_takehata
0
510
Other Decks in Programming
See All in Programming
カンファレンスの「アレ」Webでなんとかしませんか? / Conference “thing” Why don't you do something about it on the Web?
dero1to
1
150
Full stack testing :: basic to basic
up1
1
810
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
3
360
DevTools extensions で 独自の DevTool を開発する | FlutterKaigi 2024
kokiyoshida
0
290
Arm移行タイムアタック
qnighy
0
390
社内活動の取り組み紹介 ~ スリーシェイクでこんな取り組みしてます ~
bells17
0
370
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
470
Remix on Hono on Cloudflare Workers
yusukebe
1
390
かんたんデザイン編集やってみた~「完全に理解した」までの道のり~
morit4ryo
1
110
TypeScript でバックもやるって実際どう? 実運用で困ったこと3選
yuichiro_serita
17
7.4k
Jakarta EE meets AI
ivargrimstad
0
460
事業成長を爆速で進めてきたプロダクトエンジニアたちの成功談・失敗談
nealle
3
1.1k
Featured
See All Featured
Ruby is Unlike a Banana
tanoku
97
11k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
0
61
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
KATA
mclloyd
29
14k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
A Modern Web Designer's Workflow
chriscoyier
693
190k
How to train your dragon (web standard)
notwaldorf
88
5.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
17k
Six Lessons from altMBA
skipperchong
27
3.5k
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
ご清聴ありがとうございました