
ABP Framework 在架構上有四大目標:模塊化、DDD、多租戶和微服務。從?7.0
?更新的功能來看,其側重點轉向微服務場景的實現,比如:Dapr 集成、動態權限和功能、外部本地化、分布式實體緩存服務,都是對微服務和分布式架構所提出的解決方案。
ABP Framework 已然在成為優雅的 .NET 微服務基礎設施道路上開始狂奔!
歡迎加入?ABP Framework 研習社,千人學習群(QQ群:726299208),問題解答、經驗分享、示例源碼、電子書共享,歡迎入住!?
ABP Framework 7.0 新增功能
本版本中的重要特性
??.NET 框架升級到?
7.0
??OpenIddict 升級到?
4.0
??Dapr 集成
??集成服務
??動態權限和功能
??外部本地化基礎設施
??分布式實體緩存服務
??Blazor UI 布局鉤子
??eShopOnAbp項目的改進
.NET 框架升級到?7.0
緊跟 .NET 升級步伐,ABP Framework 解決方案升級到?.NET 7.0
?。
OpenIddict 升級到?4.0
OpenIddict 4.0 預覽版于2022年6月22日發布,在 ABP 7.0 中 OpenIddict Nuget包引用升級到?4.0-preview
。一旦 OpenIddict 4.0 最終版本發布,也會立即同步升級到穩定版本,并計劃使 ABP 7.0 最終版使用 OpenIddict 4.0 穩定版本。
Dapr 集成
Dapr,分布式應用程序運行時,提供API簡化微服務開發。ABP 和 Dapr 有一些相互交叉的功能和特性,如服務對服務通信、分布式消息總線和分布式鎖定。需要注意的是:ABP 和 Dapr 目的是不同的。ABP 目標是提升端到端開發體驗,例如:框架提供的客戶端與服務器端動靜態代理、服務器端遠程服務調用,極大地提升了開發體驗;而 Dapr 目的是提供一個運行時,將常見的微服務通信模式與應用程序邏輯進行解耦。
ABP 7.0 提供了一些包,可以更好地與 Dapper 集成。我將在下面介紹一些重要的集成。
分布式事件總線集成
ABP 分布式事件總線系統允許應用程序通過事件進行異步通信,系統提供了抽象層,擴展友好可以基于不同的通信技術來實現,前面的版本已經提供基于 RabbitMQ、Kafka、Rebus、Azure Service Bus 的實現。
本版本新增?Volo.Abp.EventBus.Dapr
?和?Volo.Abp.AspNetCore.Mvc.Dapr.EventBus
包,使 ABP 分布式事件總線有了基于 Dapr 基礎設施的實現。Volo.Abp.EventBus.Dapr
包用于發布事件,Volo.Abp.AspNetCore.Mvc.Dapr.EventBus
包用于訂閱事件。
C# API 客戶端代理集成
ABP可以生成動態或靜態代理類,實現從 .NET 客戶端應用程序調用 HTTP API。
Volo.Abp.Http.Client.Dapr
?包用于配置客戶端代理系統,以方便地使用 Dapr 服務來調用構建塊,實現應用程序之間的通信。
分布式鎖
ABP 提供分布式鎖定來控制多個應用程序對共享資源的訪問。Volo.Abp.DistributedLocking.Dapr
包使 ABP 使用 Dapr 分布式鎖構建塊。
ABP 7.0 提供選項類?
AbpDistributedLockOptions
?來配置分布式鎖,可以指定任何名稱作為鎖前綴。
集成服務
集成服務用來將為模塊間(或微服務間)通信而構建的應用服務與為用戶界面或客戶端應用程序使用的應用程序服務進行區分。
在 ABP 7.0 中,可以使用?[IntegrationService]
?特性(在?Volo.Abp.Application.Services
?命名空間中定義)將應用服務標記為集成服務。例子:
[IntegrationService]
public?class?ProductAppService?:?ApplicationService,?IProductAppService
{//?...
}
如果對應用服務定義了接口,比如?IProductService
,還可以在服務接口上使用:
[IntegrationService]
public?interface?IProductAppService?:?IApplicationService
{//?...
}
使用特性標記的服務,ABP 將按照約定執行以下操作:
??如果使用?自動創建API控制器?特性,URL前綴將是?
/integration-api/
?而不是?/api/
。通過這種方式,就可以在微服務系統中阻止 API網關 對集成服務 API 的調用,并且不授權這些服務。在自動創建API控制器時,還可以使用?ConventionalControllerSetting
?對象?ApplicationServiceTypes
?選項設置是否包含集成服務。??默認情況下,對集成服務的調用不會被審計日志記錄,因為其作用是供其他服務使用。可以在?
AbpAuditingOptions
?選項類中將?IsEnabledForIntegrationServices
?設置為true
,為集成服務啟用審計日志記錄。
動態權限和功能
在 ABP Framework 中,權限和功能在項目中通過代碼定義。基于此設計,在不同微服務中定義權限(或功能)以及在單獨應用中對所有權限進行集中管理,變得很困難。為了實現權限管理,需要一個單獨的微服務,并添加所有微服務的服務契約項目引用,以知道所有微服務的權限(和功能)并管理它們。因此,只要任何一個微服務的權限發生變化,就需要重新部署權限管理微服務。
在?7.0
?中,我們引入動態授權和動態功能系統。參看如下圖:

