文档章节

grpc typescript 实例

xuezi
 xuezi
发布于 2018/06/26 22:48
字数 667
阅读 651
收藏 0

前言

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

正如其他 RPC 系统,gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。

包装

最近转向 typescript 做 node 开发, 基于 express 的 mvc 服务框架涉及到与其他语言服务进程通信,于是就把之前用 javascript 写的 grpc 包装重新用 typescript 写了一遍。

grpc-ts 分为两个包,一个服务端用的,一个客户端用的, 点击可跳转到 GitHub:

使用

这里是配合基于 express 的 typescript-mvc 框架 mvc-ts 使用的。

定义统一的 proto 文件

hello.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.service.test";
option objc_class_prefix ="RTG";

package hello;

service Hello {
  rpc say(stream Empty) returns (stream Word) {};
}

message Empty {

}

message Word {
  string word = 1;
}

服务端使用

定义service helloService.ts

import { Route, Service } from "grpc-server-ts";

@Service('path_to_hello.proto')
export class HelloService {
  @Route
  public async say() {
    return 'hello world';
  }
}

开启服务

import { RpcRegistry, Settings } from 'grpc-server-ts';

import 'helloService.ts';

@Settings(settings)
class RPC extends RpcRegistry { }
RPC.start();

settings 参数

{
  port: "3333",                     // listen port
  host: "localhost",                // listen host
  ca: "runtime/rpc/ca.crt",         // ca file path
  cert: "runtime/rpc/server.crt",   // cert file path
  key: "runtime/rpc/server.key"     // key file path
}

服务端的 grpc 就启动在 localhost:3333

客户端使用

定义client, Hello.ts

import { Route, Client } from 'grpc-client-ts';

@Client(__dirname + '/protobuf/Hello.proto')
export class Hello {
  @Route
  public async say(data, result) { }
}

创建一个controller,HelloController.ts

import * as Express from 'express';

import { Inject, RestController, Get, Res } from "mvc-ts";
import { Hello } from 'Hello.ts';

@RestController('/example')
export class HelloController {
  @Inject()
  private helloRpc: Hello;

  @Get('/hello')
  public async indexAction(@Res() res: Express.Response) {
    let result = await this.helloRpc.say({});
    res.json(result);
  }
}

开启服务, index.ts

import { ApplicationLoader, ApplicationSettings, Inject, ConfigContainer } from 'mvc-ts';

import 'HelloController.ts';

import 'Hello.ts';

@ApplicationSettings({ rootDir: `${__dirname}/../` })
class Application extends ApplicationLoader { }
const Application = new CpApplication();
Application.start(5566);

@Settings(settings)
class ClientRpc extends RpcClientRegistry { }
ClientRpc.start();

settings 参数

{
  port: "3333",                            // server side grpc port
  host: "localhost",                       // server side grpc host
  ca: "runtime/rpc/ca.crt",                // ca file path
  client_cert: "runtime/rpc/server.crt",   // client_cert file path
  client_key: "runtime/rpc/server.key"     // client_key file path
}

运行代码

ts-node index.ts

ts-node 我是用的 4.x 的版本

打开浏览器访问 http://localhost:5566/example/hello 获得结果

{
  "word": "hello world"
}

© 著作权归作者所有

xuezi
粉丝 0
博文 1
码字总数 667
作品 0
福州
私信 提问
Nest.js v5.6.1 发布,基于 TypeScript 的 Node.js 框架

Nest.js v5.6.1 发布了,更新内容主要是新特性的增加和错误修复。 Nest 是构建高效、可扩展的 Node.js Web 应用程序的框架。它使用现代的 JavaScript 或 TypeScript(保留与纯 JavaScript 的...

段段段落
01/17
994
2
Notadd —— 基于 nest.js 的微服务开发框架

前言 随着 node.js 社区的不断发展,虽然有 express 、koa 、egg .... 这样的框架,或者更应该称之为工具包,无一解决 js 作为一个后端语言的问题 —— 架构。 Nest.js 的出现解决了这些问题...

左华栋
01/28
220
4
Notadd 4.0.0-alpha.1 发布,基于 nest.js 的微服务架构

Notadd 4.0.0-alpha.1 发布了,新功能包括: AOP 面向切面编程 支持 Typescript Graphql API 支持 Grpc 的微服务架构 用户组织权限 服务(需要额外下载) Nest 采纳了 Angular 最核心的设计思...

左华栋
2018/08/23
438
2
Notadd 4.0.0-beta1 发布,AOP 风格的 node.js 微服务开发架构

特点: AOP 面向切面编程 支持 Typescript Graphql API 支持 Grpc 的微服务架构 BUG 修复 修复protobuf空字符串错误 修复创建用户API 修复拼写错误 修复auth错误 修复系统模块错误 修复graph...

左华栋
2018/10/12
767
0
Nest.js 5.5 发布,最近火的一P的node.js 框架

Nest 发布一年(以发布第一个版本为限)便超过 10000 star ,目前每月下载量超过 230k Nest.js 是用于构建高效且可伸缩 Web 应用程序的渐进式 Node.js 框架。 完美支持 Typescript 面向 AOP ...

左华栋
2018/12/10
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部