提交 f5d3c021 作者: 潘亚楠

更新 README.md

上级 f5f90692
流水线 #57181 已失败 于阶段
in 1 分 16 秒
......@@ -448,6 +448,252 @@ singleton.getInstance("$_requestFactory");
## Node标准库
1. [简介](#简介)
2. [功能](#功能)
+ [zookeeper](#zookeeper)
+ [rpc](#rpc)
3. [安装](#安装)
## 简介
> todo
## 功能
### zookeeper
#### 介绍
> ClientSync.ts/ TransactionSync.ts 是对zookeeperAPI的封装,将回调函数封装为Promise
> index.ts 基于业务需要对Zookeeper的封装, 如下
```
export interface ConnectOptions {
sessionTimeout: number;
spinDelay: number;
retries: number;
}
export class Zookeeper {
static client: Client;
/**
* @information 删除一个服务
* @param {String} 服务名
* @param {Number} 服务端口号
* @return {Boolean} 删除成功为true
*/
static remove(name: string, port?: number): Promise<boolean>;
/**
* @information 创建zookeeper连接
* @param url zookeeper 服务地址
* @param options 连接选项
*/
static conect(url: string, options?: ConnectOptions): Promise<boolean>;
/**
* @information 注册服务接口
* @param name 服务名称
* @param port 服务端口
* @param pmode 服务类型 (default 永久节点)
* @param cmode 服务的子节点类型(default 临时节点)
* @param acls 权限
* @param data 节点数据
*/
static registe(name: string, port: number, pmode?: number, cmode?: number, acls?: ACL[], data?: Buffer): Promise<string | boolean>;
/**
* @information 获取某个服务的ip和端口
* @param node 节点名
* @return {Promise}
*/
static discover(name: string): Promise<{
children: string[];
stats: Stat;
}>;
/**
* @information 关闭zookeeper连接
*/
static close(): Promise<boolean>;
}
```
#### 使用
> todo
### rpc
#### 介绍
> 契约文件编译
1. 通过编译cli对thrift文件编译
> RPC服务注册
1. 服务的ip及端口注册到zookeeper上以便客户端发现
2. 将多个业务实现注册到当前服务上,以供客户端调用
```
export class RPCServer{
// 服务名
serverName: string;
// 端口号
port: number;
// 多路复用
private mutipleProcessor;
// 服务
private server;
/**
* @information 构造函数,创建多业务类,及服务
* @param serverOptions thrift的传输及协议配置 默认值为TFramedTransport及TBinaryProtocol
*/
constructor(serverOptions?: {});
/**
* @information 通过编译后的thrift业务文件路径及具体实现将业务注册到多业务中
* @param filePath thrift编译后的文件路径 如: '/home/pan/disk/panyanan/project/qjsl_node/thrift_out/TestService1.js'
* @param handler 具体实现 如: {test() {your idea}}
*/
registe(filePath: string, handler: {}): void;
/**
* @information ZookeeperRegister接口的实现
* @param url zookeeper地址
* @param serverName 服务名
* @param port 服务端口
*/
registToZK(url: string, serverName: string, port: number): Promise<void>;
removeFromZK(serverName: string, port: number): Promise<boolean>;
/**
* @information 开启服务,并将服务注册到zookeeper上以便客户端调用
* @param url zookeeper连接地址 如: 192.168.10.200:2181
* @param serverName 服务名
* @param port 服务端口
*/
start(port: number): Promise<boolean>;
/**
* @information 关闭RPC服务 删除zookeeper中的注册信息
*/
close(): Promise<void>;
}
```
> RPC客户端
1. 从zookeeper中发现RPC服务的ip及端口
2. 连接RPC服务,通过编译好的thrift业务模块调用业务
```
/**
* @information RPC客户端类 1 通过zookeeper中的服务名获取服务的ip及端口 2 通过ip及端口创建与服务的连接 3 通过编译后的thrift业务模块返回客户端供使用者调用业务
*/
export class RPCClient {
private connection;
private multiplexer;
constructor();
/**
* @information 从zookeeper中获取服务的ip及端口的接口
* @param url zookeeper地址
* @param serverName 服务名
*/
getServerIPAndPort(url: string, serverName: string): Promise<[string, number]>;
/**
* @information 创建与服务的连接 先从zookeeper中获取服务的ip及端口,利用ip及端口创建连接
* @param url zookeeper地址
* @param serverName 服务名称
* @param connectOptions 与服务的连接选项
*/
connect(ip: string, port: number, connectOptions?: thrift.ConnectOptions): Promise<boolean>;
/**
* @information 通过编译后的thrift业务模块创建对应的客户端
* @param filePath 编译后的thrift业务模块路径 如 '/home/pan/disk/panyanan/project/qjsl_node/thrift_out/TestService1.js'
*/
create(filePath: string): any;
/**
* @information 关闭连接
*/
end(): void;
}
```
#### 使用
1. 编译
+ 编写编译配置文件
```
{
"localSource": "UPA_config_rpc_contract_files",
"gitSource": "https://config-server:12345678@git.allhome.com.cn/Platform/UPA/UPA_config_java/UPA_config_rpc_contract_files.git#dev",
"compileCommand": "thrift/thrift",
"thriftFiles": ["thrift/node/project3/Test.thrift"],
"output": "thrift_out"
}
```
+ package.json中增加编译命令, -l 编译配置文件中的localSource -g 编译配置文件中的gitSource选项 (npx thrift_compile --help 查看介绍)
```
"scripts": {
"compile": "thrift_compile -l thrift_compile.json",
},
```
2. RPC服务端及客户端
```
const path = require('path')
const { RPCServer, RPCClient } = require('qjsl_node')
const
// thrift编译后的业务模块路径
servicePath = path.join(__dirname, 'thrift_out/TestService1.js'),
// zookeeper地址
zkUrl = '192.168.10.200:2181',
// 服务端口号
port = 9000,
// 服务名称
serverName = 'nodeRpcTest';
/**
* 服务启动方法
*/
async function startServer() {
const
// RPCServer实例
rpcServer = new RPCServer(),
// 业务实现
handler = {
tset(param, res) {
console.log(`receive param from client ${param}`);
res(null, 'world');
}
};
// 注册到zookeeper
await rpcServer.registToZK(zkUrl, serverName, port);
// 注册业务
await rpcServer.registe(servicePath, handler);
// 启动服务
await rpcServer.start(port);
// await rpcServer.close()
console.log('server start')
}
async function invokeServer() {
const
// RPCClient实例
rpcClient = new RPCClient(),
// 获取RPC服务的ip及端口
[ip, port] = await rpcClient.getServerIPAndPort(zkUrl, serverName);
// 与服务连接
await rpcClient.connect(ip, port);
// 获取业务客户端
const service1 = rpcClient.create(servicePath);
await new Promise((resolve, reject) => {
// 调用业务实现
service1.tset('hello', (err, res) => {
if (err) reject(err);
console.log(`receive result from server ${res}`);
resolve(res);
})
})
// 关闭客户端
rpcClient.end();
}
startServer()
.then(invokeServer)
```
## 安装
> todo
## 前端脚手架
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论