在?微服務1
中定義權限?A
?和?B
,在微服務2
中定義權限C
?D
?E
?,在微服務中通過引用權限類庫,直接將權限信息寫入到授權管理數據庫中。通過權限管理微服務提供權限管理UI管理用戶的所有權限。
在?ABP 7.0
?的解決方案中,所有微服務都序列化自己的權限定義,并在應用程序啟動時將它們寫入權限管理共享數據庫(使用高度優化的算法)。另一方面,權限管理服務可以動態地從數據庫獲取這些權限定義(也經過了高度優化,以減少數據庫的使用),并允許UI為用戶或角色顯示和管理它們。這些操作都是在框架內自動工作的。
如果你想知道為什么做出這些決定以及解決了什么問題,可以參看?分布式和微服務系統的授權解決方案?。
外部本地化基礎設施
本地化是微服務系統中的另一個問題,當每個微服務定義了自己的本地化文本,在構建一個統一的UI應用程序時,實現?IExternalLocalizationStore
?來獲得其他服務的本地化。
分布式實體緩存服務
在 7.0 中 ABP 引入了分布式實體緩存服務。假設有一個?Product
?實體,實際上是一個聚合根:
public?class?Product?:?AggregateRoot<Guid>
{public?string?Name?{?get;?set;?}public?string?Description?{?get;?set;?}public?float?Price?{?get;?set;?}public?int?StockCount?{?get;?set;?}
}
希望使用緩存來提高訪問產品的速度。首先應該在模塊類的?ConfigureServices
?方法中配置依賴注入來注冊?IEntityCache
服務:
context.Services.AddEntityCache<Product,?Guid>();
然后,只需要注入?IEntityCache<Product, Guid>
?服務即可。
public?class?ProductAppService?:?ApplicationService
{private?readonly?IEntityCache<Product,?Guid>?_productCache;public?ProductAppService(IEntityCache<Product,?Guid>?productCache){_productCache?=?productCache;}public?async?Task<ProductDto>?GetAsync(Guid?id){var?product?=?await?_productCache.GetAsync(id);return?ObjectMapper.Map<Product,?ProductDto>(product);}
}
示例代碼中,假設將對象映射配置為從?Product
?映射到?ProductDto
?。
在這里,直接緩存了?Product
?對象。在這種情況下,Product
?類必須是可序列化的,因為在分布式緩存中被序列化為JSON格式保存。
在某些情況下,可能希望使用另一個類來存儲緩存數據。例如,對于緩存對象,可能希望使用?ProductDto
?類而不是?Product
?類。在這種情況下,更改依賴注入配置如下:
context.Services.AddEntityCache<Product,?ProductDto,?Guid>();
會注入?IEntityCache<ProductDto, Guid>
?服務代替?IEntityCache<Product, Guid>
服務。
可以通過將?DistributedCacheEntryOptions
?對象傳遞給?AddEntityCache
?方法來配置緩存的持續時間:
context.Services.AddEntityCache<Product,?ProductDto,?Guid>(new?DistributedCacheEntryOptions{SlidingExpiration?=?TimeSpan.FromMinutes(30)}
);
默認的緩存持續時間是2分鐘,使用?AbsoluteExpirationRelativeToNow
?配置。
Blazor UI 布局鉤子
布局鉤子系統允許你向布局的某些特定部分添加代碼,ABP 框架提供的所有主題布局都實現了布局鉤子。
eShopOnAbp 項目的改進
在這個版本中,eShopOnAbp 項目進行了以下改進:
??集成 Keycloak ,一個開源的身份和訪問管理系統,作為身份驗證服務器,而不是內置的身份驗證服務器(基于IdentityServer或OpenIddict)。
??產品詳情頁面使用 CMS Kit 評級和評論功能(模塊復用)。
ABP Framework 學習路徑
快速入門:《ABP Framework 極速開發》
系統掌握:《精讀 Mastering ABP Framework》
歷史版本更新說明
??ABP Framework 6.0.1 新增功能和重要變更
??ABP Framework 5.3.0 版本新增功能和變更說明
??ABP Framework 5.2 RC 新增功能
??ABP Framework 5.0 RC.1 新特性和變更說明
??ABP Framework V4.4 RC 新增功能介紹