使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
引子
這一篇文章將用一個完整的實例,給大家介紹如何基于dotnet core(微軟.NET的最新版本,支持跨平臺,跨設(shè)備的應(yīng)用開發(fā),詳情請參考 https://www.microsoft.com/net 開發(fā)一個Web API Service,并且利用Azure的PaaS服務(wù)來實現(xiàn)部署,以及持續(xù)的開發(fā)運營(devops)。
這篇文章的難度不高,但會作為一個操作指南,后續(xù)很多文章,如果涉及到這塊基礎(chǔ)工作,都會引用這篇文章。本文所演示的范例代碼,可以通過?https://github.com/chenxizhang/dotnetcoreapisample?下載。
1、安裝dotnet core SDK
目前的最新版本是2.1.3,你可以根據(jù)需要下載到不同的版本,請注意安裝SDK,而不是Runtime。
https://www.microsoft.com/net/download/windows
https://www.microsoft.com/net/download/linux
https://www.microsoft.com/net/download/macos
2、安裝開發(fā)工具 visual studio code
這個工具同樣是支持跨平臺的,請通過下面的地址下載安裝:https://code.visualstudio.com/Download
3、創(chuàng)建Web API 項目
在命令行工具中運行 dotnet new webapi –o dotnetcoreapisample
4、運行Web API 項目
即便不做任何修改,在命令行工具中運行dotnet run即可運行這個項目。
在瀏覽器中訪問?http://localhost:5000/api/values?如果你也看到下面的效果,恭喜你,你的項目已經(jīng)運行成功了。
在命令行中輸入 code . 會自動打開Visual Studio Code。如果你打開Controllers目錄下面的ValuesController.cs 文件,你可以看到如下代碼,跟上面的網(wǎng)頁返回結(jié)果對照一下,你會覺得現(xiàn)在編寫一個Web API 真的非常簡單啊。
5、增加數(shù)據(jù)實體
雖然上面的代碼能運行,但我們真正要做的一個Web API服務(wù),是希望能給用戶提供創(chuàng)建訂單,修改訂單,查詢訂單,甚至刪除訂單的服務(wù)。所以,請先刪除掉上面這個ValuesController.cs 文件。我會演示怎么樣一步一步地將一個訂單服務(wù)實現(xiàn)出來。
所有的服務(wù)都離不開數(shù)據(jù),我們將使用Entity Framework來實現(xiàn)數(shù)據(jù)層服務(wù)。所以我們要先定義訂單這個數(shù)據(jù)接口的實體。
請增加一個目錄,Models,然后增加第一個代碼文件 Order.cs
namespace dotnetcoreapisample.Models{ using System; public class Order{ public int Id { get; set; } public DateTime OrderDate { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public string Product { get; set; }}}6、創(chuàng)建數(shù)據(jù)服務(wù)
光有數(shù)據(jù)實體是不夠的,我們還需要定義一個數(shù)據(jù)服務(wù),或者也可以成為數(shù)據(jù)上下文服務(wù)。請在Models目錄中,再創(chuàng)建下面這樣一個類:SampleDbContext.cs
namespace dotnetcoreapisample.Models{ using System; using Microsoft.EntityFrameworkCore; using System.Linq; public class SampleDbContext:DbContext{ public?SampleDbContext(DbContextOptions<SampleDbContext> options):base(options){} public DbSet<Order> Orders { get; set; }}}7、注入數(shù)據(jù)服務(wù)
dotnet core提供了一種非常好的編程模型,我們可以在程序啟動的時候,將必要的數(shù)據(jù)服務(wù)對象注入進去,然后在后續(xù)的業(yè)務(wù)服務(wù)中就可以直接使用它。
定位到Startup.cs這個文件,在頂部先添加兩個命名空間的引用?using Microsoft.EntityFrameworkCore;?和?using dotnetcoreapisample.Models;
然后在 ConfigureServices 這個方法里面,第一行添加如下代碼?services.AddDbContext<SampleDbContext>(_=>_.UseInMemoryDatabase("Sample"));
這句代碼的意思是,使用一個在內(nèi)存中的數(shù)據(jù)庫。作為快速開發(fā)和測試目的,這是最方面的。當(dāng)然,如果你真的想要有一個實際的數(shù)據(jù)庫文件,Entity Framework支持幾乎所有的數(shù)據(jù)源,尤其是對sqlite和SQL Server的支持非常好,請參考?https://docs.microsoft.com/en-us/aspnet/core/data/ef-rp/intro
8、創(chuàng)建Web API 服務(wù)
這是最后一步了,請在Controllers目錄中增加一個OrderController.cs的文件,代碼如下
using Microsoft.AspNetCore.Mvc;using dotnetcoreapisample.Models;using System.Collections.Generic;using System.Linq;namespace dotnetcoreapisample.Controllers{[Route("api/[controller]")] public class OrdersController:Controller{ private SampleDbContext context; public?OrdersController(SampleDbContext ctx){context = ctx;}[HttpGet] public?IEnumerable<Order>?Get(){ return context.Orders;}[HttpGet("{id}")] public?Order?Get(int?id){ return context.Orders.FirstOrDefault(x=>x.Id == id);}[HttpPost] public?void?Post([FromBody]Order?value){context.Orders.Add(value);context.SaveChanges();}[HttpPut("{id}")] public?void?Put(int?id,[FromBody]Order?value){ var found = context.Orders.FirstOrDefault(x=>x.Id == id); if(found!=null){found.OrderDate = value.OrderDate;found.Product =value.Product;found.Quantity =value.Quantity;found.UnitPrice =value.UnitPrice;context.SaveChanges();}}[HttpDelete("{id}")] public?void?Delete(int?id){ var found = context.Orders.FirstOrDefault(x=>x.Id == id);context.Orders.Remove(found);context.SaveChanges();}} }9、運行和測試Web API服務(wù)
完成上面的工作后,你就可以通過按下F5鍵(或者執(zhí)行dotnet run命令)運行這個項目了。我用Fiddler來模擬用戶請求,下面展示了四個不同的腳本。
創(chuàng)建訂單
我們使用POST方法發(fā)起請求,地址是http://localhost:5000/api/orders,然后在請求的正文里面用JSON格式表示一個訂單信息
查詢訂單
我們使用GET方法發(fā)起請求,地址也是http://localhost:5000/api/orders,在請求的頭部里面設(shè)置Content-Type為application/json
此時我們可以看到,系統(tǒng)已經(jīng)創(chuàng)建了一個訂單,編號為1(這是自動編號的)。
修改訂單
我們使用PUT方法發(fā)起請求,地址是http://localhost:5000/api/orders/1,在請求的正文里面,我將要修改的訂單信息用JSON表示,請注意,我將單價從200修改為400
如果再次查詢訂單,你可以看到數(shù)據(jù)已經(jīng)修改了
刪除訂單
最后,我們可以通過DELETE方法發(fā)起請求,給定地址是?http://localhost:5000/api/orders/1?來完成刪除一個訂單的操作
一切看起來還不錯,接下來給大家介紹一下如何采用Azure云平臺進行部署,以及通過Azure的PaaS服務(wù)實現(xiàn)開發(fā)運營一體會(devops)的實踐。
10、創(chuàng)建Azure的應(yīng)用程序服務(wù)(App Service)
傳統(tǒng)的情況,開發(fā)人員(和測試人員)做到上面這一步,工作就算結(jié)束了。他們會將代碼簽入到代碼庫,然后愉快地打卡下班。接下來的工作是什么呢?運維人員會準備虛擬機,安裝必要的軟件,然后將代碼下載下來,編譯之后將得到的文件復(fù)制到服務(wù)器的某個文件夾,沐浴更衣燒香拜佛之后,很有可能Web服務(wù)器能正常地啟動起來,如果不能,他們就要頂著巨大的壓力,跟開發(fā)人員打電話,委婉地要求對方幫忙檢查一下問題,但是很可能得到的答復(fù)是:你是怎么弄的呢,這個明明在我的機器是跑的好好的?上帝保佑,如果這次部署是成功的,但下次如果要更新一個版本,可能是再一次的痛苦的過程。如果說,在以前的時候我們的軟件更新并不頻繁,這種痛苦還是可以接受的話,現(xiàn)在隨著互聯(lián)網(wǎng)應(yīng)用開發(fā)模式的興起,業(yè)務(wù)需求可能三天兩頭的變化,如此的開發(fā)運營割裂的狀況,是遠遠達不到要求的。這也是業(yè)界呼喚有更好的工作方式的一個根本原因,devops也就是這么樣興起的。
理論其實并不高深,關(guān)鍵看怎么能有效地實現(xiàn)開發(fā)和運維的一體化,很大程度上,這個當(dāng)然取決于平臺和工具,其根本在于要實現(xiàn)智能和自動化。另外,devops會逼迫我們重新對應(yīng)用架構(gòu)進行一些思考,模組化和微服務(wù)化會成為一個自然而然的選擇。這個我在后面會有專門的文章給大家解讀。本文先用實例來讓大家感受一下。
我這里推薦的平臺是微軟的Azure云平臺,它不僅僅是一個強大的IaaS平臺,提供了全球質(zhì)量保證和安全合規(guī)的基礎(chǔ)架構(gòu)服務(wù)(計算,網(wǎng)絡(luò),存儲等),同時更重要的是,它是一個PaaS平臺,對于廣大的業(yè)務(wù)應(yīng)用開發(fā)人員來說,使用Azure提供的工具,可以事半功倍地實現(xiàn)devops,將更多精力集中在應(yīng)用邏輯而不是服務(wù)器配置、監(jiān)測、部署更新等工作上面。
閑話少說,如果你還沒有Azure賬號,可以申請試用。接下來可以參考我的步驟來看看如何將我們剛才創(chuàng)建的這個Web API項目部署到Azure,并且實現(xiàn)基于代碼更新的應(yīng)用自動發(fā)布。
登錄到Azure的管理門戶后,選擇“應(yīng)用程序服務(wù)”,然后添加一個“Web應(yīng)用”
在接下來的窗口中完成資源配置,請注意,作為測試場景的話,你甚至可以選擇免費的一種應(yīng)用服務(wù)計劃。這里還可以打開Application Insight(這個目前也是免費的服務(wù))。
配置這個應(yīng)用服務(wù)的部署選擇,此時逐漸解開了Azure 作為 devops 平臺的面紗了。在下圖中可以選擇“本地Git存儲庫”作為部署源
雖然你可以看到很多其他的選項,但本篇文章是入門的,所以不做一一展開。下面我們設(shè)置一下部署的憑據(jù)。
完成上面這些配置后,我們回到Web應(yīng)用的概述頁面,你會發(fā)現(xiàn)現(xiàn)在多出來一個可以用來遠程部署的Git存儲庫地址,請將這個地址復(fù)制下來。
11、配置和遠程部署
回到之前的Visual Studio Code的界面,打開命令行窗口,通過git init?命令初始化本地的git存儲庫,然后執(zhí)行g(shù)it add *和git commit -m 'init'?這兩條命令完成初始化提交到本地。最后,通過下面的命令添加遠程存儲庫。
接下來,運行?git push azure master這條命令,此時會彈出一個對話框,請輸入上一步創(chuàng)建的用戶名和密碼,這個提交過程可能會比較長,尤其是第一次。這是因為它不僅僅會將代碼上傳到代碼庫,而且后臺會啟動一系列的操作,來進行編譯和部署。下面是在我這邊的輸出結(jié)果。
PS C:\temp\dotnetcoreapisample> git push azure master Counting objects: 9, done. Delta compression using up to 4 threads. Compressing objects: 100% (7/7), done. Writing objects: 100% (9/9), 7.90 KiB | 899.00 KiB/s, done. Total 9 (delta 5), reused 0 (delta 0) remote: Updating branch 'master'. remote: Updating submodules. remote: Preparing deployment for commit id '3adc61d27e'. remote: Generating deployment script. remote: Running deployment command... remote: Handling ASP.NET Core Web Application deployment. remote: ............................................................ remote: Restoring packages for D:\home\site\repository\dotnetcoreapisample.csproj... remote: Restore completed in 755.48 ms for D:\home\site\repository\dotnetcoreapisample.csproj. remote: ..... remote: Generating MSBuild file D:\home\site\repository\obj\dotnetcoreapisample.csproj.nuget.g.props. remote: Generating MSBuild file D:\home\site\repository\obj\dotnetcoreapisample.csproj.nuget.g.targets. remote: Restore completed in 10.36 sec for D:\home\site\repository\dotnetcoreapisample.csproj. remote: ............................................................. remote: Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core remote: Copyright (C) Microsoft Corporation. All rights reserved. remote: remote: ................................................ remote: dotnetcoreapisample -> D:\home\site\repository\bin\Release\netcoreapp2.0\dotnetcoreapisample.dll remote: ........... remote: dotnetcoreapisample -> D:\local\Temp\8d546e10a232b37\ remote: KuduSync.NET from: 'D:\local\Temp\8d546e10a232b37' to: 'D:\home\site\wwwroot'remote: Copying file: 'dotnetcoreapisample.deps.json'remote: Copying file: 'dotnetcoreapisample.dll'remote: Copying file: 'dotnetcoreapisample.pdb'remote: Copying file: 'dotnetcoreapisample.PrecompiledViews.dll'remote: Copying file: 'dotnetcoreapisample.PrecompiledViews.pdb'remote: Copying file: 'dotnetcoreapisample.runtimeconfig.json'remote: Finished successfully. remote: Running post deployment?command(s)... remote: Deployment successful. To https://dotnetcoreapisample.scm.azurewebsites.net:443/dotnetcoreapisample.git?37b30a5..3adc61d master -> master我們可以很清楚地看到代碼上傳后,觸發(fā)了一個部署的事件,該部署腳本先會拉取所有依賴的包,然后執(zhí)行構(gòu)建,最后將文件復(fù)制到指定的一個目錄。這種自動化的過程就是devops的基石。當(dāng)然,現(xiàn)在的dotnet core的平臺無關(guān)性也給部署帶來了極大的便利。
12、查看Web API的運行結(jié)果
在完成部署后,我們回到Azure的門戶,在應(yīng)用服務(wù)的“部署選項”可以看到已經(jīng)部署的記錄,最新的一次部署被標記為 “活動”狀態(tài)。
點擊某一次部署,還可以看到詳細信息
如果我們對于當(dāng)前這次部署不滿意,還可以隨時選擇其他部署,并且選擇“重新部署”操作,這樣就可以快速進行應(yīng)用的回滾。
好了,我們最后可以在瀏覽中輸入?https://dotnetcoreapisample.azurewebsites.net/api/orders?,如果返回一個空白的數(shù)組“[]” ,說明這個服務(wù)是正常工作的。因為我們使用的是內(nèi)存數(shù)據(jù)庫,所以每次部署后,都會將數(shù)據(jù)清空,這就是為什么第一次返回空白數(shù)組的原因。
結(jié)語
使用Azure的PaaS服務(wù)來部署Web 應(yīng)用,通過簡單配置后,開發(fā)人員只需要關(guān)注代碼本身,在本地調(diào)試后,將代碼推送到Azure,后臺將自動進行構(gòu)建和部署,由于有版本控制,所以隨時可以根據(jù)需要進行前滾和回滾?;贏zure平臺進行應(yīng)用開發(fā),無縫地融入了devops,可以極大地改善開發(fā)和運維流程,提高研發(fā)效率和質(zhì)量。本文只是一個開始,我在后續(xù)還會介紹各種不同的場景。
原文:http://www.cnblogs.com/chenxizhang/p/8067824.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ICanPay 统一支付网关
- 下一篇: 采用Opserver来监控你的ASP.N