域服务构建
AWS CDK构造,为实现域驱动设计(DDD)有界上下文提供了一个完整的基础架构模式。该结构包括API网关、DynamoDB和EventBridge,以支持具有适当域分离的微服务架构。
特性
- API网关:域的RESTful API端点
- DynamoDB:具有复合密钥结构的NoSQL数据库(pk/sk模式)
- EventBridge:用于域事件和服务间通信的自定义事件总线
- 预先配置的权限:Lambda函数可以自动访问域资源
- CORS支持:web应用程序的可选CORS配置
- 环境感知命名:资源命名与环境后缀一致
安装
npm install domain-service-construct基本用法
import { DomainServiceConstruct } from 'domain-service-construct';
const userDomain = new DomainServiceConstruct(this, 'UserDomain', {
domainName: 'user-management',
environment: 'dev',
enableCors: true,
});api参考
DomainServiceConstructProps
| 属性 | 类型 | 必填 | 描述 |
|---|---|---|---|
domainName | string | 是 | 此服务的域名 |
environment | string | 否 | 资源命名的环境后缀 |
enableCors | boolean | 否 | 在API网关上启用CORS |
tableProps | 部分 | 否 | 其他DynamoDB表配置 |
apiProps | 部分 | 否 | 其他API网关配置 |
eventBusName | string | 否 | 自定义EventBridge总线名称 |
公共财产
api:API网关RestApi实例table:DynamoDB表实例eventBus:EventBridge EventBus实例domainName:用于此服务的域名
方法
createDomainFunction(id: string, props: FunctionProps): Function
使用预先配置的环境变量和权限创建Lambda函数:
TABLE_NAME:DynamoDB表名EVENT_BUS_NAME:EventBridge巴士名称DOMAIN_NAME:域名
该函数自动获取DynamoDB表的读/写权限,并将权限放在EventBridge总线上。
addApiResource(path: string, methods?: string[]): Resource
使用可选的CORS配置将资源添加到API网关。
addEventRule(id: string, eventPattern: EventPattern): Rule
为域的事件总线创建EventBridge规则。
完整示例
import { App, Stack, StackProps } from 'aws-cdk-lib';
import { Runtime, Code } from 'aws-cdk-lib/aws-lambda';
import { LambdaIntegration } from 'aws-cdk-lib/aws-apigateway';
import { DomainServiceConstruct } from 'domain-service-construct';
export class OrderDomainStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
// Create domain service
const orderDomain = new DomainServiceConstruct(this, 'OrderDomain', {
domainName: 'order-processing',
environment: 'prod',
enableCors: true,
});
// Create business logic functions
const createOrderFunction = orderDomain.createDomainFunction('CreateOrder', {
runtime: Runtime.NODEJS_18_X,
handler: 'index.handler',
code: Code.fromAsset('lambda/create-order'),
});
const getOrderFunction = orderDomain.createDomainFunction('GetOrder', {
runtime: Runtime.NODEJS_18_X,
handler: 'index.handler',
code: Code.fromAsset('lambda/get-order'),
});
// Set up API routes
const ordersResource = orderDomain.addApiResource('orders');
const orderResource = ordersResource.addResource('{orderId}');
ordersResource.addMethod('POST', new LambdaIntegration(createOrderFunction));
orderResource.addMethod('GET', new LambdaIntegration(getOrderFunction));
// Set up event handling
orderDomain.addEventRule('OrderEvents', {
source: ['order-processing'],
detailType: ['Order Created', 'Order Updated', 'Order Cancelled'],
});
}
}DynamoDB密钥模式
该构造使用复合键模式 pk (分区键)和 sk (排序键)以支持各种访问模式:
// Example key patterns
{ pk: 'USER', sk: 'user-123' } // Single user
{ pk: 'ORDER', sk: 'order-456' } // Single order
{ pk: 'USER#user-123', sk: 'ORDER#order-456' } // User's order事件驱动架构
EventBridge集成实现了域之间的松耦合:
// Publishing domain events
await eventbridge.putEvents({
Entries: [{
Source: 'order-processing',
DetailType: 'Order Created',
Detail: JSON.stringify({ orderId, customerId, amount }),
EventBusName: process.env.EVENT_BUS_NAME
}]
}).promise();最佳实践
- 领域边界:每个构造代表一个有界上下文
- 事件命名:跨域使用一致的事件命名约定
- 资源命名:使用描述性域名便于识别
- 环境隔离:始终指定适当的资源隔离环境
- 安全:该构造遵循IAM权限的最小特权原则
贡献
此构造遵循AWS CDK最佳实践,旨在针对特定域需求进行扩展,同时保持团队之间的一致性。
