Node gRPC 初印象 && 跑起来 (1)

Node gRPC 初印象 && 跑起来 (1)

1、什么是rpc

RPC长途调用意图:通过像调用本地服务相同长途调用另一台服务器上的服务来完成需求。

Node gRPC 初印象 && 跑起来 (1)
可参阅官网:

grpc.io/

2、简略过程

Node gRPC 初印象 && 跑起来 (1)

3、运用协议缓冲区(Working with Protocol Buffers)

Node gRPC 初印象 && 跑起来 (1)

可参阅官网

developers.google.com/protocol-bu…

4、过程

1、界说 结构

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

2、写服务端

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
// The response message containing the greetings
message HelloReply {
  string message = 1;
}

3、写客户端

4、起服务测试

5、自己 起一个试试

1、新建一个文件夹  mkdir grpc-node-demo
2初始化  npm init -y
3、npm grpc 服务  npm install grpc @grpc/proto-loader
4、发动 server node server.js
5、发动 client node client.js
6、注意端口 不要被别的服务占用,还有一点是每次修正 server.js 需求重启 服务
  • 新建 server.js

const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
//包界说信息,加载 hello.proto 文件的对应信息 这个文件服务端和客户端都会运用到
/*
参数:
    filename –一个或多个要加载的文件途径。 可所以绝对途径,也可所以相对于包括途径的途径。
选项 -
    装备选项:
        keepCase –保存字段称号。 默认设置是将它们更改为驼峰式。
        longs –应该用于表明long值的类型。 有用选项是Number和String 。 默以为库中的Long目标类型。
        enums –应该用于表明enum值的类型。 仅有有用的选项是String 。 默以为数值。
        bytes –应该用于表明bytes值的类型。 有用选项是Array和String 。 默认是运用Buffer 。
        defaults –在输出目标上设置默认值。 默以为false 。
        arrays –为空数组设置缺少的数组值,即便defaults值为false 。 默以为false 。
        objects –即便defaults值为false也为缺少的目标值设置空目标。 默以为false 。
        oneofs –将虚拟的oneof特点设置为当时字段的称号
        includeDirs –查找导入的.proto文件的途径。
*/
const packageDefinition = protoLoader.loadSync('helloTest.proto',{
    keepCase:true,
    longs:String,
    enums:String,
    defaults:true,
    onefs:true,
});
//创立包 helloworld特点 要跟.proto 文件的包名共同
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
//创立server
const server = new grpc.Server();
//增加服务  helloTest 为服务名 要跟.proto 文件共同
server.addService(hello_proto.helloTest.service, {
    //实现 SayHello 要跟.proto 文件共同界说的办法名共同
    //call 获取恳求信息, callback用来向客户端回来信息
    SayHiMark : (call,callback) => {
        try{
            //获取.proto 文件里界说的 name,age 也就是恳求参数
            let {name,age} = call.request;
            //判别有没有它,有就执行callback()【这是一个回调函数】,没有,就不执行
            //callback 两个参数  第一个参数,假如报错能够传入 error 第二参数按proto 文件里的约好传值
            callback && callback(null,{ message:`我叫${name},年纪${age}岁`});
        }catch (error) {
            console.log('服务端出错', error);
            callback && callback(error);
        }
    }
});
//绑定ip和端口
server.bind('127.0.0.1:8888',grpc.ServerCredentials.createInsecure());
//发动服务
server.start();
console.log('服务现已发动,请发动客户端 ........');
  • 新建 client.js

//包引入
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
//包界说信息,加载 hello.proto 文件的对应信息 这个文件服务端和客户端都会运用到
/*
参数:
    filename –一个或多个要加载的文件途径。 可所以绝对途径,也可所以相对于包括途径的途径。
选项 -
    装备选项:
        keepCase –保存字段称号。 默认设置是将它们更改为驼峰式。
        longs –应该用于表明long值的类型。 有用选项是Number和String 。 默以为库中的Long目标类型。
        enums –应该用于表明enum值的类型。 仅有有用的选项是String 。 默以为数值。
        bytes –应该用于表明bytes值的类型。 有用选项是Array和String 。 默认是运用Buffer 。
        defaults –在输出目标上设置默认值。 默以为false 。
        arrays –为空数组设置缺少的数组值,即便defaults值为false 。 默以为false 。
        objects –即便defaults值为false也为缺少的目标值设置空目标。 默以为false 。
        oneofs –将虚拟的oneof特点设置为当时字段的称号
        includeDirs –查找导入的.proto文件的途径。
*/
const packageDefinition = protoLoader.loadSync('helloTest.proto',{
    keepCase:true,
    longs:String,
    enums:String,
    defaults:true,
    oneofs:true,
});
//创立包 helloworld特点 要跟.proto 文件的包名共同
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld
//初始化客户端
console.log('init client');
//hello 办法是服务名 要跟.proto 文件的服务名共同 第一个参数是ip和端口要跟服务端保持共同
const client = new hello_proto.helloTest('127.0.0.1:8888',grpc.credentials.createInsecure());
//调用服务的 SayHello 办法  并 依照proto 约好传参
client.SayHiMark({name: 'mark_fu', age : 18}, (err,response) => {
    if(err){
        console.log(err);
        return ;
    }
    console.log(response.message);
});
  • 新建 helloTest.proto

syntax = "proto3";
package helloworld;
// 界说服务名 helloTest
service helloTest {
    // 界说服务 SSayHiMark 办法
    // HelloRequest 恳求格局
    // HelloResponse 回来格局
    rpc SayHiMark(HelloRequest) returns(HelloResponse) {}
}
// 界说调用服务需求传递的参数 和 回来的参数。
message HelloRequest {
    //这儿的 1 代表第一个参数  2 代表第二个参数
    string name = 1;
    int32 age = 2;
}
// 界说回来参数的格局
message HelloResponse {
    //界说第一个参数
    string message = 1;
    // 这儿我没有界说 age,那么response中也不会有
}
  • 结果

Node gRPC 初印象 && 跑起来 (1)

  • 非常 nice , 功德圆满 !

参阅 文档

www.npmjs.com/package/@gr…

6、本项目 github 地址

github.com/huanhunmao/…

更多精彩,行将袭来……