ABPVNEXT-微服务框架基础入门

准备工作:

  • 1.登录ABPvNext官网 网址 http://abp.io

  • 2.跳转到商业版的说明文档,目前商业版没有中文,只能使用谷歌浏览器的内置翻译功能了

  • 3.框架的相关环境要求,请自自行查看

  • 4.安装ABP CLI工具,安装方式是使用dotnet命令行工具,作为.NET开发者,这个本机一定是有的了

    复制代码
    //安装或者更新构建工具,如果想与我这篇文章一样,请指定安装版本号
    dotnet tool install -g Volo.Abp.Cli
    
    //登录ABP官网账号,既然使用商业版,肯定是已经有相关账号了
    abp login <username>
    
    //安装 ABP 套件(主要功能是后续创建解决方案以及代码生成工具等)
    abp suite install

创建项目并启动:

  • 1.通过ABP提供的商业套件 新建一个项目,本次使用图形化方式创建

    复制代码
    //执行完成后会拉起一个控制台,和网页,不要关闭控制台
    abp suite
  • 2.在打开的页面中,点击 Create a New solution(创建一个新的解决方案)

  • 3.创建使用微服务模板创建,所以选择Microservice template

  • 4.分别输入项目名称(Project Name) 输出目录(Output folder)以及UI模式(MVC),点击确定,开始 创建项目

  • 5项目生成完成后,打开相关目录,可以看到工具给生成的ABPvNext微服务项目

  • 6.接下来,我们将run-tye.ps1文件打开,需要修改一下其中的一些配置(更改前)

    复制代码
    <# Check development certificates #>
    <# 本地的证书,由于项目分层,之间调用都是使用https方式,所以本地调试必须有证书 #>
    if (! (  Test-Path ".\etc\dev-cert\localhost.pfx" -PathType Leaf ) ){
       Write-Information "Creating dev certificates..."
       cd ".\etc\dev-cert"
       .\create-certificate.ps1
       cd ../..  
    }
    
    <# 这个是官方提供的运行环境,这个建议大家单独安装,否则开发机器会很卡,所以直接删除掉 #>
    
    $requiredServices = @(
      'sql-server-db',
      'grafana',
      'prometheus',
      'kibana',
      'rabbitmq',
      'elasticsearch',
      'redis'
    )
      
    foreach ($requiredService in $requiredServices) {  
    
        $nameParam = -join("name=", $requiredService)
      $serviceRunningStatus = docker ps --filter $nameParam
      $isDockerImageUp = $serviceRunningStatus -split " " -contains $requiredService
      
      if( $isDockerImageUp )
      {
        Write-Host ($requiredService + " [up]")
      }
      else
      {
          cd "./etc/docker/"
        docker network create abpmicservie-network
        docker-compose -f docker-compose.infrastructure.yml -f docker-compose.infrastructure.override.yml up -d
        cd ../..
        break;
      }
    }
    <# 这个后面会手动执行,所以也删除掉 #>
    cd "./shared/ABPMicServie.DbMigrator"
    dotnet run
    cd ../..
     
    
    <# Run all services #>
    
    tye run --watch
  • 我们将文件重命名为 运行.ps1,内容如下

    <# Check development certificates #>

    if (! ( Test-Path ".\etc\dev-cert\localhost.pfx" -PathType Leaf ) ){

    Write-Information "Creating dev certificates..."

    cd ".\etc\dev-cert"

    .\create-certificate.ps1

    cd ../..

    }

    <# Run all services #>

    tye run --watch

  • 7.先不要运行项目,在项目的根目录打开PowerShell,运行dotnet build命令,整体还原项目包

  • 8.打开项目,更改 shared/ABPMicServie.DbMigrator 项目的数据库链接字符串

  • 9.在数据库中分别建立四个数据,然后更改项目中链接字符串的IP,用户名等

  • 10.在ABPMicServie.DbMigrator项目右键→调试→启动新示例,运行迁移项目,如果链接字符串设置的没问题,执行成功后,数据库中相应表就应该已经生成完成,可以查看一下数据库,看看相应的表是否已经创建完成

  • 11.接下来就是更改各个项目的链接字符串 ,根据原有链接修改:

    • ABPMicServie.AuthServer
    • ABPMicServie.AdministrationService.HttpApi.Host
    • ABPMicServie.IdentityService.HttpApi.Host
    • ABPMicServie.ProductService.HttpApi.Host
    • ABPMicServie.SaasService.HttpApi.Host
  • 12.接下来要修改各个项目的中间件配置,包括 RabbitMQ,Redis,ElasticSearch等,由于修改基本涵盖了,apps,gateways,services三个目录下的所有项目,就不一一列举了

  • 13.安装tye,也是直接只用dotnet的控制台工具

    复制代码
    dotnet tool install -g Microsoft.Tye --version "0.11.0-alpha.22111.1"
  • 14.安装完成后,直接在项目目录的运行.ps1文件单击右键→使用powershell运行,出现下面窗口

  • 15.在浏览器中打开 localhost:8000,出现tye管理界面,具体每个服务的端口,日志都可以查看

  • 16.访问web项目对应的端口,我这次对应的端口为 https://localhost:44321/ ,看到这个界面说明web服务已正常运行,接下来我们点击登录,进入登录界面

  • 17.微服务模式的登陆使用的统一认证方式,所以在登录界面实际是调用了ABPMicServie.AuthServer相关的服务,默认的管理用户名:admin 密码:1q2w3E* 这个密码是在迁移文件中设置的

  • 18.登录成功,看到如下页面,就说明ABPvNext的微服务框架已顺利执行成功,撒花 😀

