本文共 6506 字,大约阅读时间需要 21 分钟。
目录
这是一个.NET Core示例应用程序,以及如何构建和实现基于微服务的后端系统的示例,该系统用于简单的自动银行功能,如使用C#.NET的ASP.NET Core Web API中的Balance,Deposit,Withdraw,Entity Framework和SQL Server。
示例应用程序基于微服务架构构建。使用微服务架构构建应用程序有几个优点,例如可以独立开发,部署和扩展服务。下图显示了后端架构的高级设计。
此图显示了事务微服务(Transaction Microservice)的内部设计。与事务服务相关的业务逻辑和数据逻辑在单独的事务处理框架中编写。框架通过Web API接收输入,并根据一些简单的规则处理这些请求。事务数据存储在SQL数据库中。
实现基于JWT令牌的身份验证以保护WebApi服务。Identity Microservice充当Auth服务器,并在验证用户凭据后发出有效令牌。API网关将令牌发送到客户端。客户端应用程序将令牌用于后续请求。
该应用程序在API网关中配置了四个API终端,以演示启用了基于令牌的安全选项的功能。这些路由暴露给客户端应用程序以使用后端服务。
编写中间件来处理异常,它在启动时注册为http请求的一部分。每个http请求都会通过此异常处理中间件,然后执行Web API控制器操作方法。
public async Task InvokeAsync(HttpContext context, RequestDelegate next){ try { await next(context); } catch (Exception ex) { var message = CreateMessage(context, ex); _logger.LogError(message, ex); await HandleExceptionAsync(context, ex); }}
当多个事务试图同时更新数据库中的相同数据时,数据库并发性与冲突有关。在下图中,如果您看到交易1和交易2针对同一帐户,则会尝试将金额存入帐户,而另一个系统会尝试同时从该帐户提取金额。该框架包含两个逻辑层,一个处理业务逻辑,另一个处理数据逻辑。
当从数据库中读取数据并且将业务逻辑应用于数据时,在此上下文中,与同一记录相关的值将存在三种不同的状态。
当系统尝试保存更改时,每个事务中的值的状态都会产生冲突,并使用并发令牌标识更新到数据库的值不是从数据库读取的原始值并抛出DbUpdateConcurrencyException。
处理并发冲突的一般方法是:
while (!isSaved){ try { await _dbContext.SaveChangesAsync(); isSaved = true; } catch (DbUpdateConcurrencyException ex) { foreach (var entry in ex.Entries) { if (entry.Entity is AccountSummaryEntity) { var databaseValues = entry.GetDatabaseValues(); if (databaseValues != null) { entry.OriginalValues.SetValues(databaseValues); CalculateNewBalance(); void CalculateNewBalance() { var balance = (decimal)entry.OriginalValues["Balance"]; var amount = accountTransactionEntity.Amount; if (accountTransactionEntity.TransactionType == TransactionType.Deposit.ToString()) { accountSummaryEntity.Balance = balance += amount; } else if (accountTransactionEntity.TransactionType == TransactionType.Withdrawal.ToString()) { if(amount > balance) throw new InsufficientBalanceException(); accountSummaryEntity.Balance = balance -= amount; } } } else { throw new NotSupportedException(); } } } }}
Azure AppInsights集成到“ Transaction Microservice ”中以收集应用程序Telemetry。
public void ConfigureServices(IServiceCollection services){ services.AddApplicationInsightsTelemetry(Configuration); }
用于ASP.NET核心的AppInsights SDK提供了一个在ILoggerFactory上的扩展方法AddApplicationInsights以配置日志记录。与存款和提款相关的所有事务都会通过ILogger记录到AppInsights日志中。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory log){ log.AddApplicationInsights(app.ApplicationServices, LogLevel.Information); }
要使用AppInsights,您需要拥有Azure帐户并在Azure门户中为您的应用程序创建AppInsights实例,这将为您提供检测密钥,其在appsettings.json中进行配置。
"ApplicationInsights": { "InstrumentationKey": "" },
Swashbuckle NuGet包被添加到“ Transaction Microservice”和在startup.cs中为API文档配置的swagger中间件中。运行WebApi服务时,可以通过swagger端点“/swagger” 访问swagger UI 。
public void ConfigureServices(IServiceCollection services){ services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "Simple Transaction Processing", Version = "v1" }); });}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory log){ app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Simple Transaction Processing v1"); }); }
从下载postman集合以通过网关运行API终端。
帐号 | 货币 | 用户名 | 密码 |
3628101 | EUR | speter | test@123 |
3637897 | EUR | gwoodhouse | pass@123 |
3648755 | EUR | jsmith | admin@123 |
原文地址:
转载地址:http://fdzhj.baihongyu.com/