node使用grpc对与服务端进行通讯

首选需要下载两个运行依赖:

@grpc/grpc-js 和 @grpc/proto-loader

以下内容摘自网络:
在gRPC里,客户端可以直接调用不同机器上的服务应用的方法,就像是本地对象一样,所以创建分布式应用和服务就很简单了。在很多RPC(Remote Procedure Call Protocol)系统里,gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法。在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用。在客户端,有一个stub提供和服务端相同的方法。
在各种环境里,gRPC客户端和服务端都能运行并且互相通讯 - 从谷歌内部服务到你自己的桌面 - 并且可以写在任何gRPC支持的语言。比如,可以简单的创建java作为gRPC的服务端,Go,Python或者Ruby作为客户端。另外,最新的谷歌APIs将会有gRPC版本的接口,可以方便的在应用里构建Google功能。
如果在node中使用grpc通讯:
首先定义proto文件结构如下:

//语法 proto3
syntax = "proto3";

//proto文件服务端和客户端定义的内容相同,可以理解为协商好的一个规则文件,服务端和客户端都要遵守这一个规则
//包名
package proto;

service ContainerService {
//rpc对应的ListRequest没有指定参数,表示这个接口不用往后端传递参数,returns表示后端返回的数据
  rpc ContainerList(ListRequest) returns (ListReturn){}
  rpc ContainerCreate(Container) returns (ContainerReturn){}
  rpc ContainerStart(ContainerID) returns (ContainerReturn){}
  rpc ContainerStop(ContainerID) returns (ContainerReturn){}
  rpc ContainerRestart(ContainerID) returns (ContainerReturn){}
  rpc ContainerRemove(ContainerID) returns (ContainerReturn){}
  rpc ContainerLogs(ContainerID) returns (LogsReturn){}
  rpc ContainerExec(ExecRequest) returns (ExecReturn){}
}

message ListRequest{
}

message ListReturn{
  repeated Container Containers = 1;
}

message ContainerReturn{
  int32 StatusCode = 1;
  string Message = 2;
}

message ContainerID{
  string ID = 1;
}

message LogsReturn{
  repeated string logs = 1;
}

message ExecRequest{
  string ID = 1;
  string WorkingDir = 2;
  repeated string Cmd = 3;
}

message ExecReturn{
  repeated string results = 1;
}

message Container {
  string ID = 1;
  string Name = 2;
  string Image = 3;
  string Command = 4;
  int64 Created = 5;
  string State = 6;
  string Status = 7;
  repeated Port Ports = 8;
  repeated Mount Mounts = 9;
}

message Port {
  string Type = 1;
  string IP = 2;
  int32 PrivatePort = 3;
  int32 PublicPort = 4;
}

message Mount{
  string Type = 1;
  string Name = 2;
  string Source = 3;
  string Destination = 4;
  string Driver = 5;
  string Mode = 6;
  bool RW = 7;
}

2.加载protoLoader定义信息

/**
 1、第一个参数为proto文件存放路径,根据自己存放路径进行调整
 2、第二个参数为固定写法,一般不需要过多调整
*/
const packageDefinition = protoLoader.loadSync('container.proto',{
    keepCase:true,
    longs:String,
    enums:String,
    defaults:true,
    oneofs:true
})

//第二步,导入声明的包 
//.proto为proto文件的包名,即上边声明的proto文件
const _proto = grpc.loadPackageDefinition(packageDefinition).proto;
//第三步,建立链接
//建立与ContainerService这个组的链接,第一个参数为服务端ip地址,第二个参数固定写法
const client = new _proto.ContainerService('zmjkf.cn:9594',grpc.credentials.createInsecure())
//第三步,发送请求
//第一个参数为对象,key value按照proto对应的规则进行传参,第二个为回调可以获取后端返回数据
client.ContainerCreate({StatusCode:1,Message:'2'},(err,res)=>{
    if(err){
        console.log(err);
        return;
    }
    console.log(res);
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在PHP中使用gRPC方式调用Java服务端,需要分为以下步骤: 1. 安装gRPC PHP扩展 在PHP中使用gRPC需要安装gRPC的PHP扩展。可以使用PECL来安装,命令如下: ```bash pecl install grpc ``` 安装完成后,需要在php.ini中添加以下配置: ``` extension=grpc.so ``` 2. 定义.proto文件 在Java中定义服务的.proto文件,例如: ``` syntax = "proto3"; package com.example; service MyService { rpc MyMethod (MyRequest) returns (MyResponse); } message MyRequest { string name = 1; } message MyResponse { string message = 1; } ``` 3. 生成Java和PHP代码 使用protobuf的编译器protoc来生成Java和PHP代码。可以在命令行中执行以下命令: ``` protoc --java_out=java_output_dir --grpc-java_out=java_output_dir --php_out=php_output_dir --grpc_out=php_output_dir --plugin=protoc-gen-grpc=/path/to/grpc_php_plugin my_service.proto ``` 其中,`java_output_dir`和`php_output_dir`分别是Java和PHP代码的输出目录。`/path/to/grpc_php_plugin`是gRPC PHP插件的路径。 4. 在Java中实现服务 在Java中实现MyService服务的方法,例如: ```java public class MyServiceImpl extends MyServiceGrpc.MyServiceImplBase { @Override public void myMethod(MyRequest request, StreamObserver<MyResponse> responseObserver) { String name = request.getName(); String message = "Hello, " + name + "!"; MyResponse response = MyResponse.newBuilder().setMessage(message).build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 5. 在Java中启动服务 在Java中启动gRPC服务,例如: ```java Server server = ServerBuilder.forPort(8080) .addService(new MyServiceImpl()) .build() .start(); server.awaitTermination(); ``` 6. 在PHP中调用服务 在PHP中实现调用Java服务的代码,例如: ```php require_once __DIR__ . '/vendor/autoload.php'; $client = new MyServiceClient('localhost:8080', [ 'credentials' => Grpc\ChannelCredentials::createInsecure(), ]); $request = new MyRequest(); $request->setName('John'); list($response, $status) = $client->MyMethod($request)->wait(); if ($status->code !== Grpc\STATUS_OK) { echo "RPC failed with status: " . $status->code . ", details: " . $status->details; } else { echo $response->getMessage(); } ``` 需要注意的是,PHP中的gRPC库可能存在一些差异,需要根据具体情况进行调整。此外,在使用gRPC时,需要确保Java和PHP的版本号一致,以免出现不兼容的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值