ABP vNext微服务架构详细教程——身份管理服务
1.创建服务
ABP vNext创建包含app和module两种模板,其中app方式所创建的模板包含用户、角色、权限管理,ABP基础配置IdentityServer的基础配置数据等功能。module模式是一个比较干净的服务,里面不包含默认业务功能。
这里我们构建身份管理服务,需要用到ABP vNext框架自带的用户角色管理模块,所以采用app模式构建项目源码。项目名称为Demo.IdentityManager,构建命令如下:
abp new Demo.Identity -t app --ui none --separate-identity-server -dbms MySQL
这里 -t app 表示application模式 ,--ui none 表示不使用UI界面, --separate-identity-server 表示将身份认证服务IdentityServer和当前项目服务分开, -dbms MySQL 表示使用MySQL数据库
执行命令后,执行目录中会出现aspnet-core文件夹,将该文件夹中所有内容拷贝至项目解决方案的service/identitymanager目录下,将其中的IdentityServer项目移动至identityserver文件夹下,若直接添加IdentityServer项目到解决方案会报错找不到common.props,这是因为相对路径发生变化,可将identitymanager目录下的common.props文件复制一份到总解决方案sln所在目录
目录调整完成后,使用sln构建工具添加所有项目到总解决方案。添加后项目结构如下图:
因为IdentityServer项目相对路径发生变化,需删除并重新添加该项目对EntityFrameworkCore项目的引用。
如果不想使用ABP自带的单元测试可以将解决方案文件夹test及其下项目删除
2.初始化数据库
在ABP vNext框架application模式代码创建的数据库中,会包含用户、角色、权限、配置等功能的表,以及IdentityServer框架各项数据库持久化数据的表。
application模式下所创建的项目中的DbMigrator项目包含创建、执行数据迁移并初始化数据的功能。
正常情况下我们修改DbMigrator项目的配置文件appsettings.json中的ConnectionStrings:Default字段改为我们所使用的数据库并执行该项目,即可创建所需要的数据库
但我当前所用版本6.0.1有一个小Bug,运行DbMigrator项目会卡在创建数据迁移这一步,需要我们修改数据库链接字符串后手动创建数据迁移并执行,使用dotnet-ef命令执行如下:
- 在EntityFramework项目目录下进入cmd命令行
- 确保dotnet-ef命令已安装并更新至最新版本,具体可参考:https://docs.microsoft.com/zh-cn/ef/core/get-started/overview/install
- 添加数据迁移
dotnet-ef migrations add InitDb
- 执行数据迁移
dotnet-ef database update -s ..\Demo.Identity.DbMigrator
执行完成后,数据库已创建成功,运行DbMigrator项目可完成数据初始化。
3.调整及测试
身份管理服务运行项目为Identity.HttpApi.Host,将此项目设置为启动项。
修改Identity.HttpApi.Host项目中的配置文件appsettings.json,修改数据库链接字符串:ConnectionStrings:Default,及Redis地址:Redis:Configuration,按照服务规划我们给该服务设置的规划的端口号为5000,所以在appsettings.json中添加配置项: "urls": "http://*:5000"
默认情况下,ABP vNext框架自带的用户角色权限等接口需要授权用户才可以访问,依据我们之前的设计,微服务中的各项服务不需要二次权限验证,这里我们全局忽略权限验证,否则调用时会报401错误。忽略方法为在IdentityHttpApiHostModule的ConfigureServices方法中添加以下内容:
context.Services.AddAlwaysAllowAuthorization();
以控制台方式启动项目Identity.HttpApi.Host项目,启动完成后通过浏览器访问http://localhost:5000/swagger/index.html,成功显示Swagger页面,测试/api/identity/users的Get方式接口,返回admin用户信息,说明服务配置成功。