簡介
在微服務體系中通常具有多個網關,其中內部網關負責轉發微服務間的網絡請求。內部網關並不會公開,以保證內部通信的安全穩定。本篇將介紹ABP內部網關服務的搭建和微服務通訊。
創建並配置項目
新建一個InternalGateway空項目並安裝以下nuget包:
PM> Install-Package IdentityServer4.AccessTokenValidation
PM> Install-Package Ocelot
PM> Install-Package Serilog.AspNetCore
PM> Install-Package Serilog.Sinks.Async
PM> Install-Package Serilog.Sinks.ElasticSearch
PM> Install-Package Serilog.Sinks.File
PM> Install-Package Volo.Abp.AspNetCore.Serilog
PM> Install-Package Volo.Abp.Autofac
PM> Install-Package Volo.Abp.Identity.HttpApi
配置InternalGatewayHostModule
內部網關不需要太多插件,所以只需依賴AbpAutofacModule、AbpIdentityHttpApiModule、AbpAspNetCoreSerilogModule,然后注冊jwt認證和ocelot。
相關代碼可見GitHub
配置ocelot
ocelot配置非常簡單,只要在appsettings中進行轉發服務地址配置即可。配置IdentityService如下:
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/identity/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 55389
}
],
"UpstreamPathTemplate": "/api/identity/{everything}",
"UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ]
}
],
其他配置可見完整項目:GitHub
微服務內部通訊
下面來演示如何在微服務中使用內部網關進行服務通訊。
配置遠程服務和身份授權
Identity服務的接口都有身份認證,想要獲取Identity信息必須要先授權然后請求接口,在Business服務中需要添加內部服務地址和App Client身份和授權配置。
"RemoteServices": {
"Default": {
"BaseUrl": "http://localhost:59682/",
"UseCurrentAccessToken": "false"
}
},
"IdentityClients": {
"Default": {
"GrantType": "client_credentials",
"ClientId": "business-app",
"ClientSecret": "1q2w3e*",
"Authority": "http://localhost:53362",
"Scope": "InternalGateway IdentityService"
}
}
注: business-app需要在授權服務中進行手動添加。
員工關聯用戶場景
在Business系統中有一個職員管理業務,每一個職員需要關聯一個ABP用戶,查詢職員時同時查詢關聯的用戶信息。
Step1:添加引用
添加Volo.Abp.Identity.HttpApi.IdentityModel,該中間件對內部接口請求的身份信息進行了包裝,在進行服務通訊時會自動攜帶身份信息。
添加Volo.Abp.Identity.HttpApi.Client,該組件提供了用戶服務的Api接口。
Step2:添加依賴
在BusinessApplicationModule中分別添加AbpHttpClientIdentityModelModule、AbpIdentityHttpApiClientModule依賴。
Step3:獲取用戶信息
首先在EmployeeAppService中注入UserAppService應用,ABP服務通訊的優勢在於十分方便,如果你想在服務中調用其他服務,直接像應用服務一樣注入使用。查詢職員的用戶信息如下:

聯調
啟動AuthServer、InternalGateway、IdentityService、Business服務。
使用腳本命令一鍵啟動更加方便,后續我會詳細的介紹ci/cd啟動。
測試接口如下:

可以看到接口並未攜帶token同樣調用成功,因為business-app已經配置User權限。給微服務分配客戶端權限更加科學,因為在c端系統中用戶往往沒有任何權限,甚至直接匿名,沒有用戶信息。
總結
ABP雖然提供了完整的服務通訊基礎設施,但是由於使用http方式,而且授權驗證過程繁瑣,所以整體效率並不是很高,但是速度也是在可以接受的范圍。如果要追求極致性能,建議在微服務內部通訊時跳過授權認證,但為了安全,不要公開免認證的微服務。
代碼地址:https://github.com/WilliamXu96/ABP-MicroService
文章目錄:https://www.cnblogs.com/william-xu/p/12537155.html
