大促积攒了约两周的需求,统一在 v3.9.0 发布。
升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。
Breaking
从 v3.9.0 开始,Midway 仅支持 Node.js >=12.11.0
版本。
Features
1、bootstrap 新增进程模型
从 v3.9.0 开始,为了应对 socket.io 在 pm2 场景下的粘性会话,我们新增一种 master-worker 模型支持。简单来说,将由 pm2 来启动 midway 的 master,在 master 启动 worker,这样可以相对自由的定制 master 中的逻辑。
原有的 Bootstrap
之外,新增了一个 ClusterManager
来处理进程,示例如下:
const { ClusterManager, Bootstrap } = require('@midwayjs/bootstrap');
const clusterManager = new ClusterManager({
// 执行的子进程文件
exec: __filename,
// 进程数
count: 2,
});
if (clusterManager.isPrimary()) {
// 启动主进程
clusterManager.start();
} else {
// 原有子进程执行
Bootstrap.run();
}
关于 socket.io 的粘性会话,我们将在 socket.io 组件中介绍更多。
2、增加 @InjectClient 支持
为 ServiceFactory 类型添加一个 @InjectClient
装饰器,方便在多客户端的的时候选择注入。
比如使用多个 redis 组件的时候。
原来:
import { RedisServiceFactory } from '@midwayjs/redis';
import { join } from 'path';
@Provide()
export class UserService {
@Inject()
redisServiceFactory: RedisServiceFactory;
async save() {
const redis1 = this.redisServiceFactory.get('instance1');
const redis2 = this.redisServiceFactory.get('instance2');
//...
}
}
现在可以通过注入来简化。
import { RedisServiceFactory } from '@midwayjs/redis';
import { InjectClient } from '@midwayjs/core';
@Provide()
export class UserService {
@InjectClient(RedisServiceFactory, 'instance1')
redis1: RedisService;
@InjectClient(RedisServiceFactory, 'instance2')
redis2: RedisService;
async save() {
// this.redis1.set(...)
// this.redis2.set(...)
}
}
注意,所有继承于 ServiceFactory 的多实例组件都可以使用上述方法。
3、casbin 支持 watcher 抽象
除了社区的 casbin-redis-watcher,我们也提供了复用 redis 连接的 watcher,为了减少包,后续所有的 casbin/redis 相关的功能都将复用 casbin-redis-adapter
包。
使用示例:
import { MidwayAppInfo } from '@midwayjs/core';
import { join } from 'path';
import { createAdapter, createWatcher } from '@midwayjs/casbin-redis-adapter';
export default (appInfo: MidwayAppInfo) => {
return {
keys: '123456',
redis: {
clients: {
'node-casbin-official': {
host: '127.0.0.1',
port: 6379,
password: '',
db: '0',
},
'node-casbin-sub': {
host: '127.0.0.1',
port: 6379,
password: '',
db: '0',
}
}
},
casbin: {
// ...
policyAdapter: createAdapter({
clientName: 'node-casbin-official'
}),
policyWatcher: createWatcher({
pubClientName: 'node-casbin-official',
subClientName: 'node-casbin-sub',
})
},
};
}
由于 pub/sub 连接需要不同,这里定义了两个客户端,和 adapter 存储复用其中一个连接。
4、DataSource 的不同路径支持
为了解决不同用户的使用习惯,我们支持了大多数可能的通配形式,现在你可以在 DataSource 中使用很多以前的格式。
比如:
export default {
mysql: {
dataSource: {
dataSource1: {
// ...
entities: [
'entity', // 特定目录
'**/abc/**', // 仅获取包含 abc 字符的目录下的文件
'abc/**/*.ts', // 特定目录 + 通配
'abc/*.entity.ts', // 匹配后缀
'**/*.entity.ts', // 通配加后缀匹配
'**/*.{j,t}s', // 后缀匹配
]
},
// ...
// ...
}
}
}