如何在.NET Aspire中配置本地开发与生产环境的差异化设置
本地与Azure生产环境差异化配置方案
要实现本地开发与Azure Container Apps生产环境的差异化服务配置,核心是利用azd的多环境管理、环境变量注入和基础设施模板定义,不需要改动业务代码。以下分两种场景详细说明:
场景一:本地Redis容器 ↔ 生产Azure Cache for Redis
本地开发配置
- 在项目根目录的
.env.local文件中配置本地Redis连接信息:REDIS_CONNECTION_STRING=redis://localhost:6379 - 用
docker-compose.yml启动本地Redis容器:version: '3.8' services: redis: image: redis:latest ports: - "6379:6379" - 应用代码统一读取
REDIS_CONNECTION_STRING环境变量即可。
生产环境配置
- 添加Azure Cache for Redis资源:在
infra目录的Bicep模板中定义Redis缓存资源:resource redisCache 'Microsoft.Cache/redis@2023-08-01' = { name: '${resourceGroupName}-redis' location: location properties: { sku: { name: 'Standard' family: 'C' capacity: 1 } enableNonSslPort: false } } - 注入生产环境变量:在
infra/app.bicep中给Container App配置Redis连接字符串作为环境变量:resource containerApp 'Microsoft.App/containerApps@2023-05-01' = { // 其他容器应用配置 properties: { configuration: { secrets: [ { name: 'redis-connection-string' value: redisCache.properties.primaryConnectionString } ] environmentVariables: [ { name: 'REDIS_CONNECTION_STRING' secretRef: 'redis-connection-string' } ] } } } - 部署生产环境:创建并部署生产环境:
azd env new prod azd up --environment prod
场景二:本地Dapr状态存储/消息 ↔ 生产Cosmos DB + Service Bus
本地开发配置
- 在项目
components/local目录下创建Dapr本地组件配置:- 状态存储
statestore.yaml:apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore spec: type: state.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: "" - 消息订阅
pubsub.yaml:apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: ""
- 状态存储
- 本地启动应用时加载Dapr组件:
dapr run --app-id myapp --app-port 3000 --components-path ./components/local npm start
生产环境配置
- 添加Azure资源:在
infra目录的Bicep模板中定义Cosmos DB和Service Bus资源:// Cosmos DB 状态存储 resource cosmosDbAccount 'Microsoft.DocumentDB/databaseAccounts@2023-04-15' = { name: '${resourceGroupName}-cosmos' location: location properties: { databaseAccountOfferType: 'Standard' locations: [{ locationName: location, failoverPriority: 0 }] } } resource cosmosDbDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2023-04-15' = { parent: cosmosDbAccount name: 'statestore-db' properties: { resource: { id: 'statestore-db' } } } // Service Bus 消息服务 resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-10-01-preview' = { name: '${resourceGroupName}-sb' location: location sku: { name: 'Standard', tier: 'Standard' } } - 创建生产Dapr组件:在
components/prod目录下配置生产环境组件:- 状态存储
statestore.yaml:apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore spec: type: state.azure.cosmosdb version: v1 metadata: - name: url value: "${COSMOS_DB_ACCOUNT_URI}" - name: database value: "statestore-db" - name: collection value: "statestore-collection" - name: masterKey value: "${COSMOS_DB_ACCOUNT_KEY}" - 消息订阅
pubsub.yaml:apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.azure.servicebus version: v1 metadata: - name: connectionString value: "${SERVICE_BUS_CONNECTION_STRING}"
- 状态存储
- 配置Container App:在
infra/app.bicep中挂载生产Dapr组件并注入环境变量:resource containerApp 'Microsoft.App/containerApps@2023-05-01' = { // 其他容器应用配置 properties: { dapr: { enabled: true appId: 'myapp' componentsPath: './components/prod' } configuration: { secrets: [ { name: 'cosmos-db-uri', value: cosmosDbAccount.properties.documentEndpoint } { name: 'cosmos-db-key', value: cosmosDbAccount.listKeys().primaryMasterKey } { name: 'service-bus-connection-string', value: listKeys(serviceBusNamespace.id, '2022-10-01-preview').primaryConnectionString } ] environmentVariables: [ { name: 'COSMOS_DB_ACCOUNT_URI', secretRef: 'cosmos-db-uri' } { name: 'COSMOS_DB_ACCOUNT_KEY', secretRef: 'cosmos-db-key' } { name: 'SERVICE_BUS_CONNECTION_STRING', secretRef: 'service-bus-connection-string' } ] } } } - 部署生产环境:
azd env new prod azd up --environment prod
通用原则
- 所有环境差异通过环境变量和组件配置目录区分,业务代码无需改动
- 用azd的多环境特性(
azd env new)管理不同环境的配置 - 基础设施资源统一在Bicep模板中定义,实现一键部署
内容的提问来源于stack exchange,提问作者Ebrito
相关产品推荐
相关产品推荐

