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時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.6k
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
140
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
210
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
180
Agents on Rails - Rails at Scale 2026
irinanazarova
0
530
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
100
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
360
気持ちぃ〜角丸 Squircle
ryu1013
0
280
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
490
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
160
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
529
40k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Designing for humans not robots
tammielis
254
26k
From π to Pie charts
rasagy
1
400
The Mindset for Success: Future Career Progression
greggifford
PRO
0
530
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Designing for Timeless Needs
cassininazir
1
520
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Agile that works and the tools we love
rasmusluckow
331
22k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
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*पΓָ͕ʹͳΔ ͨͩ͠ɺϋϚΓϙΠϯτ݁ߏ͋Δ