欢迎访问

白小姐

Core开源Web应用程序框架ABP

2019-09-21    

  ,使应用程序更容易理解,开发,测试,并且更容易抵抗架构侵蚀. 它使小型团队能够

  由于所有依赖项都已预先配置, 因此作为Docker容器运行更容易. 你只需要安装最新的docker.

  请注意:这些数据库在解决方案中具有EF Core迁移,但它们没有种子数据,尤其是IdentityServer4所需的配置. 因此,恢复数据库要容易得多.

  请注意:这些数据库在解决方案中具有EF Core迁移,但它们没有种子数据,尤其是IdentityServer4所需的配置. 因此,恢复数据库要容易得多.

  按以下顺序运行项目(右键单击每个项目设置为启动项目,按Ctrl+F5运行,无需调试):

  Visual Studio解决方案由多个项目组成,每个项目在系统中具有不同的角色:

  网关用于为应用程序提供单一入口点.它还可以用于速率限制,负载平衡等. 使用Ocelot类库.

  IdentityService.Host: 托管用于管理用户和角色的ABP Identity模块. 它没有其他服务,仅托管Identity模块的API.

  BloggingService.Host: 托管ABP博客模块,该模块用于管理博客和帖子(典型的博客应用程序). 它没有其他服务,仅托管Blogging模块的API.

  ProductService.Host: 托管用于管理产品的产品模块(位于解决方案内). 它还包含用于创建/更新产品管理数据库架构的EF Core迁移.

  产品: 使用模块开发最佳实践开发的分层模块. 它可以嵌入到单个应用程序中,也可以通过单独部署API和UI作为微服务托管(如本演示解决方案中所述).

  请注意,此DbContext仅用于数据库迁移. 所有模块都有自己的DbContext类,模块在运行时使用这些类.

  AuthServer有一个简单的主页,如果当前用户已登录,则显示当前用户信息:

  这些页面不包含在项目本身中. 相反,AuthServer项目使用带有IdentityServer扩展的预构建ABP帐户模块. 这意味着它还可以充当具有必要UI和逻辑的OpenId Connect服务器.

  BackendAdminApp.Host项目本身没有单个UI元素/页面. 它仅用于提供身份和产品管理模块的UI页面.

  appsettings.json文件包含RemoteServices部分,用于声明远程服务端点. 每个微服务通常都有不同的端点. 但是,此解决方案使用API网关模式为应用程序提供单个端点:

  ABP应用程序模块通常提供C#客户端库以轻松地使用服务(API)(它们通常使用ABP框架的Dynamic C# API客户端). 这意味着如果你需要使用Identity Service API, 你可以引用其客户端软件包,并通过提供的接口轻松使用API.

  一旦引用这些客户端软件包,就可以直接注入应用程序服务接口(例如IIdentityUserAppService)并使用其方法,如本地方法调用. 它实际上通过HTTP调用到相关服务端点的远程服务调用.

  公共网站可以在不登录的情况下显示博客文章和产品列表. 如果你登录,你还可以管理博客. 它重定向到AuthServer进行身份验证. 用户输入正确的用户名和密码后,页面将再次重定向到公共网站应用程序. 身份验证配置在PublicWebSiteHostModule类中设置:

  appsettings.json文件包含RemoteServices部分,用于声明远程服务端点. 每个微服务通常都有不同的端点. 但是,此解决方案使用API网关模式为应用程序提供单个端点:

  Scope 声明API(和网关)以授予访问权限. 此应用程序使用内部网关.

  网关用于为应用程序提供单一入口点. 通过这种方式,应用程序仅处理单个服务地址(API端点),而不是每个服务的不同地址. 网关还用于速率限制,安全性,身份验证,负载平衡和更多要求.

  后端前端(BFF)是一种常见的架构模式,可为每种不同的应用程序/客户端类型构建专注而专业的网关. 此解决方案使用此模式并具有多个网关.

  此解决方案使用Ocelot库来构建API网关. 它是心广泛接受的API网关库.

  这是后端管理应用程序的后端(服务器端API)(不要混淆命名;后端管理应用程序实际上是前端Web应用程序,但系统管理员而不是普通用户使用).

  Ocelot需要知道微服务的真实URL才能重定向HTTP请求. 此网关的配置如下所示:

  Ocelot是一个终结ASP.NET核心中间件,应该写成管道中的最后一项:

  这些端点应由网关服务提供,而不是由微服务提供. 微服务只能知道与该微服务相关的权限. 但是,一旦正确配置,网关就可以将多个服务的权限值聚合为一个更适合客户端的列表.

  为此, ASP.NET Core管道配置为通过MVC而不是Ocelot处理某些特定路由. 为了实现这一点,MapWhen扩展方法使用如下:

  此网关配置为使用swagger UI, 这是一种用于发现和测试HTTP API的流行工具. 通常,Ocelot不支持在swagger上显示API,因为它无法了解每个微服务API的详细信息. 但是当你遵循ABP分层模块架构最佳实践时,它是可能的.

  后端管理应用程序提供权限管理UI(之前见过),并使用此网关获取/设置权限. 权限管理API托管在网关内,而不是单独的服务. 这是一个设计决策,但如果您愿意,它可以作为另一个微服务托管.

  Ocelot需要知道微服务的真实URL才能重定向HTTP请求. 此网关的配置如下所示:

  请参阅后端管理应用程序网关部分中的ABP配置端点和Swagger主题,这些主题与此网关非常相似.

  Ocelot需要知道微服务的真实URL才能重定向HTTP请求. 此网关的配置如下所示:

  ReRoutes配置涵盖了系统中的所有微服务. 参见 ocelot文档 更好地了解配置.

  请参阅后端管理应用程序网关部分中的ABP配置端点和Swagger主题,这些主题与此网关非常相似.

  该服务实际上只托管ABP身份包/模块. 不包含任何API本身. 为了托管它,添加以下依赖项:

  Swagger UI已配置,是此服务的默认页面. 如果你导航到URL你将被重定向到swagger页面以查看和测试API.

  该服务实际上只托管ABP Blogging包/模块. 不包含任何API本身. 为了托管它,添加以下依赖项:

  为什么不在当前请求中使用当前用户的令牌? 因为,用户可能没有Identity模块所需的权限,因此它不能直接将当前身份验证令牌传递给Identity服务. 此外,某些博客服务API是匿名的(不需要经过身份验证的用户),因此在某些情况下,HTTP请求中没有当前用户. 出于这些原因,应将Blogging服务定义为具有自己的凭据和权限的Identity服务的客户端.

  Swagger UI已配置,是此服务的默认页面. 如果你导航到URL你将被重定向到swagger页面以查看和测试API.

  该服务实际上只托管产品管理模块. 不包含任何API本身. 为了托管它,添加以下依赖项:

  Swagger UI已配置,是此服务的默认页面. 如果你导航到URL你将被重定向到swagger页面以查看和测试API.

  ABP提供强大的基础架构,通过提供服务和架构,使模块化应用程序开发更容易(参见模块开发最佳实践指南).

  此解决方案演示了如何在分布式体系结构中使用预构建的应用程序模块. 该解决方案还包括一个简单的产品管理模块,用于显示分层模块示例的实现.

  通过此分层的帮助,可以在单个应用程序中使用相同的模块作为包引用,或者用作在另一个服务器中运行的服务. 可以分离UI(Web)和API层,因此它们可以在不同的服务器中运行.

  在此解决方案中,Web层在后端管理应用程序中运行,而API层由产品微服务托管.

  本教程将重点介绍该模块的一些重要方面. 但是,建议查看源代码以便更好地理解.

  它的所有属性都有私有的set方法,可以防止属性从类中直接更改. 产品类通过自己的构造函数和方法确保其自身的完整性和有效性.

  默认(无参数)构造函数是私有的,不在应用程序代码中使用. 这是必需的,因为大多数ORM在从数据库获取时需要在反序列化实体时使用无参数构造函数.

  第二个构造函数是internal,这意味着它只能在域层内使用. 这强制在创建新的Product时使用ProductManager. 因为``ProductManager`应该在新产品创建上实现业务规则. 此构造函数仅需要最少的必需参数来创建具有一些可选参数的新产品. 它会检查一些简单的业务规则,以确保将实体创建为有效产品.

  SetPrice方法用于以安全的方式更改产品的价格(通过检查验证规则).

  此方法还触发分布式事件,其中带有ProductStockCountChangedEto参数(Eto是传统的后缀代表EventTransferObject,但不是必需的)通知产品库存数量的听众已发生变化. 任何订户都可以接收此事件并根据该知识执行操作.

  RabbitMQ为此解决方案分发事件. 但是ABP通过提供必要的抽象来独立于消息代理Event Bus文档).

  PM:000001是发送给客户端的异常类型的代码,因此他们可以理解错误类型. 在这种情况下没有实现,但也可以本地化业务异常. 请参阅异常处理文档.

  请注意; 每个应用程序分离应用程序层可能是更好的原则, 而不是将两个应用程序服务放入同一个项目中. 但是我们在这个解决方案中简化了它们.

  异步消息传递是分布式系统中的关键概念. 它可以以松散耦合的方式与容错进行通信. 在发送消息时,它不要求双方都在线. 因此,它是微服务架构中广泛使用的通信模式.

  分布式事件(事件总线)是一种消息传递方式,其中服务引发/触发事件,而其他服务注册/侦听这些事件,以便在发生重要事件时得到通知. ABP通过提供约定,服务和集成使分布式事件更易于使用.

  该解决方案使用Serilog作为日志库. 它是一个广泛使用的库,有许多数据源集成,包括Elasticsearch.

  如果你使用Kibana, 它是一个与Elasticsearch完美集成的可视化工具,可以看到有关你的日志的一些UI:

  ABP提供自动审计日志记录,详细保存每个请求(当前用户,浏览器/客户端,执行了哪些操作,哪些实体更改,甚至实体的哪些属性已更新). 有关详细信息,请参阅审计日志文档.

  所有服务和应用程序都配置为编写审核日志. 审核日志将保存到MsDemo_Identity SQL数据库中. 因此,您可以从单个点查询所有应用程序的所有审核日志.

  审核日志记录具有CorrelationId属性,可用于跟踪请求. 当服务在单个Web请求中调用另一个服务时,它们都会使用相同的CorrelationId保存审核日志. 请参阅数据库中的AbpAuditLogs表.


香港挂牌彩图| 香港挂牌之全篇| 六合宝典| 曾道人一肖中平特| www.233166.com| 王中王铁算盘开奖结果开奖结果| 旺旺高手论坛| 香港最准一肖中特| 开奖结果今期开奖结| www.345123456.com| www.979234.com| 香港挂牌正版彩图|