nodejs 使用gRPC
CSDN参考:: http://aihongxin.com/13022.html
npm install -g grpc
或者
npm i --save-dev @grpc/grpc-js @grpc/proto-loader (手动生成pb还需 安装
grpc-tools)
package.json
{ "name": "grpc-examples", "version": "0.1.0", "dependencies": { "@grpc/proto-loader": "^0.5.0", "async": "^1.5.2", "google-protobuf": "^3.0.0", "@grpc/grpc-js": "^1.1.0", "lodash": "^4.6.1", "minimist": "^1.2.0" } }
js 编译proto
./node_modules/grpc-tools/bin/protoc --js_out=import_style=commonjs,binary:./ --plugin=protoc-gen-grpc=./node_modules/grpc-tools/bin/grpc_node_plugin.exe --grpc_out=./ helloworld.proto
编译后的helloworld_grpc_pb.js 文件中如果无法加载gRPC
var grpc = require('grpc');
可以更改为
var grpc = require('@grpc/grpc-js');
grpc 有静态(手动生成pb) 动态加载(加载proto文件无需生成中间文件)两种
hello_client_static.js
/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ var parseArgs = require('minimist'); var messages = require('./helloworld_pb'); var services = require('./helloworld_grpc_pb'); var grpc = require('@grpc/grpc-js'); function main() { var argv = parseArgs(process.argv.slice(2), { string: 'target' }); var target; if (argv.target) { target = argv.target; } else { target = 'localhost:5152'; } var client = new services.GreeterClient(target, grpc.credentials.createInsecure()); var request = new messages.HelloRequest(); var user; if (argv._.length > 0) { user = argv._[0]; } else { user = 'world'; } request.setName(user); client.sayHello(request, function(err, response) { console.log('Greeting:', response.getMessage()); }); } main();
hello_server_static.js
/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ var messages = require('./helloworld_pb'); var services = require('./helloworld_grpc_pb'); var grpc = require('@grpc/grpc-js'); /** * Implements the SayHello RPC method. */ function sayHello(call, callback) { var reply = new messages.HelloReply(); reply.setMessage('Hello ' + call.request.getName()); callback(null, reply); } /** * Starts an RPC server that receives requests for the Greeter service at the * sample server port */ function main() { var server = new grpc.Server(); server.addService(services.GreeterService, {sayHello: sayHello}); server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { server.start(); }); } main();
hello_server_dynamic.js
/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ var PROTO_PATH = __dirname + '/helloworld.proto'; var grpc = require('@grpc/grpc-js'); var protoLoader = require('@grpc/proto-loader'); var packageDefinition = protoLoader.loadSync( PROTO_PATH, {keepCase: true, longs: String, enums: String, defaults: true, oneofs: true }); var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld; /** * Implements the SayHello RPC method. */ function sayHello(call, callback) { callback(null, {message: 'Hello ' + call.request.name}); } /** * Starts an RPC server that receives requests for the Greeter service at the * sample server port */ function main() { var server = new grpc.Server(); server.addService(hello_proto.Greeter.service, {sayHello: sayHello}); server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { server.start(); }); } main();
hello_client_dynamic.js
/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ var PROTO_PATH = __dirname + '/../../protos/helloworld.proto'; var parseArgs = require('minimist'); var grpc = require('@grpc/grpc-js'); var protoLoader = require('@grpc/proto-loader'); var packageDefinition = protoLoader.loadSync( PROTO_PATH, {keepCase: true, longs: String, enums: String, defaults: true, oneofs: true }); var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld; function main() { var argv = parseArgs(process.argv.slice(2), { string: 'target' }); var target; if (argv.target) { target = argv.target; } else { target = 'localhost:50051'; } var client = new hello_proto.Greeter(target, grpc.credentials.createInsecure()); var user; if (argv._.length > 0) { user = argv._[0]; } else { user = 'world'; } client.sayHello({name: user}, function(err, response) { console.log('Greeting:', response.message); }); } main();
nodejs express 解决跨域请求
app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); });