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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
680
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
650
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.7k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
11k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
470
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
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
320
高専キャリア LT 発表内容
crysta1221
6
5.5k
What We Talk About When We Talk About XP
m_seki
2
360
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
160
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
580
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.7k
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
MySQLとPostgreSQLって何が違うの?
akagami
PRO
0
160
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
110
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
初めての模倣学習とVLA
natsutan
0
480
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
1
530
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Accessibility Awareness
sabderemane
1
200
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
250
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
Claude Code のすすめ
schroneko
67
230k
Being A Developer After 40
akosma
91
590k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
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·ͩଟ͍ ͍ͬͯͧ͘ʂʂ