首页

使用koa如何写一个gRPC的客服端

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。gRPC是一个款高性能,开源的通用RPC框架,由google主导并维护。gRPC几乎支持目前所有主流的语言,跨平台,分布式的框架。

前置准备
- Nodejs
- gRPC的组件包
- Visual Studio Code
- gRPC服务

源代码下载地址:https://github.com/iissy/koagrpc

1. 安装Node
这个步骤很简单,到官网下载LTS版,目前最新的版本是v8.12.0,地址:https://nodejs.org/en/


2. node包的安装
下载包之前,创建一个项目文件夹,比如:E:\github.com\koagrpc
> npm install koa --save-dev
> npm install koa-static --save-dev
> npm install koa-views --save-dev
> npm install koa-router --save-dev
> npm install grpc --save-dev

注意:koa与express不同,它将组件彻底的独立,比如视图,路由,中间件等等都要独立安装;前面几个koa的包都能下载成功,最后一个gRPC下载会失败,这是由于国内网络的原因,我是购买了一个香港的阿里云服务器,在上面装上nodejs,执行命令下载后复制到本地,然后释放掉云服务器,这个虽然有点麻烦,但是很快就能完成。

3. 创建文件


接下来一个个文件来介绍

helloworld.proto
syntax = "proto3";

package helloworld;

service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
string name = 1;
}

message HelloReply {
string message = 1;
}

index.html
<html>
<header>
<link rel="stylesheet" href="/styles/main.css">
</header>

<body>
<div id="main">
<table width="600">
<tr>
<td colspan="2">
<div style="font-size: 18px;color:#ff0000;font-weight: bolder;">测试接口</div>
</td>
</tr>
<tr>
<td><a href="/SayHello" target="_blank">/SayHello</a></td>
<td>说嗨喽</td>
</tr>
</table>
</div>
</body>

</html>

app.js,node项目的启动文件,包含一个静态页面的渲染,组建的导入
const Koa = require('koa');
const app = new Koa();
const static = require('koa-static');
const views = require('koa-views')
const index = require('./index')

var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;

console.log('Example app listening at http://%s:%s', host, port);
});

const main = static(__dirname + '/public');
app.use(main);
app.use(views(__dirname + '/views'));
app.use(index.routes(), index.allowedMethods())

grpcconnect.js,这个是gRPC的核心文件,它连接一个本地的端口是50052的gRPC服务,这个服务在我这里并为涉及到,用户自行搭建
var grpc = require('grpc');
var PROTO_PATH = './proto/helloworld.proto';

var proto = grpc.load(PROTO_PATH).helloworld;
var client = new proto.Greeter('0.0.0.0:50052', grpc.credentials.createInsecure());

function SayHello(params) {
return new Promise(function(resolve, reject) {
console.log('start get data...');
client.sayHello(params, function(err, response) {
if (err) {
console.log(err);
reject(err);
} else {
resolve(response);
}
})
});
}

exports.SayHello = SayHello;

index.js,这里是koa路由方式,koa-router与koa的核心组件是独立,必须下载并引入到项目;这里定义了两个地址:/,/SayHello
var https = require('./grpcconnect');
const router = require('koa-router')()

router.get("/", async(ctx, next) => {
await ctx.render('index');
})

router.get('/SayHello', async(ctx, next) => {
var params = { name: "john" };
var json = await https.SayHello(params);
ctx.body = json;
});

module.exports = router;

4. 测试
执行> node app.js,然后在浏览器中输入地址,效果如图所示


总结:一个gPRC的nodejs客户端就到此结束了,之所以选择koa,而不是Express,主要是喜欢koa的优雅与轻量级,以及组件独立,需要用到哪个就下载哪个。使用nodejs连接gRPC服务还有个优点,就是它不用protoc生成代码,而是底层处理的。
from 爱施园
Posted by 森林 on 2018/10/13
Copyright ©2018 爱施园 粤ICP备14091834号