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
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
630
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
600
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.6k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
11k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
440
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
240
Fuzzy finder as a Go library
ktr_0731
3
6.3k
Other Decks in Programming
See All in Programming
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
500
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
Oxlintのカスタムルールの現況
syumai
6
1.1k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
AIエージェントの隔離技術の徹底比較
kawayu
0
470
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
JavaDoc 再入門
nagise
0
320
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.3k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
490
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
220
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
170
Exploring anti-patterns in Rails
aemeredith
3
400
How to Talk to Developers About Accessibility
jct
2
230
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
230
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
We Are The Robots
honzajavorek
0
240
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
330
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
What's in a price? How to price your products and services
michaelherold
247
13k
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·ͩଟ͍ ͍ͬͯͧ͘ʂʂ