日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

gRPC中Java和node进行异构通信-互为客户端和服务端

發(fā)布時間:2025/3/19 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gRPC中Java和node进行异构通信-互为客户端和服务端 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

場景

gPRC簡介以及Java中使用gPRC實現(xiàn)客戶端與服務(wù)端通信(附代碼下載):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108711541

上面介紹了在Java中使用gPRC進行通信的搭建方式。

如果是使用node作為客戶端與Java的服務(wù)端進行通信 ,或者是node作為服務(wù)端與Java客戶端進行通信怎么辦。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費下載。

實現(xiàn)

使用Java進行g(shù)PRC服務(wù)端和客戶端的搭建參照上面,在上面搭建好的基礎(chǔ)上,

打開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"} }

這里的代碼內(nèi)容可以去gRPC的github上的示例代碼中去復(fù)制

https://github.com/grpc/grpc/blob/v1.30.x/examples/node/package.json

?

然后打開Ternimal

npm install

進行安裝依賴,就會在項目目錄下生成node_modules目錄。

?

然后在項目下新建proto文件夾,在此目錄下將之前Java項目中的Person.proto復(fù)制過來

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; }

動態(tài)代碼生成的方式

前面在Java中搭建客戶端和服務(wù)端時都需要調(diào)用插件去生成代碼,在node中可以使用動態(tài)代碼生成的方式和靜態(tài)代碼的方式去搭建。

搭建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的服務(wù)端,然后運行node的客戶端,在grpcClient.js上右擊run

?

搭建node的服務(wù)端

在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:'公眾號:霸道的程序猿'}); }

前面的內(nèi)容與搭建客戶端一致,在進行方法的具體實現(xiàn)時,左邊的getRealNameByUsername

就是proto文件中定義的接口的方法名,右邊getRealNameByUsernameImpl是在當(dāng)前js中方法的具體實現(xiàn)方法。

運行node的服務(wù)端,然后運行java的客戶端。

?

靜態(tài)代碼生成的方式

靜態(tài)代碼生成的方式與上面Java端搭建客戶端與服務(wù)端的流程差不多,就是使用插件根據(jù)prpto文件生成代碼,然后再去編寫代碼。

首先確保電腦上已經(jīng)安裝了protoc并配置了環(huán)境變量。

具體流程可以參照下面

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

?

這里直接使用配置進環(huán)境變量的prptoc.exe,就不能再一層層進入到node_modules所在的目錄了。

然后在Ternimal下繼續(xù)執(zhí)行

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

注意這里的執(zhí)行前的路徑是在項目的根目錄下,因為已經(jīng)配置了protoc的環(huán)境變量,所以直接使用prptoc開頭才能識別命令。

然后---js_out后面是固定的寫法 在binary:后面的路徑和后面--grpc_out的路徑是分別生成在proto中定義的message的代碼和service的代碼路徑,這里./就是當(dāng)前路徑,就是相對于proto在同一個路徑下,然后proto-gen-grpc是跟的node_modules中g(shù)rpc_node_plugin.exe的路徑,最后面跟的是prpto文件相對于項目的路徑,因為命令是在項目根目錄下執(zhí)行的。

?

生成代碼成功后就在proto文件所在的路徑下生成了兩個js文件。那么生成代碼成功。

使用靜態(tài)代碼搭建客戶端

在項目下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文件的路徑。

使用靜態(tài)代碼搭建服務(wù)端

在項目下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); }

然后運行服務(wù)端后再運行客戶端

?

此時在服務(wù)端

?

示例代碼下載

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12887305

總結(jié)

以上是生活随笔為你收集整理的gRPC中Java和node进行异构通信-互为客户端和服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。