Aller au contenu principal

Release 3.9.0

· 4 minutes de lecture
Harry Chen

大促积攒了约两周的需求,统一在 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', // 后缀匹配
]
},
// ...
// ...
}
}
}