向现有解决方案中新增一个微服务

  • 1.来到解决方案的根目录下,打开powershell,执行创建新服务的命令

    复制代码
    //OrderService 是你新创建服务的名称,建议试用Serviec结尾,保证和其他服务的统一性
    abp new OrderService -t microservice-service-pro
  • 2.执行完成后,services文件夹下会多出一个order目录,这就是新增的微服务项目

  • 3.进入这个目录,使用powershell执行dotnet build 还原orderServie项目包

  • 4.接下来的操作就是将新建的服务新增到解决方案中,可以使用vs界面操作,我这里就介绍另外一种添加的方法,使用dotnet命令新增一个项目

    复制代码
    dotnet sln add services/order/src/ABPMicServie.OrderService.HttpApi.Host/ABPMicServie.OrderService.HttpApi.Host.csproj --solution-folder services
  • 接下来配置新增微服务的授权,新增授权主要是更改OpenIddictDataSeeder.cs文件,项目中有两个地方需要修改,分别是:

    1. Acme.BookStore.DbMigrator\OpenIddictDataSeeder.cs
    2. Acme.BookStore.IdentityService.HttpApi.Host\DbMigrations\OpenIddictDataSeeder.cs.
  • 创建ApiScope

    复制代码
    await CreateScopesAsync("OrderService");
  • 然后在:zymictest.OrderService.HttpApi.Host/appsettings.json 节点中新增

    "SwaggerClientId": "WebGateway_Swagger"

  • 在ABPMicServie.DbMigrator/OpenIddictDataSeeder.cs文件的CreateClientsAsync方法中,新增其他内部客户端的调用权限,哪个客户端需要调用,就添加哪个,现在为了测试,就讲所有的客户端都添加了,图片里只截图了一个,下面的每个客户端权限都添加了,具体可以参考ProductService添加

  • 在ABPMicServie.DbMigrator/OpenIddictDataSeeder.cs文件的CreateWebGatewaySwaggerClientsAsync方法中参照ProductService,添加OrderService,这是为了增加swagger的客户端

  • 接下来ABPMicServie.IdentityService.HttpApi.Host项目中的OpenIddictDataSeeder.cs也要同步更改,官方文档文档中解释是使用迁移命令就必须更改两个

  • CreateSwaggerClientAsync方法中需要修改两处,一个是通过配置文件获取到的RootUrl,然后把这个RootUrl拼接完整后,添加到Swagger Client客户端中,这个是授权服务中需要使用的

  • 代码修改完成后 需要更改ABPMicServie.DbMigrator/appsettings.json 配置文件,新增OrderService,具体样式参考ProductService,OrderService端口可以在ABPMicServie.OrderService.HttpApi.Host项目中查看

  • 接下来更新网关的授权文件,打开ABPMicServie.WebGateway项目的ABPMicServieWebGatewayModule.cs文件,参考ProductService ,新增一个OrderService

  • 新增ABPMicServie.WebGateway/ocelot.json 的路由配置,注意端口要更改成你orderservice项目的端口

  • 新建一个OrderService的数据库,并更改下面两个项目的数据库连接字符串

    • ABPMicServie.OrderService.HttpApi.Host,
    • ABPMicServie.DbMigrator
  • 在ABPMicServie.DbMigrator项目中添加OrderService的引用

    复制代码
    <ProjectReference Include="..\..\services\order\src\ABPMicServie.OrderService.Application.Contracts\ABPMicServie.OrderService.Application.Contracts.csproj"/>
       
    <ProjectReference Include="..\..\services\order\src\ABPMicServie.OrderService.EntityFrameworkCore\ABPMicServie.OrderService.EntityFrameworkCore.csproj"/>
  • 添加完成后的项目引用应该是这样的

  • 在ABPMicServie.DbMigrator/ABPMicServieDbMigratorModule.cs文件中添加模块的依赖

    复制代码
    typeof(OrderServiceApplicationContractsModule),
    typeof(OrderServiceEntityFrameworkCoreModule)
  • 为了在web项目中使用orderService微服务中的页面,我们需要讲引用添加到web项目中

    复制代码
        <ProjectReference Include="..\..\..\..\services\order\src\ABPMicServie.OrderService.HttpApi.Client\ABPMicServie.OrderService.HttpApi.Client.csproj" />
        <ProjectReference Include="..\..\..\..\services\order\src\ABPMicServie.OrderService.Web\ABPMicServie.OrderService.Web.csproj" />
  • 然后在ABPMicServie.Web/ABPMicServieWebModule.cs中添加依赖

    复制代码
    typeof(OrderServiceWebModule),
    typeof(OrderServiceHttpApiClientModule)
  • 在ABPMicServieWebModule.cs的AddAbpOpenIdConnect方法中,添加OpenID 连接范围

  • 接下来我们要更新tye配置文件,把刚刚新建的微服务相关参数新增上去,方便以后启动调试,一定要修改端口号,每个新的项目端口号都是不一致的

    复制代码
    - name: order-service
      project: services/order/src/Acme.BookStore.OrderService.HttpApi.Host/Acme.BookStore.OrderService.HttpApi.Host.csproj
      bindings:
        - protocol: https
          port: 45247 ***** do not forget to replace this port with yours *****
      env:
        - Kestrel__Certificates__Default__Path=../../../../etc/dev-cert/localhost.pfx
        - Kestrel__Certificates__Default__Password=e8202f07-66e5-4619-be07-72ba76fde97f
  • 接下来添加新服务的迁移配置,更改ABPMicServie.DbMigrator/ABPMicServieDbMigrationService.cs,添加

  • 在最后的生成迁移数据库之前,一定记得把ABPMicServie.IdentityService.HttpApi.Host项目中的OpenIddictDataSeeder.cs文件也同步更改,具体更改参见ABPMicServie.DbMigrator项目中的同名文件

  • 重新使用运行.ps1运行所有项目后,如果登录报错,大概率是犹豫新增加的种子数据没有初始化到表中,可以使用各种方式修改,我这里使用简单粗暴的方式,删除所有

  • ordreService的swagger授权报错,是因为ABPMicServie.AuthServer/appsettings.json 中的跨域请求,不设置的话获取时会报错

