gRPC中Java和node进行异构通信-互为客户端和服务端
場景
gPRC簡介以及Java中使用gPRC實現客戶端與服務端通信(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108711541
上面介紹了在Java中使用gPRC進行通信的搭建方式。
如果是使用node作為客戶端與Java的服務端進行通信 ,或者是node作為服務端與Java客戶端進行通信怎么辦。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
使用Java進行gPRC服務端和客戶端的搭建參照上面,在上面搭建好的基礎上,
打開WebStorm新建project,然后新建package.json
{"name": "grpc-examples","version": "0.1.0","dependencies": {"@grpc/proto-loader": "^0.1.0","async": "^1.5.2","google-protobuf": "^3.0.0","grpc": "^1.11.0","lodash": "^4.6.1","minimist": "^1.2.0"} }這里的代碼內容可以去gRPC的github上的示例代碼中去復制
https://github.com/grpc/grpc/blob/v1.30.x/examples/node/package.json
?
然后打開Ternimal
npm install進行安裝依賴,就會在項目目錄下生成node_modules目錄。
?
然后在項目下新建proto文件夾,在此目錄下將之前Java項目中的Person.proto復制過來
syntax = "proto3";package com.badao.proto;option optimize_for =SPEED; option java_package = "com.badao.grpcjava"; option java_outer_classname = "BadaoDataInfo"; option java_multiple_files = true;service PersonService {rpc GetRealNameByUsername(MyRequest) returns (MyResponse) {}}message MyRequest {string username = 1; }message MyResponse {string realname = 2; }動態代碼生成的方式
前面在Java中搭建客戶端和服務端時都需要調用插件去生成代碼,在node中可以使用動態代碼生成的方式和靜態代碼的方式去搭建。
搭建node的rRPC客戶端
在項目下新建app目錄,在app目錄下新建grpcClient.js
var PROTO_FILE_PATH = 'D:\\Workspace\\WebStormWorkspace\\nodegRPC\\proto\\Person.proto'; var grpc = require('grpc'); var grpcService = grpc.load(PROTO_FILE_PATH).com.badao.proto;var client = new grpcService.PersonService('localhost:8899',grpc.credentials.createInsecure()); client.GetRealNameByUsername({username:'公眾號:霸道的程序猿'},function (error,responseData) {console.log(responseData) });注意這里的路徑就是proto文件的絕對路徑,這樣代碼會在運行時去生成。
然后下面的
var grpcService = grpc.load(PROTO_FILE_PATH).com.badao.proto;后面的路徑要與proto文件中
package com.badao.proto;指定的一致。
啟動Java的服務端,然后運行node的客戶端,在grpcClient.js上右擊run
?
搭建node的服務端
在app下新建grpcServer.js
var PROTO_FILE_PATH = 'D:\\Workspace\\WebStormWorkspace\\nodegRPC\\proto\\Person.proto'; var grpc = require('grpc'); var grpcService = grpc.load(PROTO_FILE_PATH).com.badao.proto;var server = new grpc.Server();server.addService(grpcService.PersonService.service,{getRealNameByUsername:getRealNameByUsernameImpl });server.bind('localhost:8899',grpc.ServerCredentials.createInsecure()); server.start();function getRealNameByUsernameImpl(call,callback) {console.log("username:"+call.request.username)callback(null,{realname:'公眾號:霸道的程序猿'}); }前面的內容與搭建客戶端一致,在進行方法的具體實現時,左邊的getRealNameByUsername
就是proto文件中定義的接口的方法名,右邊getRealNameByUsernameImpl是在當前js中方法的具體實現方法。
運行node的服務端,然后運行java的客戶端。
?
靜態代碼生成的方式
靜態代碼生成的方式與上面Java端搭建客戶端與服務端的流程差不多,就是使用插件根據prpto文件生成代碼,然后再去編寫代碼。
首先確保電腦上已經安裝了protoc并配置了環境變量。
具體流程可以參照下面
ProtoBuf的介紹以及在Java中使用protobuf將對象進行序列化與反序列化:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108667427
然后在node項目下打開Ternimal
npm install grpc-tools --save-dev npm install google-protobuf --save npm install grpc --save安裝所需要的依賴,然后就會在node_modules下找到grpc-tools下bin下的grpc_node_plugin.exe
和protoc.exe
?
這里直接使用配置進環境變量的prptoc.exe,就不能再一層層進入到node_modules所在的目錄了。
然后在Ternimal下繼續執行
protoc--js_out=import_style= commonjs,binary:./--plugin=protoc-gen-grpc=./node_modules/grpc-tools/bin/grpc_node_plugin.exe --grpc_out=./ proto/Person.proto注意這里的執行前的路徑是在項目的根目錄下,因為已經配置了protoc的環境變量,所以直接使用prptoc開頭才能識別命令。
然后---js_out后面是固定的寫法 在binary:后面的路徑和后面--grpc_out的路徑是分別生成在proto中定義的message的代碼和service的代碼路徑,這里./就是當前路徑,就是相對于proto在同一個路徑下,然后proto-gen-grpc是跟的node_modules中grpc_node_plugin.exe的路徑,最后面跟的是prpto文件相對于項目的路徑,因為命令是在項目根目錄下執行的。
?
生成代碼成功后就在proto文件所在的路徑下生成了兩個js文件。那么生成代碼成功。
使用靜態代碼搭建客戶端
在項目下app下新建grpcClient2.js
var service = require('../proto/Person_grpc_pb'); var messages = require('../proto/Person_pb');var gprc = require('grpc');var client = new service.PersonServiceClient('localhost:8899',gprc.credentials.createInsecure());var request = new messages.MyRequest(); request.setUsername('公眾號:霸道的程序猿');client.getRealNameByUsername(request,function (error,respData) {console.log(respData.getRealname()); })注意這里的路徑,service就是上面生成的Person_grpc_pb.js文件的路徑,messages就是
上面生成的Person_pb.js文件的路徑。
使用靜態代碼搭建服務端
在項目下app下新建grpcServer2.js
var service = require('../proto/Person_grpc_pb'); var messages = require('../proto/Person_pb');var grpc = require('grpc');var server = new grpc.Server();server.addService(service.PersonServiceService,{getRealNameByUsername:getRealNameByUsernameImpl })server.bind('localhost:8899',grpc.ServerCredentials.createInsecure()); server.start();function getRealNameByUsernameImpl(call,callback) {console.log("username:"+call.request.getUsername())var myResponse = new messages.MyResponse();myResponse.setRealname('公眾號:霸道的程序猿')callback(null,myResponse); }然后運行服務端后再運行客戶端
?
此時在服務端
?
示例代碼下載
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12887305
總結
以上是生活随笔為你收集整理的gRPC中Java和node进行异构通信-互为客户端和服务端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gRPC的通信方式-客户端流式、服务端流
- 下一篇: Java中判断两个Date时间段是否有交