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
640
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
620
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
450
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
250
Fuzzy finder as a Go library
ktr_0731
3
6.3k
Other Decks in Programming
See All in Programming
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.6k
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
250
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
190
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
8
970
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.6k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
630
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
240
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
130
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
200
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.3k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
250
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
4 Signs Your Business is Dying
shpigford
187
22k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Into the Great Unknown - MozCon
thekraken
41
2.6k
YesSQL, Process and Tooling at Scale
rocio
174
15k
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·ͩଟ͍ ͍ͬͯͧ͘ʂʂ