简介
在微服务体系中通常具有多个网关,其中内部网关负责转发微服务间的网络请求。内部网关并不会公开,以保证内部通信的安全稳定。本篇将介绍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.Client
,该中间件对内部接口请求的身份信息进行了包装,在进行服务通讯时会自动携带身份信息。
添加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