- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到gitee仓库中.
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.接下来就是更改各个项目的链接字符串 ,根据原有链接修改:
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文件,项目中有两个地方需要修改,分别是:
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方法中,新增其他内部客户端的调用权限,哪个客户端需要调用,就添加哪个,现在为了测试,就讲所有的客户端都添加了,图片里只截图了一个,下面的每个客户端权限都添加了,具体可以参考 Product Service添加 。
在ABPMicServie.DbMigrator/OpenIddictDataSeeder.cs文件的CreateWebGatewaySwaggerClientsAsync方法中参照 Product Service,添加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.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 中的跨域请求,不设置的话获取时会报错 。
目的:实现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()方法的时候,就会同步调用另外一个微服务的新增接口,实现的远程调用,客户端授权,以及权限管理的相关功能 。
1 .在ABPMicServie.OrderService.HttpApi.Host/appsettings.json中更改RabbitMQ的链接字符配置,更改成你要使用的服务 。
在ABPMicServie.ProductService.Application.Contracts项目中添加一个用来传输数据的类,如果其他服务需要使用使用这个类,需要添加ABPMicServie.ProductService.Application.Contracts的引用,注意循环引用的问题 。
在需要发送mq消息的类中,使用IDistributedEventBus 发送消息,其实这就是分布式消息总线, 。
新建一个类,继承 IDistributedEventHandler<SamplesEto> ,并实现HandleEventAsync方法,注意,新建的类一定要继承ITransientDependency生命周期接口,否则不会被注入到系统中 。
最后此篇关于ABPvNext-微服务框架基础入门的文章就讲到这里了,如果你想了解更多关于ABPvNext-微服务框架基础入门的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要开发一个简单的网站,我通常使用 bootstrap CSS 框架,但是我想使用 Gumbyn,它允许我使用 16 列而不是 12 列。 我想知道是否: 我可以轻松地改变绿色吗? 如何使用固定布局
这个问题在这里已经有了答案: 关闭 13 年前。 与直接编写 PHP 代码相比,使用 PHP 框架有哪些优点/缺点?
我开发了一个 Spring/JPA 应用程序:服务、存储库和域层即将完成。 唯一缺少的层是网络层。我正在考虑将 Playframework 2.0 用于 Web 层,但我不确定是否可以在我的 Play
我现有的 struts Web 应用程序具有单点登录功能。然后我将使用 spring 框架创建一个不同的 Web 应用程序。然后想要使用从 struts 应用程序登录的用户来链接新的 spring 应
我首先使用Spark框架和ORMLite处理网页上表单提交的数据,在提交中文字符时看到了unicode问题。我首先想到问题可能是由于ORMLite,因为我的MySQL数据库的字符集已设置为使用utf8
我有一个使用 .Net 4.5 功能的模块,我们的应用程序也适用于 XP 用户。所以我正在考虑将这个 .net 4.5 依赖模块移动到单独的项目中。我怎样才能有一个解决方案,其中有两个项目针对不同的版
我知道这是一个非常笼统的问题,但我想我并不是真的在寻找明确的答案。作为 PHP 框架的新手,我很难理解它。 Javascript 框架,尤其是带有 UI 扩展的框架,似乎通过将 JS 代码与设计分开来
我需要收集一些关于现有 ORM 解决方案的信息。 请随意编写任何编程语言。 你能谈谈你用过的最好的 ORM 框架吗?为什么它比其他的更好? 最佳答案 我使用了 NHibernate 和 Entity
除了 Apple 的 SDK 之外,还有什么强大的 iPhone 框架可供开始开发?有没有可以加快开发时间的方法? 最佳答案 此类框架最大的是Three20 。 Facebook 和许多其他公司都使用
有人可以启发我使用 NodeJS 的 Web 框架吗?我最近开始从免费代码营学习express js,虽然一切进展顺利,但我对express到底是什么感到困惑。是全栈框架吗?纯粹是为了后端吗?我发现您
您可以推荐哪种 Ajax 框架/工具包来构建使用 struts 的 Web 应用程序的 GUI? 最佳答案 我会说你的 AJAX/javascript 库选择应该较少取决于你的后端是如何实现的,而更多
我有生成以下错误的 python 代码: objc[36554]: Class TKApplication is implemented in both /Library/Frameworks/Tk.
首先,很抱歉,如果我问的问题很明显,因为我没有编程背景,那我去吧: 我想运行一系列测试场景并在背景部分声明了几个变量(我打印它们以仔细检查它们是否已正确声明),第一个是整数,另外两个字符串为你可以看到
在我们承担的一个项目中,我们正在寻找一个视频捕获和录制库。我们的基础工作(基于 google 搜索)表明 vlc (libvlc)、ffmpeg (libavcodec) 和 gstreamer 是三
我试过没有运气的情况下寻找某种功能来杀死/中断Play中的正常工作!框架。 我想念什么吗?还是玩了!实际没有添加此功能? 最佳答案 Java stop类中没有像Thread方法那样的东西,由于种种原因
我们希望在我们的系统中保留所有重大事件的记录。例如,在数据库可能存储当前用户状态的地方,事件日志应记录对该状态的所有更改以及更改发生的时间。 事件记录工具应该尽可能接近于事件引发器的零开销,应该容纳结
那里有 ActionScript 2.0/3.0 的测试框架列表吗? 最佳答案 2010-05-18 更新 由于这篇文章有点旧,而且我刚刚收到了赞成票,因此可能值得提供一些更新的信息,这样人们就不会追
我有一个巨大的 numpy 数组列表(一维),它们是不同事件的时间序列。每个点都有一个标签,我想根据其标签对 numpy 数组进行窗口化。我的标签是 0、1 和 2。每个窗口都有一个固定的大小 M。
我是 Play 的新手!并编写了我的第一个应用程序。这个应用程序有一组它依赖的 URL,从 XML 响应中提取数据并返回有效的 URL。 此应用程序需要在不同的环境(Dev、Staging 和 Pro
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!