1.0.0 • Published 3 years ago

md_egg v1.0.0

Weekly downloads
2
License
ISC
Repository
-
Last release
3 years ago

配置:

// config/plugin.js
'use strict';

exports.routerPlus = {
	enable: true,
	package: 'egg-router-plus',
};

exports.cors = {
	enable: true,
	package: 'egg-cors',
};

exports.tracer = {
	enable: true,
	package: 'egg-tracer',
};

exports.prometheus = {
	enable: true,
	package: 'egg-prometheus',
};

exports.mdEgg = {
	enable: true,
	package: 'mdEgg',
};

Context:

1. 重写 curl 方法,在 response headers 中自动写入网关请求的 x-request-id,实现链路追踪;

2. 添加 isLogin 方法,调用公司的 sso 接口,验证用户登陆。本方法应在 Controller 中的业务逻辑之前调用才能拦截请求,防止未登陆用户进行操作。例如

class HomeController extends Controller {
	async index() {
		const { ctx } = this;
		//验证登陆,未登陆则直接响应401,不处理后续逻辑
		await ctx.isLogin();
		ctx.body = 'hi, egg';
	}
}

3.添加 validate 方法,使用async-validator做参数校验,用法如下:

在 app/shemas 中添加相应规则,一般是一个 controller 对应一个文件夹,文件夹下一个 js 文件对应 controller 的一个方法。规则配置如下:

{
  id: [
    { required: true, message: 'id必传' },
    { type: 'number', message: 'id必须为数字'},
    ...
  ]
  ...
}

请求参数不符合规则时将返回 200 和错误 code 码-1,以及所有的不合法参数的 message 信息。
定制高级规则可参考async-validator文档。
使用时在 controller 中业务逻辑前调用 ctx.validate 方法验证参数,例如:

class UserController extends Controller {
  async index() {
    const { ctx, { ctx: { request:  { query } } } } = this;
    //验证登陆,未登陆则直接响应401,不处理后续逻辑
    await ctx.isLogin();
    //验证参数,参数不合法则直接响应400,不处理后续逻辑
    await ctx.validate('user.user', query);
    ctx.body = 'hi, egg';
  }
}

Helper

1. 添加 sign 方法,公司统一签名算法的 nodejs 实现,使用方法

const signedData = ctx.helper.sign(data, appkey, appSecret);

2. 添加 success error 统一输出

    success({ code, status, message, data }) {
        this.ctx.status = status || 200;
        this.ctx.body = {
            code: code || 0,
            message: message || '请求成功',
            data: data || {},
        };
    },

2.添加 excel 工具函数和基本的文件流操作函数:

(1).jsonToSheet: 用于将 json 转换为 excel 的 sheet 格式;
(2).jsontoWb: 用于有 json 生成 workbook。
实际使用案例如下:

// npm i xlsx
// https://www.npmjs.com/package/xlsx
// in controller
const XLSX = require('xlsx');
//... 路由方法中
const excelHeader = { id: '仓库ID', name: '仓库名称', lng: '经度', lat: '纬度', address: '详细地址' };
const excelData = [
	{ id: '100', name: '北京仓库', lng: '100', lat: '99', address: '诺金中心' },
	{ id: '200', name: '上海仓库', lng: '200', lat: '88', address: '东方明珠' },
];
const wb = helper.jsonToWb(excelHeader, excelData);
const excelBuf = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx', compression: true });
ctx.attach('仓库信息表.xlsx', excelBuf);

*注: 两个方法均接受 excelheader,excelData 两个参数,分别表示 excel 表头和数据
(3).attach: 用于接口返回文件附件,如上的 excel 文件。接受文件名(最好包含格式后缀,如.xlsx), 文件 stream 或 buffer 两个参数

Middleware

1.logger:

统一处理后续 middleware 的中的 reponse 和 error,并统一写入日志。 并且可配置特殊 router 不打印日志,配置和 eggjs 内置 logger 不冲突。如下:

// 自定义日志路径及文件名称
config.logger = {
	// 忽略路由日志
	ignoreRouter: ['/healthCheck', '/readinessCheck'],
	level: 'INFO',
	dir: '/med/log/apps',
	// 应用相关日志
	appLogName: 'egg-plugin-test-web.log',
	// 框架、插件相关日志
	coreLogName: 'egg-plugin-test-core.log',
	// agent进程日志
	agentLogName: 'egg-plugin-test-agent.log',
	// logger.error输出位置
	errorLogName: 'egg-plugin-test-error.log',
};

2.cors:

// config.dev.js
config.mdEgg = {
	cors: ['.guazi-cloud.conm'],
};

Schedule

日志定时切割模块,每日固定时间将日志文件进行切割,防止文件过大。引入就行,无需关注。

Service

1. validateToken 方法调用公司 sso 接口

2. event_logger:

(1).http_client: 添加 app.httpclient 的事件监听,实现调用 ctx.curl 方法时自动打印日志, 默认启用。
(2).rpc_client: 添加 app.rpcClient 的事件监听,实现调用 ctx.proxy 的 rpc 方法时自动打印日志, 默认不启用,当使用 egg rpc 时自动启用。

3. tracer:

自动处理网关请求 header 中 x-request-id 实现链路追踪

App 感谢少东

接入prometheus,当启用egg-prometheus插件时,自动加入特定的 metrics 供 promtheus 收集。主要支持且较具参考价值的 metrics 有:

1.httpresponse_time_ms: 路由请求处理时间
2.http_request_total: 路由请求计数
3.http_request_rate: 路由请求计数
4.http_request_error_total: 错误请求计数 5.rpc_consumer_request_rate: rpc consumer 调用计数
6.rpc_consumer_request_total: rpc consumer 调用计数
7.rpc_consumer_fail_response_time_ms: rpc consumer 调用响应时间
8.rpc_provider_request_rate: rpc provider 调用计数
9.rpc_provider_request_total: rpc provider 调用计数
10.rpc_provider_fail_response_time_ms: rpc provider 调用响应时间
11.nodejs_eventloop_lag_seconds: 事件循环时钟
12.nodejs_heap_size
used|totalbytes,nodejs_external_memory_bytes: 堆内存使用情况
13.nodejs_heap_space_size
total|used|availablebytes: 堆空间使用情况
14.process_cpu
use|system_seconds_total: Cpu 使用情况
15.process_open_fds: 文件句柄数统计

初步接入prometheusgrafana(公司地址)看板雏形效果如下:
npm.io
定制指标请根据实际需求使用以上 metrics,参考promql文档进行配置。

*注: 可参考egg-prometheus定制特殊需求的 metrics 并在 app.js 上挂载;
若要实现路由标签的统计,在写 router 时须传入标签参数,如:

// router/home.js
// 分文件夹路由须启用egg-router-plus插件
module.exports = app => {
	const { controller } = app;
	const subRouter = app.router.namespace('/test');

	subRouter.get('主页', '/home', controller.home.index);
};

Config

default

1.启用 lib/tracer; 2.logger: medusa 日志规范配置;
接入kibana后效果如下:
npm.io
*_注:logger 中 app 字段默认读取 package.json 里的 name,如 egg-demo

3.prometheus 配置:

config.prometheus = {
	// prometheus协议监听端口
	scrapePort: 7008,
	// prometheus协议uri
	scrapePath: '/prometheus',
	// prometheus cluster模式监听端口,可以不传,默认6789
	aggregatorPort: 7009,
	// 写入metrics的标签,便于做业务过滤
	defaultLabels: { biz: 'tracker 版控' },
};