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
gRPC-webのここがすごい という話がしたかった
Search
Hazumi Ichijo
November 19, 2018
Programming
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
gRPC-webのここがすごい という話がしたかった
Roppongi.js #7
Hazumi Ichijo
November 19, 2018
More Decks by Hazumi Ichijo
See All by Hazumi Ichijo
RailsとRidgepoleの マイグレを120倍早くする
hazumirr
0
480
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
1.5k
病院の情報フローを理解して、 予約〜会計の見え方が変わった話
hazumirr
1
2k
Rubyのコード削除したい時 僕がやること
hazumirr
0
300
テーブル駆動テストと状態
hazumirr
5
2.2k
オンラインテストしようと思った その日に開始できる環境を目指して
hazumirr
0
1.1k
推薦によるプロダクト改善とマイクロサービスが噛み合った話
hazumirr
2
4.9k
ChatGPTで僕が知っていることまとめ
hazumirr
3
3.1k
プロダクトチームとどう 協業し分析環境を改善するか
hazumirr
2
1.7k
Other Decks in Programming
See All in Programming
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.3k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
280
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.1k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
パーソナライズPodcastを作った話
repunit11
0
130
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
240
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.7k
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
960
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
620
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
550
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
970
Agents on Rails - Rails at Scale 2026
irinanazarova
0
530
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Skip the Path - Find Your Career Trail
mkilby
1
250
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
New Earth Scene 8
popppiees
4
2.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
980
Leo the Paperboy
mayatellez
10
2.4k
The Language of Interfaces
destraynor
162
27k
A Tale of Four Properties
chriscoyier
163
24k
The Cult of Friendly URLs
andyhume
79
7k
Transcript
©2018 Wantedly, Inc. gRPC-web ͷ͕͍͜͜͢͝ʂ 19.Nov.2018 - Hazumi Ichijo ͱ͍͏͕͔ͨͬͨ͠
©2018 Wantedly, Inc. ࣗݾհ Ұᑍ!IB[VNJSS!SFSPTU 4FSWFS4JEF&OHJOFFSJO8BOUFEMZ (P 3BJMT 3FBDUʜ ग़ւಓ
©2018 Wantedly, Inc. ࣗݾհ Ұᑍ!IB[VNJSS!SFSPTU 4FSWFS4JEF&OHJOFFSJO8BOUFEMZ (P 3BJMT 3FBDUʜ ग़ւಓ
©2018 Wantedly, Inc. ͋͘·ͰɺαʔόʔαΠυΤϯδχΞ͔ΒΈͨ gRPC-WebͷΛ͍ͨ͠ͱࢥ͍·͢
©2018 Wantedly, Inc. grpc/grpc-web͕ϦϦʔε͞Ε·ͨ͠ Description
©2018 Wantedly, Inc.
©2018 Wantedly, Inc. gRPC-Web Λ͏ϝϦοτ
©2018 Wantedly, Inc. API Call \ lJEz lOBNFzlH31$Λಋೖ͢Δz
lBVUIPSzlSFSPTUz lEFBEMJOFzlz lBQQMJDBUJPO@UZQFzl1$8FCz ^ Server Frontend
©2018 Wantedly, Inc. API Call \ lJEz lOBNFzlH31$Λಋೖ͢Δz
lBVUIPSzlSFSPTUz lEFBEMJOFzlz lBQQMJDBUJPO@UZQFzl1$8FCz ^ Server Frontend ͜͜ͷϑΥʔϚοτԿʁ
©2018 Wantedly, Inc. API Call \ lJEz lOBNFzlH31$Λಋೖ͢Δz
lBVUIPSzlSFSPTUz lEFBEMJOFzlz lBQQMJDBUJPO@UZQFzl1$8FCz ^ Server Frontend ͜͜Կ͕ೖΔʁԿΛೖΕ͍͍ͯʁ - PC-Web or pc-web - iOS, Android, …?
©2018 Wantedly, Inc. ΤϯδχΞಉ࢜ͷίϛϡχέʔγϣϯΛͲ͏͢Δʁ "1*ͷޓੑʁ
©2018 Wantedly, Inc. gRPC Call Server Frontend message Todolist {
int64 id = 1; string name = 2; string author = 3; google.protobuf.Timestamp deadline = 4; enum ApplicationType { PC_WEB = 0; MOBILE_WEB = 1; PC_APP = 2; IOS_APP = 3; ANDROID_APP = 4; } ApplicationType application_type = 5; }
©2018 Wantedly, Inc. gRPC Call Server Frontend service TodolistService {
rpc ListTasks (ListTasksRequest) returns (ListTasksResponse) {} rpc GetTask (GetTaskRequest) returns (Todolist) {} rpc CreateTask (CreateTaskRequest) returns (Todolist) {} }
©2018 Wantedly, Inc. ࢼ͢
©2018 Wantedly, Inc. Frontend Envoy(reverse proxy) API Server http gRPC
©2018 Wantedly, Inc. https://grpc.io/docs/quickstart/web.html#what-is-happening
©2018 Wantedly, Inc. service TaskService { rpc ListTasks (ListTasksRequest) returns
(ListTasksResponse) {} rpc GetTask (GetTaskRequest) returns (Task) {} rpc CreateTask (CreateTaskRequest) returns (Task) {} rpc UpdateTask (UpdateTaskRequest) returns (Task) {} rpc DeleteTask (DeleteTaskRequest) returns (google.protobuf.Empty) {} rpc StreamTask(CreateTaskRequest) returns (stream Task){} } message Task { int64 task_id = 1; string title = 2; google.protobuf.Timestamp created_at = 3; google.protobuf.Timestamp deadline = 4; google.protobuf.StringValue note = 5; } ϝοηʔδͷఆٛ αʔϏεͷఆٛ
©2018 Wantedly, Inc. https://github.com/rerost/todolist-server https://github.com/rerost/todolist-frontend2
©2018 Wantedly, Inc. ϋϚΓ͍͢ w H31$ FOWPZ ʜ
ใ͕গͳ͍ɾ୳ͮ͠Β͍ w JNQSPCBCMFFOHHSQDXFC͕ઌʹग़͍ͯͨͷͰݕࡧ͕ͯͬͪ͜͠Ҿ͔͔ͬΓ͍͢ ੜ͞ΕΔίʔυ͕ಡΊͳ͍ʢݸਓࠩ͋Γʣ
©2018 Wantedly, Inc. let req = new ListTasksRequest(); this.client.listTasks(req, {},
(err, res) => { if (err != null) { // ԿΒ͔ͷΤϥʔॲཧ console.log(err); return; } this.setState({ tasks: res.getTasksList() }); }); let req = new CreateTaskRequest(); let task = new Task(); task.setTitle(this.state.text); req.setTask(task); this.client.createTask(req, {}, (err, res) => { if (err != null) { console.log(err); return; } this.setState({ tasks: [res, ...this.state.tasks] }); }); ίϯετϥΫλ͔ΒͰͳ͘ɺ`setXX`Ͱ͢ getterϝιου͕ࣗಈͰఆٛ͞Ε͍ͯΔ
©2018 Wantedly, Inc. /** * @fileoverview * @enhanceable * @suppress
{messageConventions} JS Compiler reports an error if a variable or * field starts with 'MSG_' and isn't a translatable message. * @public */ // GENERATED CODE -- DO NOT EDIT! /* eslint-disable */ var jspb = require("google-protobuf"); var goog = jspb; var global = Function("return this")(); var google_protobuf_empty_pb = require("google-protobuf/google/protobuf/empty_pb.js"); var google_protobuf_timestamp_pb = require("google-protobuf/google/protobuf/timestamp_pb.js"); var google_protobuf_wrappers_pb = require("google-protobuf/google/protobuf/wrappers_pb.js"); var google_protobuf_field_mask_pb = require("google-protobuf/google/protobuf/field_mask_pb.js"); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.CreateTaskRequest", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.DeleteTaskRequest", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.GetTaskRequest", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.ListTasksRequest", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.ListTasksResponse", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.Task", null, global ); goog.exportSymbol( "proto.com.github.rerost.todolist_server.api.UpdateTaskRequest", null, global ); ϝοηʔδͷఆٛ /** * @fileoverview gRPC-Web generated client stub for com.github.rerost.todolist_server.api * @enhanceable * @public */ // GENERATED CODE -- DO NOT EDIT! const grpc = {}; grpc.web = require("grpc-web"); var google_protobuf_empty_pb = require("google-protobuf/google/protobuf/empty_pb.js"); var google_protobuf_timestamp_pb = require("google-protobuf/google/protobuf/timestamp_pb.js"); var google_protobuf_wrappers_pb = require("google-protobuf/google/protobuf/wrappers_pb.js"); var google_protobuf_field_mask_pb = require("google-protobuf/google/protobuf/field_mask_pb.js"); const proto = {}; proto.com = {}; proto.com.github = {}; proto.com.github.rerost = {}; proto.com.github.rerost.todolist_server = {}; proto.com.github.rerost.todolist_server.api = require("./todo_pb.js"); /** * @param {string} hostname * @param {?Object} credentials * @param {?Object} options * @constructor * @struct * @final */ proto.com.github.rerost.todolist_server.api.TaskServiceClient = function( hostname, credentials, options ) { if (!options) options = {}; options["format"] = "text"; /** * @private @const {!grpc.web.GrpcWebClientBase} The client */ this.client_ = new grpc.web.GrpcWebClientBase(options); /** * @private @const {string} The hostname */ this.hostname_ = hostname; /** * @private @const {?Object} The credentials to be used to connect * to the server αʔϏεͷఆٛ
©2018 Wantedly, Inc. H31$8FCͰ"1*पΓָ͕ʹͳΔ ͨͩ͠ɺϋϚΓϙΠϯτ݁ߏ͋Δ