gRPC for Nodejs 实战

发布于 2018-04-21 18:12:41 阅读 646

之前我用nodejs写了一个png转svg、svg转png与jpg的服务,当时使用的是http作为接口。之后我学习了grpc,所以我把这个http的接口改成grpc服务,方便给其他业务服务调用。

这是我之前写的http接口的 Github: nodeService

这个是用gRPC转换后的代码nodeService Master

其实转换成gRPC很简单。

首先先安装下grpc

npm install grpc

再定义一个nodeservice.proto,然后定义服务的方法以及返回的数据类型。

syntax = "proto3";

package nodeservice;

service NodeService {
    rpc Png2Svg (Png2SvgRequest) returns (Png2SvgResponse){}
}

message Png2SvgRequest {
    string img_url = 1;//图片url,例如https://d30y9cdsu7xlg0.cloudfront.net/png/120046-200.png
    int32 width = 2;//导出的svg宽度
    int32 height = 3;//导出的svg高度
}

message Png2SvgResponse {
     int32 code = 1;
     string msg = 2;
     string svgAddress = 3;
     string pngAddress = 4;
     string ppmAddress = 5;
     string svgSourceCode = 6;
}

然后再定义一个grpc的server

var PROTO_PATTH = __dirname + '/../nodeservice.proto'

var grpc = require('grpc')
var nodeservice = grpc.load(PROTO_PATTH).nodeservice

function Png2Svg(call, callback) {
    let img_url = call.request.img_url
    let width = call.request.width
    let height = call.request.height
    //省略中间的代码
    return callback(null, {
               code: 1,
               msg: 'successful',
               svgAddress: file_floder + file_name + '.svg',
               pngAddress: file_floder + file_name + '.png',
               ppmAddress: file_floder + file_name + '.ppm',
               svgSourceCode: svgSourceCode
     })

function main () {
    var server = new grpc.Server()
    server.addService(nodeservice.NodeService.service, {Png2Svg:Png2Svg})
    server.bind("0.0.0.0:50051", grpc.ServerCredentials.createInsecure())
    server.start()
}
main();
}

serve.jsPng2Svg方法为nodeservice.proto中定义的service

Png2Svg方法中的call.request.img_urlnodeservice.proto中定义中的message Png2SvgRequest对象中的img_url

Png2Svg方法中的return callback中的第二个参数是nodeservice.proto中定义的message Png2SvgResponse

写完成server后,需要启动服务,所以 main 方法就是启动一个grpc的server,绑定了50051端口,并且添加了我们刚刚写好的Png2Svg服务。下面就直接启动这个grpc server即可

上面我们已经把grpc的server已经写好了,那么我们再来写一个grpc的client。

我们只要把server中的request中的参数传到我们刚刚在server中定义的Png2Svg方法中即可。

var PROTO_PATH = __dirname+'/../nodeservice.proto';

var grpc = require("grpc")
var node_service = grpc.load(PROTO_PATH).nodeservice;

function main () {
    var client = new node_service.NodeService('localhost:50051', grpc.credentials.createInsecure());

    client.Png2Svg({img_url:"", width:300, height:300}, (err, response) => {
        if(response.code == 1) {
            console.log(response.svgAddress)
            console.log(response.pngAddress)
            console.log(response.ppmAddress)
            console.log(response.svgSourceCode)
        }else{
            console.log(response.msg)
        }
    })
}

main ();

那么我们现在需要运行下server

node server.js

然后在运行下client

node client.js

查看下命令行返回的console.log