Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Evans: more expressive gRPC client
Search
ktr
February 20, 2018
Programming
5.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Evans: more expressive gRPC client
ktr
February 20, 2018
More Decks by ktr
See All by ktr
詳解 MCP Go SDK / MCP Go SDK
ktr_0731
3
710
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
690
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.8k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
11k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
490
Designing libraries in Go way
ktr_0731
6
1.6k
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
260
Fuzzy finder as a Go library
ktr_0731
3
6.4k
Other Decks in Programming
See All in Programming
SODA - FACT BOOK(EN)
sodainc
1
210
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
590
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
8.7k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
110
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
240
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
2k
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
210
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
230
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
120
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
160
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
560
Why Our Code Smells
bkeepers
PRO
340
58k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
What's in a price? How to price your products and services
michaelherold
247
13k
The Cost Of JavaScript in 2023
addyosmani
56
10k
Google's AI Overviews - The New Search
badams
0
1.7k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
650
Transcript
at Go 1.10 Release Party in Tokyo more expressive gRPC
client Evans
XIPBNJ !cJE LUS@ ձେֶֶ෦ ιϥϛπגࣜձࣾαʔόΤϯδχΞ
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·ͩଟ͍ ͍ͬͯͧ͘ʂʂ