Pendahuluan
Streaming API menggunakan protokol HTTP/2, dimana client mengirim satu request, sementara server dapat mengirimkan lebih dari satu response.
Streaming server cocok digunakan
- Ketika server harus mengirimkan jumlah data yang besar.
- Server perlu melakukan “PUSH” data, tanpa client melakukan request. Contoh chat apps.
Untuk menggunakan server streaming pada gRPC, digunakan keyword stream. Setiap RPC, harus didefinisikan request dan response message.
Berikut syntax dasar yang diperlukan
message namaRequestMessage {
//code goes here
}
message namaResponseMessage {
//code goes here
}
service namaService {
rpc namaFunction (namaRequestMessage) returns (stream namaResponseMessage) {}
}
Implementasi gRPC Streaming server
Buka file protos/greet.proto dari modul sebelumnya, tambahkan code untuk streaming API.
syntax = "proto3"; package greet; message Greeting { string first_name = 1; string last_name = 2; } message GreetRequest{ Greeting greeting = 1; } message GreetResponse{ string result = 1; } //streaming request message GreetManyRequest{ Greeting greeting = 1; } //streaming response message GreetManyResponse{ string result = 1; } service GreetService { //unary rpc Greet (GreetRequest) returns (GreetResponse){}; //streaming rpc GreetManyTimes (GreetManyRequest) returns (stream GreetManyResponse){}; }
Kemudian buka command prompt, jalankan compiler
$ protoc-gen-grpc --proto_path=protos --js_out=import_style=commonjs,binary:server --grpc_out=server protos/greet.proto
Compiler akan menimpa ((jika file sudah ada) file greet_grpc_pb.js dan greet_pb.js pada direktori server.
Kita buka file server/index.js, lalu kita implementasikan code untuk streaming service.
var grpc = require('grpc'); var greets = require('./greet_pb'); var service = require('./greet_grpc_pb'); function greet (call, callback){ var greeting = new greets.GreetResponse(); greeting.setResult( "Hello, " + call.request.getGreeting().getFirstName() + " " + call.request.getGreeting().getLastName() ); callback(null, greeting); } //implementasi streaming API function greetManyTimes (call, callback){ var firstName = call.request.getGreeting().getFirstName(); //kita simulasikan streaming. let count = 0, intervalID = setInterval(function(){ var greetManyResponse = new greets.GreetManyResponse(); greetManyResponse.setResult(firstName); //streaming goes here call.write(greetManyResponse); if(++count > 9){ clearInterval(intervalID); call.end() //server selesai mengirim message. } }, 1000); } function main(){ var Server = new grpc.Server(); Server.addService(service.GreetServiceService, {greet: greet, greetManyTimes: greetManyTimes}); Server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), ()=>{ Server.start(); }); console.log("Server running.."); } main()
Berikutnya kita buat implementasi untuk sisi client. Buka file client/client.js, tambahkan code berikut
var grpc = require('grpc'); var greets = require('../server/greet_pb'); var service = require('../server/greet_grpc_pb'); // function unary(){ // var client = new service.GreetServiceClient('localhost:50051', grpc.credentials.createInsecure()); // var request = new greets.GreetRequest(); // var greeting = new greets.Greeting(); // greeting.setFirstName("Test1"); // greeting.setLastName("Test2"); // request.setGreeting(greeting); // client.greet(request, (error, response)=>{ // if (!error){ // console.log("Response: ", response.getResult()); // }else{ // console.error(error); // } // }); // } function callGreetMany(){ var client = new service.GreetServiceClient( 'localhost:50051', grpc.credentials.createInsecure() ); var request = new greets.GreetManyRequest(); var greeting = new greets.Greeting(); greeting.setFirstName("Streaming"); greeting.setLastName("API"); request.setGreeting(greeting); var call = client.greetManyTimes(request, ()=>{}); call.on("data", (response)=>{ console.log('Client streaming response: ', response.getResult()); }); call.on("status", (status)=>{ console.log(status.details); }); call.on("error", (error)=>{ console.error(error.details); }); call.on("end", ()=>{ console.log("streaming end.."); }); } callGreetMany(); //unary()
Buka terminal pertama, Kemudian jalankan service server
$ node index.js
Buka terminal kedua, kemudian jalankan client
$ node client.js
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
Client streaming response: Streaming
{
code: 0,
details: 'OK',
metadata: Metadata { _internal_repr: {}, flags: 0 }
}
streaming end..
Sesuai ekspektasi, client akan menerima response 10 kali sesuai iterasi simulasi streaming pada code server.
Sampai disini kita sudah berhasil melakukan implementasi sederhana penggunaan streaming API.