《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
第 7 章 開發 ASP.NET Core Web 應用
ASP.NET Core 基礎
在本章,我們將從一個命令行應用開始,并且在不借助任何模板,腳手架和向導的情況下,最終得到一個功能完整的 Web 應用
GitHub鏈接:https://github.com/microservices-aspnetcore/hello-world
運行 dotnet new console 命令之后,我們首先得到一個 Program.cs 文件,修改該文件并添加配置支持
using System; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.HelloWorld {public class Program{public static void Main(string[] args){var config = new ConfigurationBuilder().AddCommandLine(args).Build();var host = new WebHostBuilder().UseKestrel().UseStartup<Startup>().UseConfiguration(config).Build();host.Run();}} }之后添加一個 Startup 類,用于配置默認的中間件,它對所有 HTTP 請求都返回 "Hello World" 響應
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Http;namespace StatlerWaldorfCorp.HelloWorld {public class Startup{public Startup(IHostingEnvironment env){}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){app.Run(async (context) =>{await context.Response.WriteAsync("Hello, world!\n");});}} }添加 NuGet 包作為項目的依賴,并直接在項目文件開頭處聲明要使用的 Web SDK
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp1.1</TargetFramework></PropertyGroup><ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.1" /><PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1"/><PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="1.1.1"/></ItemGroup></Project>添加 ASP.NET MVC 中間件
GitHub鏈接:https://github.com/microservices-aspnetcore/webapp
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.WebApp {public class Startup{public Startup(IHostingEnvironment env){}public IConfiguration Configuration { get; set; }public void ConfigureServices(IServiceCollection services) {services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){app.UseMvc(routes =>{routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id?}");});}} }為了讓它生效,我們還需要添加 NuGet 包依賴:Microsoft.AspNetCore.Mvc
添加控制器
控制器專門負責:
(1)接收來自 HTTP 請求的輸入
(2)將輸入轉交給與 HTTP 通信、JSON解析無關的服務類處理
(3)返回合適的響應代碼及正文
只要向文件中加入上面的內容,此前創建的路由就能自動檢測到這個控制器并讓它生效
添加模型
我們創建了一個用于表示股票報價的簡單模型
namespace StatlerWaldorfCorp.WebApp.Models {public class StockQuote{public string Symbol { get; set; }public int Price { get; set; }} }添加視圖
<html> <head><title>Hello world</title> </head> <body><h1>Hello World</h1><div><h2>Stock Quote</h2><div>Symbol: @Model.Symbol<br/>Price: $@Model.Price<br/></div></div> </body> </html>現在,我們可用修改 HomeController,不再返回示例文本,而是呈現視圖
using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using StatlerWaldorfCorp.WebApp.Models;namespace StatlerWaldorfCorp.WebApp.Controllers {public class HomeController : Controller{public IActionResult Index(){var model = new StockQuote { Symbol = "HLLO", Price = 3200 };return View(model);}} }如果現在運行應用,很可能會收到 HTTP 500 響應
由于我們開發的是 Web 應用,因而一定希望能查看所有發生錯誤的堆棧信息
可用向 Startup 類的 Configure 方法中加入一行調用 UseDeveloperExceptionPage 的代碼,實現這一需求
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration;namespace StatlerWaldorfCorp.WebApp {public class Startup{public Startup(IHostingEnvironment env){var builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddEnvironmentVariables();Configuration = builder.Build();}public IConfiguration Configuration { get; set; }public void ConfigureServices(IServiceCollection services) {services.AddMvc();}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole();loggerFactory.AddDebug();app.UseDeveloperExceptionPage();app.UseMvc(routes =>{routes.MapRoute("default",template: "{controller=Home}/{action=Index}/{id?}");});app.UseStaticFiles();}} }有了新的 Startup 類,我們應該能夠通過 dotnet restore 以及 dotnet run 啟動應用
從 JavaScript 中調用 REST API
首先,我們通過添加新的控制器來創建 API 端點
using Microsoft.AspNetCore.Mvc; using StatlerWaldorfCorp.WebApp.Models;namespace StatlerWaldorfCorp.WebApp.Controllers {[Route("api/test")]public class ApiController : Controller{[HttpGet]public IActionResult GetTest(){return this.Ok(new StockQuote { Symbol = "API", Price = 9999 });}} }如果現在再運行應用,可用打開瀏覽器并訪問 http://localhost:5000/api/test,應該能看到一個 JSON 響應
{"symbol" : "API","price" : 9999 }有了可供消費的 API 后,現在來修改我們唯一的視圖,讓它調用 JavaScript 來消費這個 API
<html> <head><title>Hello world</title><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script><script src="/Scripts/hello.js"></script> </head> <body><h1>Hello World</h1><div><h2>Stock Quote</h2><div>Symbol: @Model.Symbol<br/>Price: $@Model.Price<br/></div></div><br/><div><p class="quote-symbol">The Symbol is </p><p class="quote-price">The price is $</p></div> </body> </html>注意,這里決定引入一個 jQuery,以及一個新腳本 hello.js
我們按照約定,把它添加到名為 wwwroot 的新目錄 wwwroot/Scripts/hello.js
$(document).ready(function () {$.ajax({url: "/api/test"}).then(function (data) {$('.quote-symbol').append(data.symbol);$('.quote-price').append(data.price);}); });這些 jQuery 代碼非常直觀,它們向 API 端點發送 Ajax 請求,返回的對象會包含 symbol 和 price 屬性,它們將被附加到新添加的段落標簽之中
開發云原生 Web 應用
(1)API 優先
(2)配置
(3)日志
(4)會話狀態
(5)數據保護
(6)后端服務
(7)環境均等
(8)端口綁定
(9)遙測
(10)身份驗證和授權
會話狀態
云原生 Web 應用基本上不可能再使用基于內存的會話狀態了,而必須使用進程外的提供程序
數據保戶
如果涉及數據保護,”進程外存儲“的思路同樣適用于密鑰存儲
我們要使用一種現成的密鑰保管庫,可以是基于云的密鑰保管庫,也可以是基于 Redis 或其他數據庫制作的定制解決方案
端口綁定
不管是使用 docker compose,部署到 Kubernetes,還是使用 AWS、Azure 或者 GCP,應用要想在云環境中運行良好,就要能接受為它預設的任何端口號
總結
以上是生活随笔為你收集整理的《ASP.NET Core 微服务实战》-- 读书笔记(第7章)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 如何判断程序是否在远
- 下一篇: TIOBE 2月编程语言排行榜新鲜出炉!