工具:備份還原工具+系統鏡像(GHO、ISO都可以)
備份還原工具下載地址:http://pan.baidu.com/s/1c2l7CuW
★裝機之前最重要一步:查看電腦系統版本
1.計算機-右鍵單擊-屬性
2、然后查看右側的系統信息
這里我就以我的電腦系統為例,我的系統是win7 32位的,那我就去下載win7 32位的系統鏡像。
下載電腦系統可以直接百度搜索,這里我就直接附上兩個比較好的網址吧!
系統之家:http://www.xitongzhijia.net/
系統城:http://www.xitongcheng.com/
第二步:下載對應的系統版本,一定要注意系統是多少位的,不要下錯了。下載的系統鏡像最好放在電腦D盤、E盤、或者F盤。(只要不是C盤就可以)。
第三步:將重要文件拷貝到電腦D盤、E盤、或者F盤。(只要不是C盤就可以)。
第四步:打開備份還原工具,點開小倒三角,選擇下載好的鏡像,然后點確定。
彈出窗口,點“是”。
第五步:安裝完成后,到驅動精靈官網去下載合適的驅動更新電腦驅動(一般這些驅動網站都帶有驅動檢測功能,檢測出來更新就可以了)。
驅動精靈下載地址:http://www.drivergenius.com/zhuangji.asp 如果地址失效,就去百度搜“驅動精靈”。
注意:安裝系統過程中,電腦最好連接電源,不要斷電。
如果你是小白,最好不要對電腦進行分區操作,以免造成電腦死機。
更多好用的手機電腦技巧,請關注微信公眾號電腦小咖 ID:youxuetangtang
QQ交流群:531917317 有任何問題,可以在群里交流
ASP.NET Core 微服務是一種架構,其中應用程序被創建為多個小的獨立的可服務組件。本文將詳細介紹如何使用 ASP.NET Core、Serilog、Swagger UI、健康檢查和 Docker 容器創建微服務。
微服務架構風格如上圖所示。微服務架構是一種將一個大型應用程序開發為一組小型獨立服務的風格。在這里,每個服務都實現了特定的功能并擁有自己的數據存儲。每個服務功能都應該小到足以實現一個用例,而大到足以提供一些價值。每個服務都應該單獨部署,以便可以獨立擴展。這些服務應盡可能相互獨立,如果需要進行服務間通信,則可以使用一些輕量級的通信協議。
身份提供者用于向應用程序提供用戶身份驗證服務。
要了解有關身份提供程序的詳細信息以及如何保護基于 ASP.NET Core 的應用程序的安全,您可以查看我關于*ASP.NET Core 安全性的*系列
API 網關是所有請求的單一入口點,有助于管理端點并協調不同的服務。
容器是一個標準的軟件單元,它捆綁了應用程序或功能及其所有依賴項,以便可以在任何具有容器主機的新系統上快速可靠地部署應用程序。
容器編排是一種用于管理大型應用程序中容器生命周期的軟件,這有助于根據負載擴展應用程序。
微服務是其在容器與它相依一起捆綁的實際獨立的小服務
Data Store用于存儲微服務數據,基本原理是每個服務管理自己的數據。
整體式 | 微服務 |
單個服務/應用程序應包含所有業務功能 | 單個服務應該只包含一個業務功能 |
所有服務都是緊耦合的 | 所有服務都是松耦合的 |
應用程序是用一種單一的編程語言開發的 | 每個服務可以使用不同的編程語言 |
所有服務的單一數據庫。 | 每個服務都有獨立的數據庫 |
所有服務都需要一起部署在VM上 | 每個服務都可以部署在單獨的虛擬機上 |
所有服務都在同一進程中運行,因此如果一項服務出現故障,則整個應用程序都會中斷 | 每個服務在不同的進程中運行,因此一個服務的失敗不會影響其他服務 |
難以擴展特定服務,因為新實例必須擁有所有服務 | 可以輕松擴展,因為任何單個服務都可以獨立部署 |
單個大型團隊處理整個應用程序 | 每個服務的獨立小團隊工作更集中。 |
易于開發和測試小型應用程序 | 由于它是一個分布式系統,因此增加了應用程序的復雜性 |
.NET Core 提供以下優勢,適用于使用 ASP.NET Core 的微服務
這是關于使用 ASP.NET Core 實現微服務的簡短視頻(.NET Core 微服務示例),在這里,我們將詳細介紹使用 ASP.NET Core 創建微服務的分步過程。我們將創建一個訂單服務,該服務將提供端點以在應用程序中添加、取消、按 ID 獲取訂單和按客戶 ID 獲取訂單。本演示已在 Visual Studio 2019 版本 16.6.2 中執行
對于帶有 ASP.NET Core 演示的微服務,我們將創建一個 ASP.NET Core 3.1 Web API 項目來演示 .net Core Web API 微服務。
為了使用 ASP.NET Core 演示微服務,我們將創建訂單微服務,該服務將包含僅與訂單相關的功能。這是微服務的基本要求,它應該只實現一個功能,因此我們的微服務將只包含與訂單相關的功能。我們將實現以下接口功能
下面我們將快速為訂單添加實體模型并為訂單微服務啟用實體框架核心。
如果您需要有關實體框架如何工作的更多詳細信息,請查看我關于*ASP.NET Core 3.1 中的 Entity Framework Core 的*另一篇文章
添加訂單實體類
復制代碼
public class Order
{
public string Id { get; set; }
public string ProductId { get; set; }
public double Cost { get; set; }
public DateTime Placed { get; set; }
public string CustomerId { get; set; }
public string Status { get; set; }
}
我們將利用 Entity Framework Core 來實現訂單服務的數據庫操作。
復制代碼
Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
這是與給定模型類的實體框架功能協調的主要類。
復制代碼
public interface IApplicationDbContext
{
DbSet<Order> Orders { get; set; }
Task<int> SaveChanges();
}
public class ApplicationDbContext : DbContext, IApplicationDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Order> Orders { get; set; }
public new async Task<int> SaveChanges()
{
return await base.SaveChangesAsync();
}
}
存儲庫是一個組件,它封裝了與數據存儲和對它們執行的操作相關的對象。DbContext 使用依賴注入作為構造函數中的參數傳遞。
復制代碼
public interface IOrderRepository
{
Task<string> Add(Order order);
Task<Order> GetById(string id);
Task<string> Cancel(string id);
Task<Order> GetByCustomerId(string custid);
}
public class OrderRepository : IOrderRepository
{
private IApplicationDbContext _dbcontext;
public OrderRepository(IApplicationDbContext dbcontext)
{
_dbcontext=dbcontext;
}
public async Task<string> Add(Order order)
{
_dbcontext.Orders.Add(order);
await _dbcontext.SaveChanges();
return order.Id;
}
public async Task<string> Cancel(string id)
{
var orderupt=await _dbcontext.Orders.Where(orderdet=> orderdet.Id==id).FirstOrDefaultAsync();
if (orderupt==null) return "Order does not exists";
orderupt.Status="Cancelled";
await _dbcontext.SaveChanges();
return "Order Cancelled Successfully";
}
public async Task<Order> GetByCustomerId(string custid)
{
var order=await _dbcontext.Orders.Where(orderdet=> orderdet.CustomerId==custid).FirstOrDefaultAsync();
return order;
}
public async Task<Order> GetById(string id)
{
var order=await _dbcontext.Orders.Where(orderdet=> orderdet.Id==id).FirstOrDefaultAsync();
return order;
}
}
在 appsettings.json 文件中指定 SQL Server 連接字符串。
復制代碼
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=OrderDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
您需要在啟動類中的 ConfigureServices 方法中將數據庫上下文和訂單存儲庫配置為服務
復制代碼
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options=>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection"),
ef=> ef.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)));
services.AddScoped<IApplicationDbContext>(provider=> provider.GetService<ApplicationDbContext>());
services.AddTransient<IOrderRepository, OrderRepository>(); services.AddControllers();
//Remaining code has been removed
}
要自動化遷移并創建數據庫,我們需要在包管理器控制臺中運行以下命令。
復制代碼
add-migration InitialMigration
update-database
這里要注意的一件事是,該表僅為訂單詳細信息創建。產品和客戶表不是使用外鍵引用創建的,因為您必須保持微服務小且專注于一個單一的功能。產品和客戶將在他們自己的單獨的數據庫中,并擁有自己的微服務實現。如果您需要將產品詳細信息或客戶詳細信息顯示為訂單詳細信息的一部分,那么您需要調用相應的微服務并獲取所需的詳細信息。
這是訂單控制器的代碼,已添加以公開訂單微服務的端點。訂單存儲庫已使用依賴注入作為構造函數參數傳遞
復制代碼
[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
private IOrderRepository _orderRepository;
public OrderController(IOrderRepository orderRepository)
{
_orderRepository=orderRepository;
}
[HttpPost]
[Route("Add")]
public async Task<ActionResult> Add([FromBody] Order orderdet)
{
string orderid=await _orderRepository.Add(orderdet);
return Ok(orderid);
}
[HttpGet]
[Route("GetByCustomerId/{id}")]
public async Task<ActionResult> GetByCustomerId(string id)
{
var orders=await _orderRepository.GetByCustomerId(id);
return Ok(orders);
}
[HttpGet]
[Route("GetById/{id}")]
public async Task<ActionResult> GetById(string id)
{
var orderdet=await _orderRepository.GetById(id);
return Ok(orderdet);
}
[HttpDelete]
[Route("Cancel/{id}")]
public async Task<IActionResult> Cancel(string id)
{
string resp=await _orderRepository.Cancel(id);
return Ok(resp);
}
}
我們的訂單服務已準備好執行操作。但要使其成為微服務,我們必須啟用日志記錄、異常處理、文檔、監控、容器化等功能。讓我們看看如何使用 ASP.NET Core 為微服務實現這些功能
微服務應該以這樣一種方式構建,即在不破壞現有客戶端的情況下易于更改,并且還應該能夠并行支持多個版本,因此 Web API 版本控制將幫助我們實現這一點。
帶有 ASP.NET Core 的微服務支持 Web API 版本控制,使用該功能我們可以實現同一 API 的多個版本,以便不同的客戶端可以使用所需版本的 API。
在使用 URL 的 Web API 版本控制中,版本號是 URL 的一部分,即 http://server:port/api/v1/order/add
復制代碼
Install-Package Microsoft.AspNetCore.Mvc.Versioning
在 startup.cs 文件的 ConfigureServices 方法中啟用對 Web API 版本控制的支持。
復制代碼
public void ConfigureServices(IServiceCollection services){ services.AddApiVersioning(apiVerConfig=> { apiVerConfig.AssumeDefaultVersionWhenUnspecified=true; apiVerConfig.DefaultApiVersion=new ApiVersion(new DateTime(2020, 6, 6)); }); //Remaining code has been removed }
您需要在路由屬性中添加參數 v{version:apiVersion} 如 R oute(“api/v{version:apiVersion}/[controller]”)以便 API 版本成為 URL 的一部分。
復制代碼
[ApiVersion("1.0")][Route("api/v{version:apiVersion}/[controller]")][ApiController]public class OrderController : ControllerBase{//Remaining code has been removed}
如果您需要有關 ASP.NET Core 中 Web API 版本控制的更多詳細信息,請查看我關于*ASP.NET Core 3.1 中的 Web API 版本控制的*另一篇文章
部署到生產環境后,跟蹤和分析問題應該很容易。日志幫助我們分析有時可能難以模擬的復雜問題。總是需要對需要日志進行分析的應用程序問題進行故障排除。對于帶有 ASP.NET Core 的微服務,我們將使用 Serilog 來記錄應用程序的詳細信息。
有許多第三方組件,其中之一是*Serilog*。Serilog 是一種流行的第三方日志記錄提供程序,在 ASP.NET Core 日志記錄中受支持。
關于在 ASP.NET Core 中實現 Serilog 的詳細解釋,可以參考我的另一篇文章*ASP.NET Core Logging with Serilog*
復制代碼
Install-Package Serilog.AspNetCoreInstall-Package Serilog.Extensions.LoggingInstall-Package Serilog.Extensions.HostingInstall-Package Serilog.Sinks.RollingFileInstall-Package Serilog.Sinks.Async
Serilog RollingFile Sink 是通過在 appsettings.json 文件中添加配置來實現的。可以通過在名為 MinimumLevel 的屬性中設置日志級別值來指定日志級別。
復制代碼
"Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "Async", "Args": { "configure": [ { "Name": "RollingFile", "Args": { "pathFormat": "Serilogs\\AppLogs-{Date}.log", "outputTemplate": "{Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}", "fileSizeLimitBytes": 10485760 } } ] } } ] }
將 UseSerilog() 添加到 Program.cs 中的 CreateDefaultBuilder
復制代碼
public static IHostBuilder CreateHostBuilder(string[] args)=> Host.CreateDefaultBuilder(args) .UseSerilog() .ConfigureWebHostDefaults(webBuilder=> { webBuilder.UseStartup<Startup>(); });
從 Startup.cs 中的 appsettings.json 文件加載 Serilog 配置
復制代碼
public Startup(IConfiguration configuration){ Configuration=configuration; Log.Logger=new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger();}
Serilog.Log 類已用于添加帶有 Debug 方法的日志,以便在出現某些異常時進行調試和錯誤。
復制代碼
[HttpPost][Route("Add")]public async Task<ActionResult> Add([FromBody] Order orderdet){ try { Log.Debug("Order Addition Started"); Log.Debug("Order Addition Input", orderdet); string orderid=await _orderRepository.Add(orderdet); Log.Debug("Order Addition Output", orderid); return Ok(orderid); } catch (Exception ex) { Log.Error("Order Addition Failed", ex); throw new Exception("Order Addition Failed", innerException: ex); }}//Remaining code has been removed
出于演示目的,我僅在控制器操作“添加”中添加了日志記錄功能,但作為一種良好的做法,您需要在具有適當日志級別的完整應用程序中添加日志,這有助于調試生產中的復雜問題。由于這是微服務,異步日志寫入已配置為通過將工作委托給后臺線程來減少日志記錄調用的開銷。
另外,這里要注意的另一件事是,如果您在 docker 容器中運行 ASP.NET 核心應用程序,那么您需要小心日志文件的位置,就好像您將日志文件存儲在同一個容器中一樣,則有可能丟失那個數據。在容器化環境中,日志應該存儲在某個持久卷上。
檢查我們的服務是否已啟動并運行或正常運行總是很好的。在我們的客戶通知我們我們損壞的服務之前,我們應該能夠主動識別我們損壞的服務并采取糾正措施。Healthchecks 允許我們檢查服務是否健康,即啟動和運行。Healthcheck 端點也可用于從負載均衡器檢查其狀態,如果我們的服務返回該服務器上的運行狀況檢查失敗,則禁用負載均衡器上的服務器。對于帶有 ASP.NET Core 的微服務,我們將使用 ASP.NET Core HealthChecks 進行監控。
Healthchecks 是 ASP.NET Core 中的內置中間件,用于報告應用程序的運行狀況。健康檢查可以作為應用程序中的另一個端點公開。
使用包管理器控制臺安裝健康檢查所需的包
復制代碼
Install-Package Microsoft.Extensions.Diagnostics.HealthChecksInstall-Package Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore
在這里,我們配置了基本應用程序健康檢查和實體框架數據庫上下文健康檢查,以確認應用程序可以與為實體框架核心 DbContext 配置的數據庫進行通信
復制代碼
public class Startup{ public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() .AddDbContextCheck<ApplicationDbContext>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseHealthChecks("/checkhealth"); } //Remaining code has been removed}
您可以使用 URL http://serverip:port/checkhealth 檢查服務健康狀況
維護微服務的更新文檔總是好的。其他團隊應該能夠參考這些 API 規范并相應地使用微服務。我們將實施 Swashbuckle.AspNetCore 來為訂單微服務生成 Swagger 文檔。
Swashbuckle 是一個開源庫,用于為 ASP.NET Core Web API 生成 swagger 文檔。本文檔可用于探索和測試 API。
使用包管理器控制臺安裝 swashbuckle 所需的包
復制代碼
Install-Package Swashbuckle.AspNetCoreInstall-Package Microsoft.OpenApi
復制代碼
public class Startup{ public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen(options=> { options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title="Microservice - Order Web API", Version="v1", Description="Sample microservice for order", }); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseSwagger(); app.UseSwaggerUI(options=> options.SwaggerEndpoint("/swagger/v1/swagger.json", "PlaceInfo Services")); } //Remaining code has been removed}
以下是使用 swagger 為訂單微服務生成的文檔
容器化用于捆綁應用程序或應用程序的功能、所有依賴項及其在容器映像中的配置。此映像部署在主機操作系統上,捆綁的應用程序作為一個單元工作。容器鏡像的概念允許我們在幾乎不做任何修改的情況下跨環境部署這些鏡像。通過這種方式,可以輕松快速地擴展微服務,因為新容器可以輕松部署用于短期目的。
Docker 將用于向我們的微服務添加容器化。Docker 是一個開源項目,用于創建可以在云端或本地的 docker 主機上運行的容器。
這是一個快速的 .NET 核心微服務 docker 教程。要在解決方案資源管理器中的項目上啟用 ASP.NET Core 項目中的 Docker 支持,然后從菜單中選擇 Add=>Docker Support
這將啟用 docker 并為項目創建一個 Dockerfile,如下所示
復制代碼
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-sac2016 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-sac2016 AS build
WORKDIR /src
COPY ["ProCodeGuide.Sample.Microservice/ProCodeGuide.Sample.Microservice.csproj", "ProCodeGuide.Sample.Microservice/"]
RUN dotnet restore "ProCodeGuide.Sample.Microservice/ProCodeGuide.Sample.Microservice.csproj"
COPY . .
WORKDIR "/src/ProCodeGuide.Sample.Microservice"
RUN dotnet build "ProCodeGuide.Sample.Microservice.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ProCodeGuide.Sample.Microservice.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ProCodeGuide.Sample.Microservice.dll"]
這使得應用程序在 Docker 主機上的容器中運行。為此,可以在 Windows 機器上安裝*docker 桌面*。
微服務架構是關于更好地處理大型復雜系統,但要實現這一點,它會暴露自己的一系列復雜性和實現挑戰。盡管存在缺點或問題,但采用微服務的好處是許多公司實施微服務的驅動因素。
我們介紹了什么是微服務架構以及如何開始使用 ASP.NET Core 3.1 的微服務。我還沒有介紹微服務的一項更重要的功能,即自動化測試。自動化單元測試本身就是一個非常龐大的話題,我會單獨寫一篇文章來討論它。
快速回顧具有微服務特性的 .Net Core