做者:陈希章 发表于 2017年12月19日linux
这一篇文章将用一个完整的实例,给你们介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https://www.microsoft.com/net 开发一个Web API Service,而且利用Azure的PaaS服务来实现部署,以及持续的开发运营(devops)。git
这篇文章的难度不高,但会做为一个操做指南,后续不少文章,若是涉及到这块基础工做,都会引用这篇文章。本文所演示的范例代码,能够经过 https://github.com/chenxizhang/dotnetcoreapisample 下载。github
目前的最新版本是2.1.3,你能够根据须要下载到不一样的版本,请注意安装SDK,而不是Runtime。web
这个工具一样是支持跨平台的,请经过下面的地址下载安装:https://code.visualstudio.com/Downloadsql
在命令行工具中运行 dotnet new webapi –o dotnetcoreapisample数据库
即使不作任何修改,在命令行工具中运行dotnet run便可运行这个项目。macos
在浏览器中访问 http://localhost:5000/api/values 若是你也看到下面的效果,恭喜你,你的项目已经运行成功了。编程
在命令行中输入 code . 会自动打开Visual Studio Code。若是你打开Controllers目录下面的ValuesController.cs 文件,你能够看到以下代码,跟上面的网页返回结果对照一下,你会以为如今编写一个Web API 真的很是简单啊。json
虽然上面的代码能运行,但咱们真正要作的一个Web API服务,是但愿能给用户提供建立订单,修改订单,查询订单,甚至删除订单的服务。因此,请先删除掉上面这个ValuesController.cs 文件。我会演示怎么样一步一步地将一个订单服务实现出来。windows
全部的服务都离不开数据,咱们将使用Entity Framework来实现数据层服务。因此咱们要先定义订单这个数据接口的实体。
请增长一个目录,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; } } }
光有数据实体是不够的,咱们还须要定义一个数据服务,或者也能够成为数据上下文服务。请在Models目录中,再建立下面这样一个类: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; } } }
dotnet core提供了一种很是好的编程模型,咱们能够在程序启动的时候,将必要的数据服务对象注入进去,而后在后续的业务服务中就能够直接使用它。
定位到Startup.cs这个文件,在顶部先添加两个命名空间的引用 using Microsoft.EntityFrameworkCore;
和 using dotnetcoreapisample.Models;
而后在 ConfigureServices 这个方法里面,第一行添加以下代码 services.AddDbContext<SampleDbContext>(_=>_.UseInMemoryDatabase("Sample"));
这句代码的意思是,使用一个在内存中的数据库。做为快速开发和测试目的,这是最方面的。固然,若是你真的想要有一个实际的数据库文件,Entity Framework支持几乎全部的数据源,尤为是对sqlite和SQL Server的支持很是好,请参考 https://docs.microsoft.com/en-us/aspnet/core/data/ef-rp/intro
这是最后一步了,请在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(); } } }
完成上面的工做后,你就能够经过按下F5键(或者执行dotnet run命令)运行这个项目了。我用Fiddler来模拟用户请求,下面展现了四个不一样的脚本。
建立订单
咱们使用POST方法发起请求,地址是http://localhost:5000/api/orders,而后在请求的正文里面用JSON格式表示一个订单信息
查询订单
咱们使用GET方法发起请求,地址也是http://localhost:5000/api/orders,在请求的头部里面设置Content-Type为application/json
此时咱们能够看到,系统已经建立了一个订单,编号为1(这是自动编号的)。
修改订单
咱们使用PUT方法发起请求,地址是http://localhost:5000/api/orders/1,在请求的正文里面,我将要修改的订单信息用JSON表示,请注意,我将单价从200修改成400
若是再次查询订单,你能够看到数据已经修改了
删除订单
最后,咱们能够经过DELETE方法发起请求,给定地址是 http://localhost:5000/api/orders/1 来完成删除一个订单的操做
一切看起来还不错,接下来给你们介绍一下如何采用Azure云平台进行部署,以及经过Azure的PaaS服务实现开发运营一体会(devops)的实践。
传统的状况,开发人员(和测试人员)作到上面这一步,工做就算结束了。他们会将代码签入到代码库,而后愉快地打卡下班。接下来的工做是什么呢?运维人员会准备虚拟机,安装必要的软件,而后将代码下载下来,编译以后将获得的文件复制到服务器的某个文件夹,沐浴更衣烧香拜佛以后,颇有可能Web服务器能正常地启动起来,若是不能,他们就要顶着巨大的压力,跟开发人员打电话,委婉地要求对方帮忙检查一下问题,可是极可能获得的答复是:你是怎么弄的呢,这个明明在个人机器是跑的好好的?上帝保佑,若是此次部署是成功的,但下次若是要更新一个版本,多是再一次的痛苦的过程。若是说,在之前的时候咱们的软件更新并不频繁,这种痛苦仍是能够接受的话,如今随着互联网应用开发模式的兴起,业务需求可能三天两头的变化,如此的开发运营割裂的情况,是远远达不到要求的。这也是业界呼唤有更好的工做方式的一个根本缘由,devops也就是这么样兴起的。
理论其实并不高深,关键看怎么能有效地实现开发和运维的一体化,很大程度上,这个固然取决于平台和工具,其根本在于要实现智能和自动化。另外,devops会逼迫咱们从新对应用架构进行一些思考,模组化和微服务化会成为一个天然而然的选择。这个我在后面会有专门的文章给你们解读。本文先用实例来让你们感觉一下。
我这里推荐的平台是微软的Azure云平台,它不只仅是一个强大的IaaS平台,提供了全球质量保证和安全合规的基础架构服务(计算,网络,存储等),同时更重要的是,它是一个PaaS平台,对于广大的业务应用开发人员来讲,使用Azure提供的工具,能够事半功倍地实现devops,将更多精力集中在应用逻辑而不是服务器配置、监测、部署更新等工做上面。
闲话少说,若是你尚未Azure帐号,能够申请试用。接下来能够参考个人步骤来看看如何将咱们刚才建立的这个Web API项目部署到Azure,而且实现基于代码更新的应用自动发布。
登陆到Azure的管理门户后,选择“应用程序服务”,而后添加一个“Web应用”
在接下来的窗口中完成资源配置,请注意,做为测试场景的话,你甚至能够选择免费的一种应用服务计划。这里还能够打开Application Insight(这个目前也是免费的服务)。
配置这个应用服务的部署选择,此时逐渐解开了Azure 做为 devops 平台的面纱了。在下图中能够选择“本地Git存储库”做为部署源
虽然你能够看到不少其余的选项,但本篇文章是入门的,因此不作一一展开。下面咱们设置一下部署的凭据。
完成上面这些配置后,咱们回到Web应用的概述页面,你会发现如今多出来一个能够用来远程部署的Git存储库地址,请将这个地址复制下来。
回到以前的Visual Studio Code的界面,打开命令行窗口,经过git init
命令初始化本地的git存储库,而后执行git add *
和git commit -m 'init'
这两条命令完成初始化提交到本地。最后,经过下面的命令添加远程存储库。
接下来,运行 git push azure master
这条命令,此时会弹出一个对话框,请输入上一步建立的用户名和密码,这个提交过程可能会比较长,尤为是第一次。这是由于它不只仅会将代码上传到代码库,并且后台会启动一系列的操做,来进行编译和部署。下面是在我这边的输出结果。
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
咱们能够很清楚地看到代码上传后,触发了一个部署的事件,该部署脚本先会拉取全部依赖的包,而后执行构建,最后将文件复制到指定的一个目录。这种自动化的过程就是devops的基石。固然,如今的dotnet core的平台无关性也给部署带来了极大的便利。
在完成部署后,咱们回到Azure的门户,在应用服务的“部署选项”能够看到已经部署的记录,最新的一次部署被标记为 “活动”状态。
点击某一次部署,还能够看到详细信息
若是咱们对于当前此次部署不满意,还能够随时选择其余部署,而且选择“从新部署”操做,这样就能够快速进行应用的回滚。
好了,咱们最后能够在浏览中输入 https://dotnetcoreapisample.azurewebsites.net/api/orders ,若是返回一个空白的数组“[]” ,说明这个服务是正常工做的。由于咱们使用的是内存数据库,因此每次部署后,都会将数据清空,这就是为何第一次返回空白数组的缘由。
使用Azure的PaaS服务来部署Web 应用,经过简单配置后,开发人员只须要关注代码自己,在本地调试后,将代码推送到Azure,后台将自动进行构建和部署,因为有版本控制,因此随时能够根据须要进行前滚和回滚。基于Azure平台进行应用开发,无缝地融入了devops,能够极大地改善开发和运维流程,提升研发效率和质量。本文只是一个开始,我在后续还会介绍各类不一样的场景。