Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
T
together
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
潘亚楠
together
Commits
f5d3c021
提交
f5d3c021
authored
4月 29, 2020
作者:
潘亚楠
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新 README.md
上级
f5f90692
流水线
#57181
已失败 于阶段
in 1 分 16 秒
变更
1
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
246 行增加
和
0 行删除
+246
-0
README.md
README.md
+246
-0
没有找到文件。
README.md
浏览文件 @
f5d3c021
...
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论