微服务间的通信(同步-HTTP代理模式)

目的:实现OrderService微服务中,调用ProductService的相关函数

  • 1.在OrderService.Application.Contracts 中添加ProductService.Application.Contracts

    复制代码
    <ProjectReference Include="..\..\..\product\src\ABPMicServie.ProductService.Application.Contracts\ABPMicServie.ProductService.Application.Contracts.csproj" />
  • 2.在OrderServiceApplicationContractsModule.cs中添加依赖

  • 3.在ABPMicServie.OrderService.Application项目中添加ABPMicServie .ProductService.HttpApi.Client

  • 4.OrderServiceApplicationModule.cs添加依赖

    复制代码
    typeof(ProductServiceHttpApiClientModule)
  • 接下来做一个测试,在默认项目中的新增这段代码

    复制代码
    using System.Threading.Tasks;
    using ABPMicServie.ProductService.Products;//引用命名空间
    using Microsoft.AspNetCore.Authorization;
    
    namespace ABPMicServie.OrderService.Samples;
    
    public class SampleAppService : OrderServiceAppService, ISampleAppService
    {
        IProductAppService _productAppService;//构造函数注入
    
        public SampleAppService(IProductAppService productAppService)
        {
            _productAppService = productAppService;
        }
        public async Task<SampleDto> GetAsync()
        {
        //调用另外一个服务的方法
          await _productAppService.CreateAsync(new ProductCreateDto() { Name="zyzy", Price=100 });
            return
                new SampleDto
                {
                    Value = 43
                };
            
        }
    
        [Authorize]
        public Task<SampleDto> GetAuthorizedAsync()
        {
            return Task.FromResult(
                new SampleDto
                {
                    Value = 42
                }
            );
        }
    }
  • 5.这样直接调用会报错,原因就是我们需要使用管理员登录到后台,在管理→OPENID→应用程序中,找到我们远程调用的应用程序"rderServiceClient",然后在操作菜单中,添加上需要调用服务的相关权限,比如这次我们要调用产品服务的相关权限,那就产品服务相关权限添加上

  • 6.这样当执行Sample的GetAsync()方法的时候,就会同步调用另外一个微服务的新增接口,实现的远程调用,客户端授权,以及权限管理的相关功能

