[从0到1搭建ABP微服务] - 搭建内部网关

简介

在微服务体系中通常具有多个网关,其中内部网关负责转发微服务间的网络请求。内部网关并不会公开,以保证内部通信的安全稳定。本篇将介绍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服务通讯的优势在于十分方便,如果你想在服务中调用其他服务,直接像应用服务一样注入使用。查询职员的用户信息如下:
[从0到1搭建ABP微服务] - 搭建内部网关_第1张图片

联调

启动AuthServer、InternalGateway、IdentityService、Business服务。

使用脚本命令一键启动更加方便,后续我会详细的介绍ci/cd启动。

测试接口如下:
[从0到1搭建ABP微服务] - 搭建内部网关_第2张图片

可以看到接口并未携带token同样调用成功,因为business-app已经配置User权限。给微服务分配客户端权限更加科学,因为在c端系统中用户往往没有任何权限,甚至直接匿名,没有用户信息。

总结

ABP虽然提供了完整的服务通讯基础设施,但是由于使用http方式,而且授权验证过程繁琐,所以整体效率并不是很高,但是速度也是在可以接受的范围。如果要追求极致性能,建议在微服务内部通讯时跳过授权认证,但为了安全,不要公开免认证的微服务。

代码地址:https://github.com/WilliamXu96/ABP-MicroService
文章目录:https://www.cnblogs.com/william-xu/p/12537155.html

你可能感兴趣的:([从0到1搭建ABP微服务] - 搭建内部网关)