zoukankan      html  css  js  c++  java
  • [从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服务通讯的优势在于十分方便,如果你想在服务中调用其他服务,直接像应用服务一样注入使用。查询职员的用户信息如下:

    联调

    启动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

  • 相关阅读:
    没想到吧?这货比 open 更适合读取文件
    卸载 PyCharm!这才是 Python 小白的最理想的 IDE
    git 会保留所有的提交吗?不会!
    C# 在构造函数内调用虚方法
    【转】第一个汇编器是怎么实现的
    SQL Server查询数据库所有表名与表说明
    Vue实现节流,防止重复提交
    mysql 查询json数组(一)
    VScode怎么在代码折叠后,插入新的内容
    Vue 通过调用百度API获取地理位置-经度纬度省份城市
  • 原文地址:https://www.cnblogs.com/william-xu/p/13267426.html
Copyright © 2011-2022 走看看