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

场景

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载):

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

如果是使用node作为客户端与Java的服务端进行通信 ,或者是node作为服务端与Java客户端进行通信怎么办。

注:

实现

使用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上的示例代码中去复制

09c56cac8050c3e7987bd9c7925fa994.png

然后打开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 = newgrpc.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将对象进行序列化与反序列化:

然后在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文件相对于项目的路径,因为命令是在项目根目录下执行的。

13729433.html

生成代码成功后就在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 = newmessages.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 = newgrpc.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 = newmessages.MyResponse();

myResponse.setRealname('公众号:霸道的程序猿')

callback(null,myResponse);

}

然后运行服务端后再运行客户端

此时在服务端

示例代码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值