微服务间的通信(异步-RabbitMQ模式)

  • 1 .在ABPMicServie.OrderService.HttpApi.Host/appsettings.json中更改RabbitMQ的链接字符配置,更改成你要使用的服务

  • 在ABPMicServie.ProductService.Application.Contracts项目中添加一个用来传输数据的类,如果其他服务需要使用使用这个类,需要添加ABPMicServie.ProductService.Application.Contracts的引用,注意循环引用的问题

  • 在需要发送mq消息的类中,使用IDistributedEventBus 发送消息,其实这就是分布式消息总线,

  • 新建一个类,继承 IDistributedEventHandler<SamplesEto> ,并实现HandleEventAsync方法,注意,新建的类一定要继承ITransientDependency生命周期接口,否则不会被注入到系统中

相关推荐
Lee川13 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
勤劳打代码13 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
AI攻城狮17 小时前
OpenClaw 里 TAVILY_API_KEY 明明写在 ~/.bashrc,为什么还是失效?一次完整排查与修复
人工智能·云原生·aigc
子兮曰18 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
卓卓不是桌桌21 小时前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly21 小时前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
阿里云云原生2 天前
零配置部署顶级模型!函数计算一键解锁 Qwen3.5
云原生
AI攻城狮2 天前
Kimi Bot + OpenClaw 完整配置指南:5 步实现本地 AI Agent 集成
人工智能·云原生·aigc
用户881586910912 天前
AI Agent 协作系统架构设计与实践
架构
鹏北海2 天前
Qiankun 微前端实战踩坑历程
前端·架构