Pendahuluan
Streaming client adalah kebalikan dari streaming server. Disini client akan mengirimkan many request, dan server akan mengirimkan satu response.
Streaming client cocok digunakan ketika
- client perlu mengirimkan ukuran data besar.
- client perlu melakukan “PUSH” data.
Berikut syntax dasar penggunaan streaming client.
message namaRequestMessage {
//field goes here
}
message namaResponseMessage {
//field goes here
}
service namaService {
rpc namaFungsi (stream namaRequestMessage) returns (namaResponseMessage){};
}
Implementasi Streaming Client
Buka file proto/greet.proto, lalu tambahkan code untuk mendefinisikan client streaming.
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){};
//server streaming
rpc GreetManyTimes (GreetManyRequest) returns (stream GreetManyResponse){};
//client streaming
rpc LongGreet (stream LongGreetRequest) returns (LongGreetResponse){};
}
//client streaming msg request
message LongGreetRequest {
Greeting greet = 1;
}
//client streaming msg response
message LongGreetResponse {
string result = 1;
}
Kemudian buka command prompt dan compile
$ protoc-gen-grpc --proto_path=protos --js_out=import_style=commonjs,binary:server --grpc_out=server protos/greet.proto
Hasil compile akan menimpa file server/greet_grpc_pb.js dan server/greet_pb.js yang sudah kita buat pada modul sebelumnya.
Buka file server/index.js, kita tambahkan fungsi untuk service client streaming.
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);
}
//client streaming
function longGreet (call, callback){
call.on('data', request=>{
var fullname = request.getGreet().getFirstName() + ' ' + request.getGreet().getLastName();
console.log('hello, ' + fullname);
});
call.on('error', (error)=>{
console.error(error);
});
call.on('end', ()=>{
var response = new greets.LongGreetResponse();
response.setResult('Long greet client streaming..');
callback(null, response);
});
}
function main(){
var Server = new grpc.Server();
//tambahkan service client streaming
Server.addService(service.GreetServiceService, {greet: greet, greetManyTimes: greetManyTimes, longGreet:longGreet});
Server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), ()=>{
Server.start();
});
console.log("Server running..");
}
main()
Kemudian kita buka file client/client.js, lalu tambahkan code untuk melakukan client streaming.
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..");
// });
// }
function callLongGreeting(){
var client = new service.GreetServiceClient(
'localhost:50051', grpc.credentials.createInsecure()
);
var request = new greets.LongGreetRequest();
var call = client.longGreet(request, (error, response)=>{
if(!error){
console.log('server response: ', response.getResult());
}else{
console.error(error);
}
});
let count = 0, intervalID = setInterval(function(){
console.log('Sending message ' + count);
var request = new greets.LongGreetRequest();
var greeting = new greets.Greeting();
greeting.setFirstName('Client');
greeting.setLastName('Streaming');
request.setGreet(greeting);
call.write(request);
if(++count > 3){
clearInterval(intervalID);
call.end();
}
}, 1000);
}
callLongGreeting();
//callGreetMany();
//unary()
Berikutnya kita jalankan server, buka terminal, lalu jalankan file server.
$ node index.js
Server running..
hello, Client Streaming
hello, Client Streaming
hello, Client Streaming
hello, Client Streaming
Buka terminal kedua, jalankan file client.
$ node client.js
Sending message 0
Sending message 1
Sending message 2
Sending message 3
server response: Long greet client streaming..
Sesuai ekspektasi client akan melakukan sending multiple request, kemudian server akan memberikan response setelah request selesai dikirim.
Mengirimkan multiple request
Client streaming memungkinkan kita untuk mengirim multiple request. Berikut contoh simulasi multi request.
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..");
// });
// }
function callLongGreeting(){
var client = new service.GreetServiceClient(
'localhost:50051', grpc.credentials.createInsecure()
);
var request = new greets.LongGreetRequest();
var call = client.longGreet(request, (error, response)=>{
if(!error){
console.log('server response: ', response.getResult());
}else{
console.error(error);
}
});
let count = 0, intervalID = setInterval(function(){
console.log('Sending message ' + count);
//request 1
var request = new greets.LongGreetRequest();
var greeting = new greets.Greeting();
greeting.setFirstName('Client');
greeting.setLastName('Streaming');
request.setGreet(greeting);
//request 2
var request2 = new greets.LongGreetRequest();
var greeting2 = new greets.Greeting();
greeting2.setFirstName('Client2');
greeting2.setLastName('Streaming2');
request2.setGreet(greeting);
call.write(request);
call.write(request2);
if(++count > 3){
clearInterval(intervalID);
call.end();
}
}, 1000);
}
callLongGreeting();
//callGreetMany();
//unary()
JIka kita lihat log pada terminal yang menjalankan file server, dapat dilihat terdapat 2 streaming request yang diproses.
Server running..
hello, Client Streaming
hello, Client2 Streaming2
hello, Client Streaming
hello, Client2 Streaming2
hello, Client Streaming
hello, Client2 Streaming2
hello, Client Streaming
hello, Client2 Streaming2
Sampai disini kita sudah berhasil mengimplementasikan client streaming.