ABPvNext-微服务框架基础入门
ABPvNext-微服务框架基础入门
本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到gitee仓库中。
准备工作:
1.登录ABPvNext官网 网址 http://abp.io
2.跳转到商业版的说明文档,目前商业版没有中文,只能使用谷歌浏览器的内置翻译功能了
3.框架的相关环境要求,请自自行查看
- 适用于 Windows 的Visual Studio 2022 (v17.3+) /适用于 Mac 的 Visual Studio。1个
- .NET 7.0+
- 节点 v16 或 v18
- Yarn v1.20+(非 v2) 2或 npm v6+(已与 Node 一起安装)
- Redis(作为分布式缓存)。
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-pro2.执行完成后,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文件,项目中有两个地方需要修改,分别是:
Acme.BookStore.DbMigrator\OpenIddictDataSeeder.cs
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生命周期接口,否则不会被注入到系统中
ABPvNext-微服务框架基础入门的更多相关文章
- Surging 微服务框架使用入门
原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...
- golang微服务框架go-micro 入门笔记2.4 go-micro service解读
本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...
- 【非官方】Surging 微服务框架使用入门
前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...
- golang微服务框架go-micro 入门笔记1.搭建 go-micro环境
微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...
- Java云原生崛起微服务框架Quarkus入门实践
@ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...
- Java 微服务框架 Redkale 入门介绍
Redkale 功能 Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全.既可作为服务器使用,也可当工具包使用.作为独立的工具包提供以下功能:1.convert包提供JSON的序列化和反序列化功 ...
- springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)
Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...
随机推荐
- Java (新)将Excel数据读取到ListMap
Java (新)将Excel数据读取到ListMap Maven依赖: pom.xml <!-- excel --> <dependency> <groupId>o ...
- python2 selenium
参考blog: https://www.cnblogs.com/xiaozhiblog/p/5378723.html http://www.cnblogs.com/fnng/ 一.项目结构介绍 下面逐 ...
- ddddd
项目二阶段总结 账户微服务 短信发送 1.压测发现问题 首先对短信smscomponent的send方法在test单元测试类中测试,不是真的发短信测试,可以建立请求开始和结束的时间戳来确定请求的耗时. ...
- 测试--MD5--加密
CREATE TABLE `test`.`testmd5` ( `id` INT ( 4 ) NOT NULL, `name` VARCHAR ( 20 ) NOT NULL, `pwd` VARCH ...
- Q:oracle 日期筛选
一.oracle where条件日期筛选 两种方法:tochar和todate todate:将字符串按照指定的格式输出,得到的是日期类型. to_date('2019-12-01','yyyy-MM ...
- 四、用CSS制作图形以及简单动画
一.利用阴影画一个月亮 说明:画月亮,需要先画一个圆,然后利用box-shadow属性,生成阴影,再将圆的颜色变为透明即可. <html> <head></head> ...
- 深入理解css 笔记(7)
前面讲了几种控制网页布局的方式,flex,gird 和 float.这下我们初略讲下 position.这个我日常中用到的已经挺多了.定位和其他控制文档流的行为不同.它将元素彻底从文档流中移走,它 ...
- NXOpen遍历工作部件表达式
//用户代码#include <uf_defs.h>#include <NXOpen/NXException.hxx>#include <NXOpen/Session.h ...
- 如何优化if--else
1.现状代码 public interface IPay { void pay(); } package com.test.zyj.note.service.impl; import com.test ...
- webpack之性能优化(webpack4)
在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...