Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Evans: more expressive gRPC client
ktr
February 20, 2018
Programming
0
4.2k
Evans: more expressive gRPC client
ktr
February 20, 2018
Tweet
Share
More Decks by ktr
See All by ktr
Designing libraries in Go way
ktr_0731
6
1.3k
Go Modules and Proxy Walkthrough
ktr_0731
8
25k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
140
Fuzzy finder as a Go library
ktr_0731
3
4.7k
つよくてニューゲーム / NewGame++
ktr_0731
0
800
やはり俺の Go アプリケーション設計はまちがっている。 / My Go Application Design Is Wrong, As I Expected
ktr_0731
13
3.2k
GopherCon2018
ktr_0731
2
1.5k
Evans: more expressive gRPC client
ktr_0731
2
320
自作 CLI ツールのワークフローとそれを支える技術 / the workflow of my CLI tool and technologies which supports it
ktr_0731
0
1.5k
Other Decks in Programming
See All in Programming
新卒でサービス立ち上げから Hasuraを使って3年経った振り返り
yutorin
0
180
AWS App Runnerがそろそろ本番環境でも使い物になりそう
n1215
PRO
0
820
なぜRubyコミュニティにコミットするのか?
luccafort
0
290
はてなリモートインターンシップ2022 フロントエンドブートキャンプ 講義資料
hatena
0
110
状態ってなに?🙃
taro28
0
250
Findy - エンジニア向け会社紹介 / Findy Letter for Engineers
findyinc
2
42k
PHPDocにおける配列の型定義を少し知る
shimabox
1
110
%q is for Quine
koic
0
390
Most Valuable Bug(?) ~インシデント未遂から得た学び~
tatsumiakahori
0
140
「自律型開発組織」を目指すCTOの、試行錯誤の記録
ar_tama
1
200
量子コンピュータ時代のプログラミングセミナー / 20221222_Amplify_seminar _route_optimization
fixstars
0
240
中小企業開発事例から見るサーバーレス
seike460
PRO
4
1.5k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
500
130k
Building Better People: How to give real-time feedback that sticks.
wjessup
346
17k
A designer walks into a library…
pauljervisheath
198
16k
Embracing the Ebb and Flow
colly
75
3.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
2
390
Bootstrapping a Software Product
garrettdimon
299
110k
The Language of Interfaces
destraynor
149
21k
It's Worth the Effort
3n
177
26k
Into the Great Unknown - MozCon
thekraken
2
270
Visualization
eitanlees
128
12k
Rebuilding a faster, lazier Slack
samanthasiow
69
7.5k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.8k
Transcript
at Go 1.10 Release Party in Tokyo more expressive gRPC
client Evans
XIPBNJ !cJE
[email protected]
ձେֶֶ෦ ιϥϛπגࣜձࣾαʔόΤϯδχΞ
at Go 1.10 Release Party in Tokyo more expressive gRPC
client Evans
None
ΞδΣϯμ w H31$ͱΫϥΠΞϯτπʔϧ܈ w &WBOTͱ&WBOT͕ࢦͨ͠ͷ w &WBOTͷΞʔΩςΫνϟͱ࣮
H31$
gRPC DMJFOUTFSWFSؒͰಁաతʹ௨৴Ͱ͖ΔγεςϜΛ ߏங͢ΔͨΊͷ31$ϑϨʔϜϫʔΫ
gRPC *%-Ͱ"1*εΩʔϚΛఆٛ͢Δ ΫϥΠΞϯταʔόͷίʔυΛੜ͢Δ αʔόͷϩδοΫΛ࣮͢Δ
H31$3FNPUF1SPDFEVSF$BMMT PGDPVSTF IUUQTHSQDJPGBR
None
gRPC ͷྑ͍ͱ͜Ζ w"1*༷ͱ࣮ͷဃΛ͙͜ͱ͕Ͱ͖Δ wΫϥΠΞϯταʔόؒͷ*'͕ഊ͠ͳ͍ w4USFBNJOH31$ wFUD
gRPC ͷͭΒ͍ͱ͜Ζ w)551͔͠αϙʔτ͍ͯ͠ͳ͍ wπʔϧɾϛυϧΣΞ܈͕ॆ࣮͍ͯ͠ͳ͍ w"1*ͷσόοά͕ͮ͠Β͍
gRPC ͷͭΒ͍ͱ͜Ζ w)551͔͠αϙʔτ͍ͯ͠ͳ͍ wπʔϧɾϛυϧΣΞ܈͕ॆ࣮͍ͯ͠ͳ͍ w"1*ͷσόοά͕ͮ͠Β͍
API ͷσόοά͕ͮ͠Β͍ wH31$σʔλΛγϦΞϥΠζͯ͠ΓͱΓ͢Δ wDVSMXHFUͰςετͰ͖ͳ͍ wΫϥΠΞϯτίʔυΛ࣮͢ΔPSπʔϧͷར༻
grpc-ecosystem / polyglot w "'"*, ࠷ߴػೳͳΫϥΠΞϯτ w+BWB wͨ͘͞ΜͷΦϓγϣϯΛίϚϯυϥΠϯͰࢦఆ͢ Δඞཁ͕͋ͬͯࡶ
grpc-ecosystem / polyglot 1 $ echo <json-request> | java -jar
polyglot.jar \ 2 --command=call \ 3 --endpoint=<host>:<port> \ 4 --full_method=<some.package.Service/doSomething> \ 5 --proto_discovery_root=<path>
njpatel / grpcc w/PEFKT w3&1-PS$-*Ͱͷ࣮ߦ͕Մೳ w3&1-Ͱ+BWB4DSJQUΛॻ͘ඞཁ͕͋Δ wิ͕ͳ͍
njpatel / grpcc
͍·͍ͪͬ͘͠Γ͜ͳ͍
ސ٬ ͕ຊʹཉ͔ͬͨ͠ͷ
ސ٬ ͕ຊʹཉ͔ͬͨ͠ͷ ָʹςετͰ͖ΔΫϥΠΞϯτ
Ұ͔Βͭ͘Δͧ
LUSFWBOT
ktr0731 / evans w(P wָʹ͔ͭ͑ΔΫϥΠΞϯτ w1SPUPDPM#V⒎FST
Ϣʔεέʔε wσόοά ɺςετ wγΣϧεΫϦϓτͷΈࠐΈ
σόοάɺςετ wجຊతʹखಈͰ"1*Λୟ͘ wͰ͖Δ͚ͩλΠϓͨ͘͠ͳ͍ w๛ͳิ͕ཉ͍͠ wෳͷ"1*Λୟ͖͍ͨ߹͋Δ
γΣϧεΫϦϓτͷΈࠐΈ wTUEJOPSpMFTUEPVU wΈࠐΈ͍͢ΠϯλʔϑΣʔε͕ඞཁ
Ϣʔεέʔε wσόοά ɺςετ 3&1-Ϟʔυ wγΣϧεΫϦϓτͷΈࠐΈ ίϚϯυϥΠϯϞʔυ
EFNP LUSFWBOTEFNP
None
None
Evans Internal w εΩʔϚͷϩʔυ w &WBOTͷϞσϧͷม w 31$ͷൃߦ $-*Ϟʔυ PS
3&1-ͷىಈ 3&1-Ϟʔυ
DBTF3&1-31$DBMM
εΩʔϚͷϩʔυ 1 func runProtoc(args []string) ([]byte, error) { 2 buf,
errBuf := new(bytes.Buffer), new(bytes.Buffer) 3 4 // with "--descriptor_set_out=/dev/stdout" 5 cmd := exec.Command("protoc", args...) 6 cmd.Stdout = buf 7 cmd.Stderr = errBuf 8 if err := cmd.Run(); err != nil { 9 if errBuf.Len() != 0 { 10 return nil, errors.New(errBuf.String()) 11 } 12 return nil, err 13 } 14 return buf.Bytes(), nil 15 }
wHPMBOHQSPUPCVGEFTDSJQUPS wHPMBOHQSPUPCVGQSPUP εΩʔϚͷϩʔυ 1 code, _ := runProtoc(args) 2 ds
:= descriptor.FileDescriptorSet{} 3 proto.Unmarshal(code, &ds)
Ϟσϧͷม wΞϓϦέʔγϣϯ͔Βѻ͍͘͢͢ΔͨΊ wKIVNQQSPUPSFqFDUͷґଘΛͳͨ͘͢Ί ޙड़
REPL: read wDCBUBHPQSPNQU
REPL: read / eval wϑΟʔϧυΛ࠶ؼతʹḷΔ wϓϦϛςΟϒܕͰ͋ΕΛೖྗͤ͞Δ
1 message User { 2 string first_name = 1; 3
string last_name = 2; 4 Gender gender = 3; 5 } 6 7 message RegisterUsersRequest { 8 repeated User users = 1; 9 } type = "double" | "float" | "int32" | "int64" | "uint32" | "uint64" | "sint32" | "sint64" | "fixed32" | "fixed64" | "sfixed32" | "sfixed64" | "bool" | "string" | "bytes" | messageType | enumType
1 message User { 2 string first_name = 1; 3
string last_name = 2; 4 Gender gender = 3; 5 } 6 7 message RegisterUsersRequest { 8 repeated User users = 1; 9 } type = "double" | "float" | "int32" | "int64" | "uint32" | "uint64" | "sint32" | "sint64" | "fixed32" | "fixed64" | "sfixed32" | "sfixed64" | "bool" | "string" | "bytes" | messageType | enumType
type = "double" | "float" | "int32" | "int64" |
"uint32" | "uint64" | "sint32" | "sint64" | "fixed32" | "fixed64" | "sfixed32" | "sfixed64" | "bool" | "string" | "bytes" | messageType | enumType 1 message User { 2 string first_name = 1; 3 string last_name = 2; 4 Gender gender = 3; 5 } 6 7 message RegisterUsersRequest { 8 repeated User users = 1; 9 }
ϓϦϛςΟϒܕͷೖྗ wೖྗΛड͚͚ͭΔ DCBUBHPQSPNQU wରԠ͢Δܕม wϑΟʔϧυʹΛηοτ͢Δ KIVNQQSPUPSFqFDU wೖྗରͷϝοηʔδಈతʹܾఆ͞ΕΔ
ϝοηʔδͷಈతͳߏங wKIVNQQSPUPSFqFDUEZOBNJD.FTTBHF wQSPUP.BSTIBMFS࣮Λ࣋ͭ
ϝοηʔδͷಈతͳߏங ֤ϑΟʔϧυΛEZOBNJD.FTTBHF͕อ࣋ #V⒎FS.BSTIBMQSPUP.FTTBHFͱͯ͠͞ΕΔ .BSTIBM͕QSPUP.BSTIBMFSͷ࣮ΛݺͿ EZOBNJD.FTTBHF.BSTIBMʹΑΓγϦΞϥΠζ
QSPUP.FTTBHF QSPUP.BSTIBMFS EZOBNJD.FTTBHF Marshal() ([]byte, error) CVG WBMVFT encode marshal
each field values ϝοηʔδͷಈతͳߏங
ΞʔΩςΫνϟ w $MFBO"SDIJUFDUVSF w )FYBHPOBM"SDIJUFDUVSF
ͳͥ CA / HA ͔ʁ w ࠜװΛࢧ͑ΔϥΠϒϥϦ͕ະख़ w $-*Ϟʔυɺ3&1-Ϟʔυ͕͋Δ w
ίϯϙʔωϯτ͕ଟ͍
JOQVUUFS*' 3&1- 1SPNQU*OQVUUFS DCBUBHPQSPNQU $-* +40/JOQVUUFS FODPEJOHKTPO Entity layer Adapter
layer UseCase layer EFTDSJQUPST KIVNQQSPUPSFqFDU pFMET NFTTBHF TFSWJDF*'
TODOs w ετϦʔϜछ w 5-4ରԠ w ϦϑϨΫγϣϯαʔόରԠ w FUD
TODOs w ετϦʔϜछ w 5-4ରԠ w ϦϑϨΫγϣϯαʔόରԠ w FUD 1VMM3FRVFTUT*TTVFT
XFMDPNF
·ͱΊ w ݸਓతʹ ָʹ͔ͭ͑ΔΫϥΠΞϯτ͕Ͱ͖ͨ w ڊਓͷݞʹ͍ͬͯΔ͓͔͛Ͱ͢ w ͱ͍͑50%0·ͩଟ͍
·ͱΊ w ݸਓతʹ ָʹ͔ͭ͑ΔΫϥΠΞϯτ͕Ͱ͖ͨ w ڊਓͷݞʹ͍ͬͯΔ͓͔͛Ͱ͢ w ͱ͍͑50%0·ͩଟ͍ ͍ͬͯͧ͘ʂʂ