使用 ASP.NET Core 的微服务
微服务
微服务一词描绘了一种软件开发风格,这种风格已经从当代趋势发展为旨在提高大规模开发和管理软件解决方案的速度和效率的实践。微服务更多是关于应用一定数量的原则和架构模式作为架构。每个微服务独立存在,但另一方面,也都相互依赖。一个项目中的所有微服务都按照自己的节奏部署在生产环境中,在云端、独立、并存。
在本文中,我们将学习微服务的概念、架构以及如何在 .NET 和 C# 中创建微服务。您还将学习使用 docker 容器在 .NET 中构建、部署和测试微服务的步骤。
微服务架构
Microsoft Docs 中的下图显示了微服务体系结构样式。
除了微服务本身之外,微服务架构中还有各种组件。
Management。维护服务的节点。
Identity Provider(身份提供者)。在分布式网络中管理身份信息并提供身份验证服务。
Service Discovery(服务发现)。跟踪服务和服务地址和端点。
API Gateway(API 网关)。作为客户端的入口点。来自客户端的单点联系,反过来返回来自底层微服务的响应,有时是来自多个底层微服务的聚合响应。
CDN。为分布式网络中的页面和 Web 内容等静态资源提供服务的内容交付网络
Static Content(静态内容)页面和网页内容等静态资源
微服务独立部署,每个服务都有自己的数据库,因此底层微服务如下图所示。
单体与微服务架构
单体应用程序更像是一个完整的包,将所有相关的所需组件和服务封装在一个包中。
以下是完全封装或基于服务的单体架构的图解表示。
微服务是一种创建小型服务的方法,每个服务都在自己的空间中运行,并且可以通过消息传递进行通信。这些是直接调用自己的数据库的独立服务。
以下是微服务架构的图解表示。
在单体架构中,即使遵循面向服务架构的方法,所有功能的数据库都保持不变,而在微服务中,每个服务都将拥有自己的数据库。
Docker 容器和 Docker 安装
像 Docker 等容器对操作系统资源进行切片,例如网络堆栈、进程命名空间、文件系统层次结构和存储堆栈。Docker 更像是虚拟化操作系统。在此处了解有关码头工人的更多信息。打开此URL 并单击从 Docker 中心下载。下载后,登录 Docker 并按照说明安装 Docker for Windows。
使用 ASP.NET Core 的微服务
本节将通过图片逐步演示如何使用 ASP.NET Core 创建产品微服务。该服务将使用 ASP.NET Core 2.1 和 Visual Studio 2017 构建。Asp.NET Core 与 VS 2017 集成。该服务将拥有自己的 DBcontext 和数据库以及独立的存储库,以便可以独立部署该服务。
创建 ASP.NET Core 应用程序解决方案
- 打开 Visual Studio 并添加一个新项目。
选择应用程序作为 ASP.NET Core Web 应用程序并给它一个有意义的名称。
接下来,选择 API 作为项目的类型,并确保选择“启用 Docker 支持”选项,操作系统类型为 Linux。
解决方案如下所示。
添加模型
- 将一个名为“Model”的新文件夹添加到项目中。
- 在 Models 文件夹中,添加一个名为 Product 的类。
- 向产品类添加一些属性,例如 Id、Name、Description、Price。产品也应该是某种类型的,为此,定义了一个类别模型,并将一个 CategoryId 属性添加到产品模型中。
- 同样,添加类别模型。
启用 EF Core
尽管 .NET Core API 项目具有对 EF Core 的内置支持,并且所有相关依赖项都在项目创建和编译时下载,可以在项目的 SDK 部分下找到,如下所示。
Microsoft.EntityFrameworkCore.SqlServer (2.1.1) 应该是下载的 SDK 中的包。如果它不存在,它可以通过 Nuget 包显式添加到项目中。
添加 EF Core DbContext
需要一个数据库上下文,以便模型可以与数据库交互。
- 将名为 DBContexts 的新文件夹添加到项目中。
- 添加一个名为 ProductContext 的新类,其中包括 Products 和 Categories 的 DbSet 属性。OnModelCreating 是一种可以将主数据播种到数据库的方法。因此,添加 OnModelCreating 方法并在创建数据库时将最初将添加到数据库中的一些示例类别添加到类别表中。
ProductContext 代码
using Microsoft.EntityFrameworkCore;
using ProductMicroservice.Models;
namespace ProductMicroservice.DBContexts
{
public class ProductContext : DbContext
{
public ProductContext(DbContextOptions<ProductContext> options) : base(options)
{
}
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Category>().HasData(
new Category
{
Id = 1,
Name = "Electronics",
Description = "Electronic Items",
},
new Category
{
Id = 2,
Name = "Clothes",
Description = "Dresses",
},
new Category
{
Id = 3,
Name = "Grocery",
Description = "Grocery Items",
}
);
}
}
}
在 appsettings.json 文件中添加连接字符串。
打开 Startup.cs 文件以添加 EF Core 的 SQL 服务器数据库提供程序。添加代码 services.AddDbContext<ProductContext>(o => o.UseSqlServer(Configuration.GetConnectionString(“ProductDB”))); 在 ConfigureServices 方法下。请注意,在 GetConnectionString 方法中,传递了添加到 appsettings 文件中的连接字符串的键名。
添加Repository
存储库作为微服务的一个微组件,它封装了数据访问层,并有助于数据的持久性和可测试性。
- 在项目中添加一个名为 Repository 的新文件夹,并在该文件夹中添加一个接口名称 IProductRepository。在对 Product 微服务执行 CRUD 操作的接口中添加方法。
- 在实现 IProductRepository 的同一 Repository 文件夹中添加一个名为 ProductRepository 的新具体类。所有这些方法都需要:
- 通过访问上下文方法添加方法的实现。ProductRepository.cs
using Microsoft.EntityFrameworkCore;
using ProductMicroservice.DBContexts;
using ProductMicroservice.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ProductMicroservice.Repository
{
public class ProductRepository: IProductRepository
{
private readonly ProductContext _dbContext;
public ProductRepository(ProductContext dbContext)
{
_dbContext = dbContext;
}
public void DeleteProduct(int productId)
{
var product = _dbContext.Products.Find(productId);
_dbContext.Products.Remove(product);
Save();
}
public Product GetProductByID(int productId)
{
return _dbContext.Products.Find(productId);
}
public IEnumerable<Product> GetProducts()
{
return _dbContext.Products.ToList();
}
public void InsertProduct(Product product)
{
_dbContext.Add(product);
Save(); }
public void Save()
{
_dbContext.SaveChanges();
}
public void UpdateProduct(Product product)
{
_dbContext.Entry(product).State = EntityState.Modified;
Save();
}
}
}
- 打开项目中的Startup类,将代码添加为services.AddTransient<IProductRepository, ProductRepository>(); 在 ConfigureServices 方法中,以便在需要时在运行时解析存储库的依赖关系。
添加控制器
微服务应该有一个端点,需要控制器将 HTTP 方法作为服务方法的端点公开给客户端。
- 右键单击 Controllers 文件夹并添加一个新的 Controller,如下所示。
- 选择选项“API Controller with read/write actions”来添加控制器。
- 将控制器的名称命名为 ProductController。
- 将在 Controllers 文件夹中添加一个 ProductController 类,其中包含默认的读/写操作,稍后将替换为产品读/写操作,并创建 HTTP 方法作为服务的端点。
- ValuesController 可以删除,因为它不需要。
通过调用存储库方法将实现添加到方法,如下所示。为了理解这个概念,这里显示了基本的实现。这些方法可以是属性路由的,并且可以根据需要用更多的注释来装饰。
ProductRepository.cs
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!