之前我用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.js
中Png2Svg
方法为nodeservice.proto
中定义的service
。
Png2Svg
方法中的call.request.img_url
是nodeservice.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
。