.NET Core 和 DevOps

关键要点

  • 无论你目前使用什么样的技术栈,DevOps 都是值得一试的。

  • 闭源、专有软件和构建过程与 DevOps 实践不兼容。

  • .NET Core 是开源的,是基于 DevOps 构思和构建的。

  • .NET Core CLI 和 Roslyn API 让整个交付流程变得更加开放,且具有更强的适应性强。

  • 自动化是 DevOps 的重要组成部分,.NET Core 从一开始就支持自动化构建和部署。

随着.NET Core 2.0 的发布(最初发布于 2016 年),微软拥有了一个通用、模块化、跨平台和开源的平台最新主要版本。.NET Core 在当前版本的.NET Framework 中提供了很多 API。它最初是作为下一代 ASP.NET 解决方案而创建的,但现在成为很多其他场景的基础,包括物联网、云计算和下一代移动解决方案。在这篇文章中,我们将探讨.NET Core 的更多优势,以及它如何在为传统的.NET 开发人员带来好处的同时,还能让所有需要为市场带来强大、高性能和经济的解决方案的技术人员受益。

从.NET 1.0 推出测试版开始,我就在开发软件。我还记得当时使用.NET 感觉就像在作弊一样。我当时想,“这不是应该很难吗?我的 malloc 在哪里?我不需要转换指针了吗?这个框架类库用来做什么的?”

快进到 2018 年,我们仍然很乐意在.NET Framework 上编写代码,不必为内存分配问题而烦恼。System.Thread 为我们处理线程问题,然后是 BackgroundWorker,现在是 Task。原先不是线程安全的 FCL 类现在被标记为线程安全的。想开发一个 Web 应用程序?它就是一个完整的框架,包含了所有必需的组件。.NET 为我们提供了很多原本需要手动完成的东西。作为开发人员,我们把更多的时间花在编写业务逻辑代码上。汇编 /C/C++ 拥护者可能会唏嘘现在的一般开发人员都不需要硬核系统编程知识,但我不会这么抱怨!

从第一个 Beta 版开始,.NET 经历了多次迭代,其中包括了四个主要版本。最近的迭代.NET Core 是最重要的。.NET Core 带来了真正的跨平台、现代 CLI、构建系统和开源库,等等。这些东西都很重要,但.NETCore 的承诺不止于此,它还涉及了软件的开发和交付方式。

我开发软件已经有二十多年了,所以我还记得源码控制是为“大型”团队而保留的。“自动化”并没有真正出现在我们的词典中——除了我们为客户自动化业务流程。说得具体一点,就是构建 / 编译软件是由人类完成的。“构建经历”会在她自己的计算机上生成二进制文件(所以生成的文件在她自己的计算机上总能正常运行)!

将软件部署到它要运行的环境中是一个脆弱的拜占庭式过程,因为需要共享驱动器、FTP 和进行手动文件复制粘贴。整合开发团队的工作是一场悲惨的死亡游行,一次又一次的回退就像玩打地鼠游戏一样。是否可以投入生产?谁知道呢?

软件正在迅速建立起对世界的兴趣,但开发、部署和运营基于软件的系统的过程却停留在图灵和Hopper时代。2008 年左右发生了一场革命,这场革命被称为 DevOps。

从那时起到现在,这些年我们已经看到一场运动的兴起。DevOps 非常重要,它包含并可能取代之前出现的敏捷运动。我在 2014 年开始接触 DevOps,当时我在一次大会上拿到了《凤凰项目》这本书。当我开始如饥似渴地阅读那本书时,我的会议计划被我抛到脑后。这本书讲的东西太多了。如果你正处在 IT 行业,即使是很短的时间,你也一定扮演过那些角色。你可以试着自己代入角色。从那以后,DevOps 成了我职业生涯的焦点。

DevOps 通常被认为有三个主要的“支柱”:文化、流程和技术。本文是关于 DevOps 的技术部分。具体地说,是关于.NET Core 为现代 DevOps 实践带来的技术。.NET Core 是在 DevOps 兴起期间构思出来的。微软显然有明确的目标,就是让.NET Core 成为 DevOps 时代的平台。本文将介绍.NET Core 和 DevOps 的三个主要主题:

  • .NET Core 框架和 SDK;

  • 构建自动化;

  • 应用程序监控。

.NET Core 框架和 SDK

DevOps 并不是孤立存在的。用于生成和交付基于软件的系统的技术可能可以支持或者阻碍 DevOps 实践。无论你的技术栈是怎样的,DevOps 都是值得一试的。话虽如此,你选择的技术栈将对你的 DevOps 实践产生重大影响。

闭源、专有构建系统对 DevOps 来说并不友好。.NET Core 是完全开源的,用于表示项目和解决方案的文件格式也有完整的文档化。现代语言和框架(如 Node/JavaScript、Ruby 和 Python)已经具有一些常见特性:

  • 紧凑的开源框架;

  • 命令行界面(CLI);

  • 记录良好的开放式构建系统;

  • 支持所有主要操作系统。

这些特性和其他更多功能在 DevOps 时代变得越来越流行,因为它们具有很强的适用性和自动化能力。.NET Core 的 CLI 命令 dotnet 是.NET Core 应用程序构建过程的单一入口点。无论是什么平台,开发人员都可以在工作站上使用 dotnet,用于构建代理。也就是说:我将在后续展示的所有本地开发工作都可以在 MacBook Pro 上进行。试着想象一下,这在三年前是不可能的事情!

使用.NET Core 的第一步是下载它。你可以在这里下载 SDK。在我的 MBP 上有 171MB。安装完毕后,打开你最喜欢的终端窗口(在 Windows 上我偏爱 Powershell,但在 Mac 上我使用 iTerm2)。

如果你已经很熟悉.NET 开发,那么可能已经习惯了安装大型框架。你习惯使用 Visual Studio 来完成开发工作。如果你是.NET Core 新手,可能会觉得有点奇怪。在使用 IDE 之前,我们可以使用这 171 兆字节的东西完成很多事情。

执行:

dotnet

这是一个新的 CLI 命令,用于与.NET Core SDK 发生交互。让我们来看一下。

执行:

dotnet help

这将列出 CLI 支持的所有命令,这个清单并不长,也没必要很长。你可能在查找哪些是与.NET Core 框架构建过程进行交互所需的,从一个新项目到已部署的应用程序。

第一步是创建一个新的应用程序。让我们来看看我们的选项。

执行:

dotnet new

输出的信息将列出可用的模板。在 Visual Studio 中你可以单击 File-New Project 来创建项目,但在这里我们使用命令行。我们有很多模板可选择。我偏爱 Angular,所以让我们从那里开始吧。

执行:

dotnet new angular -o dotnet-angular

这将在新目录 dotnet-angular 中创建一个新的 Angular 项目。如果你愿意,可以手动创建目录,只是在执行 dotnet new 之前不要忘记更改目录,否则将在当前目录中创建项目。

如果你已经做过 Angular 开发,那么可能已经安装了 Node。如果没有,请花点时间下载并安装它。如果确实需要安装 Node,请在安装后关闭并重新打开终端。

执行:

dotnet run


这个命令将编译并运行应用程序(也可以通过执行 dotnet build 直接完成编译,而无需运行应用程序来)。这可能需要一两分钟时间,然后你将得到一些包含 URL 的输出:

Content root path: /Users/dswersky/dotnet-angular Now listening on: https://localhost:5001

将 URL 复制到 Web 浏览器中,然后等一会儿。你现在应该能看到一个在后台运行 ASP.NET Core、在前端运行 Angular 的简单应用程序。那么,这种体验与昔日的.NET 开发体验有何不同?

你在几分钟内就创建并运行了一个.NET Core 应用程序(即使包括安装.NET Core 和 Node),你可能会想到这几个问题:

我的 IDE 呢?

到目前为止,我们还不需要 IDE,对吗?很显然,如果你想编辑这段代码,你需要使用某些工具。你可能希望使用与.NET 和 Angular 相关的工具。“没问题”,你可能会想,“我启动 Visual Studio Professional 就可以了”。你可以这样做…或者你也可以下载 Visual Studio Code,它提供了很多功能,而且是免费的。你可以使用 Visual Studio Community,它也是免费的。关键在于,不再需要花费数百美元就可以开始基于.NET Core 的开发。

IIS 呢?

这是“遗留”.NET Web 应用程序开发和 ASP.NET Core 之间的主要区别。你可以在 IIS 中运行 ASP.NET Core 应用程序,但也可不必这么做。.NET Core 是跨平台的,所以将 ASP.NET Core 与 IIS 分离也是显而易见的。我在这里列出的命令,包括 dotnet run,在 Windows、Mac 和 Linux 上同样运行良好,且效果完全相同(甚至还有一个可以在 Raspberry Pi 上运行的 ARM 构建命令)。这个 Angular 应用程序是“编写一次,到处运行”的一个很好的示例。

不使用 IIS 来托管.NET 应用程序已经有一段时间了。.NET Open Web Interface(OWIN)多年来一直支持“自托管”ASP.NET 应用程序。这是通过代码和基础设施(通常称为“Project Katana”)来实现的。.NET Core 使用了一个叫作Kestrel的 HTTPS 服务器。Kestrel 是一款用于.NET 应用程序的快速、高性能、开源的 HTTPS 服务器。Kestrel 为 ASP.NET Core 网站和 RESTful 服务提供 HTTPS,让它们可以运行在任何地方,包括 Windows、Linux 和容器协调器。Kestrel 使 ASP.NET Core 应用程序变得完全独立,在基于 Windows 的 HTTPS 服务器上没有外部依赖性。

这与 DevOps 有什么关系?

自动化是 DevOps 的核心原则和实践。.NET Core 提供的可移植性、CLI 和开源构建系统对于 DevOps 实践来说至关重要。最重要的是,它们可以轻松实现构建和部署过程的自动化。可以通过编写 CLI 脚本来实现自动化,也可以通过编程方式直接自动化构建系统。.NET Core 的这些功能使其不仅可以实现自动化,而且可以相对轻松地自动执行复杂的构建过程。我们因此能够建立自动化和持续集成。

.NET Core 构建自动化

回到 Visual SourceSafe 时代,团队提交到存储库的代码就在那里,随时准备好进行编译。我的脑海里浮现出一个想法——“为什么我要在我的系统上构建部署,因为构建原本可以在存储库中进行?”我不是唯一一个有这种想法的人,但却没有对此采取什么行动。真正采取行动的是那些开始着手开发持续集成(CI)系统的勇士们。

CI 的目标说起来很简单,但实现起来并不那么容易:

始终有一个可部署的构建。

软件开发是一项团队运动。Agile/Scrum 团队平均有三到五名全职开发人员负责贡献代码。为了提升效率,他们之间进行了分工。然后他们开发的代码必须作为一个整体进行组合、构建和测试,而且必须使用未安装开发人员工具的系统进行自动化测试。理想情况下,在每次将新代码合并到指定分支时都应该进行构建和测试。CI 系统通常直接与源码控制系统集成,每次分支发生变更时触发新构建。

Roslyn是一款开源的.NET 编译器,提供了大量可直接访问的 API。CI 系统开发人员使用这些编译器 API 来构建插件,从而自动化.NET 构建过程。.NET Core 构建工具提供了对构建过程的细粒度控制。开发人员可以使用它们来调整和扩展现有的 CI 系统功能,以涵盖几乎任何可以想象的构建管道用例。你可以不是 CI 系统开发人员,但你可以构建插件。CI 系统的维护者和供应商竭尽全力使他们的系统易于扩展。

现在有很多 CI 系统。以下是一个简短的示例列表:

  • Jenkins;

  • TFS/Visual Studio Team Services;

  • CircleCI;

  • TeamCity;

  • GitLab。

.NET Core 提供的灵活性让它可以与任何 CI 系统集成,这就像使用 CLI 脚本或者使用编译器 API 开发的插件直接自动化构建一样简单。

如果你目前拥有自己喜欢的 CI 系统,可以尝试一下我的示例项目。这与我们之前使用 CLI 创建的项目是一样的,只是多了一点东西。存储库包含了一个 Dockerfile,我花了大约十分钟来创建一个 VSTS 构建管道、从 Github 中拉取代码、构建镜像,然后将其推送到 Azure 容器注册表。这与 AWS 或 Google Cloud 中的 Jenkinsfile 或 GitLab 管道一样好用。正如他们所说,一切皆有可能。

使用.NET Core 进行应用程序监控

软件系统的运维是一项全职工作,可以让 Ops 团队的同事来负责。这些系统就像婴儿一样——它们不断地叫啼,需要获得父母的关注。Ops 工作人员通常就像陷入困惑的父母一样,不知道为什么系统会发生这样那样的问题。系统如何引起人们注意?这取决于你是如何照看它们的!

最糟糕的系统监控方式就是不进行监控。无论你是否或者以某种方式进行监控,在它们出现故障时都会被注意到。当你的客户疯狂地打进客服电话或者完全弃用你的服务时,你会发现已经太晚了。应用程序监控的目标是抢在客户或最终用户之前检测出问题。很多公司做出错误的经济判断,他们认为应用程序监控过于昂贵,或者认为“好的系统不需要监控”。

即使是最稳定的系统离灾难性事故也只有一步之遥。DevOps 实践尝试在安全性和速度之间做出平衡——同时让公司可以通过快速移动进行创新。我们通过密切关注系统的运行参数来维持这种平衡。

.NET Core 的设计和架构非常适用进行应用程序监控。ASP.NET Core 是一个很好的例子。我们可以使用 HTTP 模块自定义在 IIS 上运行的 ASP.NET 3.x/4.x 应用程序的内部请求和响应行为。ASP.NET Core 使用中间件改进了这种模型,中间件概念类似于 HTTP 模块,但在实现方面却非常不一样。中间件类通过代码进行集成,并且配置起来要简单得多。它们形成了一个请求 / 响应管道链。

将中间件注入 ASP.NET Core 应用程序是非常容易的。我将演示一个 Azure Application Insights 示例。我在 Azure Portal 中创建了一个 Application Insights 资源,然后在我的存储库中编辑了三个文件来启用 Application Insights 监控:

dotnet-angular.csproj

添加了一行来引用 Application Insights 资源(之所以需要这个手动步骤,是因为我使用的是 Visual Studio for Mac,详细信息请参见这里)。

appsettings.json

添加了我的 Application Insights 密钥。

Startup.cs

Startup.cs 是配置中间件的地方。我在这里添加了 Application Insights 中间件。

完成这些工作后,我就能够在本地进行调试,并收集来自 Application Insights 的监控数据。你可以自己尝试一下,只需要用你的密钥替换 appsettings.json 中的示例密钥即可。

当然,Application Insights 并不是监控应用程序的唯一选择。AppMetrics是一个开源监控库,可与 Grafana 等可视化工具集成。一些供应商也提供了付费选项。

所有这些监控方案都提供了能够在运行时环境中查看应用程序行为的透明度,这对于 DevOps 实践来说至关重要,因为它可以在不影响系统性能的情况下让你验证对系统所做的更改。然后,你可以添加新功能,并确信快速变更不会破坏已有的东西。

结论

.NET Core 是在考虑 DevOps 实践的情况下构思和开发出来的。CLI 和开放式构建系统和库让软件交付过程自动化变得可能。如果你愿意,可以通过 CLI 脚本或更深入的编程集成来实现构建自动化和持续集成。使用开源或付费企业工具进行应用程序监控可将你的系统从黑匣子转变为透明的玻璃窗格。基于 DevOps 实践的.NET Core 是现代软件系统的一个非常具有吸引力的平台。

关于作者

Dave Swersky,从事 IT 工作已超过 20 年,从支持工程师到软件开发人员,再到企业架构师。他是一个有抱负的多面手,并且对 DevOps 充满热情。他曾在很多与 DevOps 相关的大会上做过演讲,包括 DevOps 企业峰会、CodeMash、Stir Trek 以及 KC 的本地聚会。Dave 还写了一本关于 DevOps 的书:DevOps Katas: Hands-On DevOps。可以通过 Twitter 账号 @dswersky 找到 Dave

原文地址:https://www.infoq.cn/article/bQglfj1OSH-UskotCXu8


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Message Decoding密码翻译

这是一道模拟题ex 其实每一道模拟题都很“简单”, 这道题就是难在读英文题!处理输入! 真的我竟然花了几个小时就只是为了看懂样例!!orz 题目大意 考虑下面的01串序列: 0,00,01…

.NET Core开发日志——结构化日志

在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net。而其后来者,莫过于NLog。Nlog与log4net相比,有一项较显著的优势,它支持结构化日志。结构化日志,也被称为语义化日志。其作用有二&…

YBTOJ 特殊数列(哈希表)

文章目录题目描述解析代码题目描述 解析 应该是哈希表板子题了 选一个1e6左右的质数进行处理即可 其实本质就是链前 没啥特别新鲜的 为什么要写呢&#xff1f; 因为这个东西很早之前看的时候完全没有看懂。。。 代码 #include<bits/stdc.h> using namespace std; #def…

Strange Definition CodeForces - 1471D

题意&#xff1a; 定义数字 x 和 y 是“相邻”的当且仅当 lcm(x,y)/gcd(x,y) 是一个平方数。 给定一个长度为 n 的数组 a。 每过一秒&#xff0c;数组 a 会发生变化&#xff1a;ai 会变成数组 a 中与其“相邻”的所有数字的乘积。 定义 di 为数组 a 中与 ai “相邻” 的数字个…

学习三分 (概念 + 模板 + 例题:曲线)

这好像是我第一次尝试写一个新知识入门 而不是习题解 文章目录三分概念模板例题&#xff1a;曲线题目题解代码实现三分概念 我们都知道&#xff0c;二分是在一个单调函数&#xff08;即一次函数&#xff09;上通过每次查找折半的方式&#xff0c;对答案进行搜索查找。那么&am…

迎元旦,庆surging 1.0发布

一位摄影程序员的独白每个人都有爱好&#xff0c;都有释放压力的活动&#xff0c;而我也不例外&#xff0c;我除了每天上班&#xff0c;周末就会约一群好友去拍妹子&#xff0c;成家后&#xff0c;就改为拍虫子&#xff0c;一拍就到了30岁&#xff0c;到了30岁就感觉到了中年的…

YBTOJ:求好元素(哈希表)

文章目录题目描述解析代码题目描述 解析 如果枚举m,n,p的话是n3的 会超时 但我们注意到右边查询只有O(n) 这就很不平衡 所以考虑把p移到右边&#xff0c;预处理枚举m、n存到哈希表中 查询枚举i、p 这样就把复杂度均摊降到了n2 但是本题数据较强 所以我们得保证哈希表的单词查询…

Strange Shuffle CodeForces - 1471E(交互题)

交互题 这类型不同于普通的题。 可以理解为有个问题需要你解决&#xff0c;你通过输入某些东西表示你要问系统的问题&#xff0c;这时系统会回答你的问题。在代码中的回答方式就是会输入某个东西就是系统给你的答案&#xff0c;通过这些信息你可以得到问题的解你是不可以自己测…

学习KMP (概念 + 模板 + 例题: 子串查找)

我又回来了&#xff0c;感jio这几天有点勤啊&#xff01;&#xff01; 这一次我带着KMP来了&#xff0c; 文章目录KMP介绍模板例题&#xff1a; 子串查找题目暴力题解KMP题解代码实现KMP介绍 KMP&#xff0c;即 Knuth-Morris-Pratt 字符串查找算法&#xff0c;由Donald Knuth…

直播预告 - 博时基金DevOps体系建设和自动化测试分享

最近几年&#xff0c;基金行业发展比较快&#xff0c;业务范围从传统公募到大资管&#xff0c;业务地域从中国大陆到全球化&#xff0c;在互联网金融浪潮中扮演了重要角色&#xff0c;金融科技又带来新的挑战和机遇。据毕马威2014年研究报告显示&#xff0c;由于新技术、人口变…

YBTOJ:公共子串(KMP)

文章目录题目描述解析代码题目描述 解析 我的做法是二分答案&#xff0c;暴力枚举子串&#xff0c;对其他的字符串进行KMP。 复杂度logL*L2 没有一次AC&#xff0c;因为忘记了字符串清零&#xff01;&#xff0c;否则它会和上次二分的字符串没被覆盖到的部分连在一起。 之前遇…

Asp.Net Core + Docker 搭建

一、Docker安装&#xff08;1&#xff09;机器准备 本次实验&#xff0c;我是在Win10上,使用Vmware Workstation虚拟机安装的Ubuntu 18.04.l LTS版本进行搭建。&#xff08;2&#xff09;安装Docker# yum install docker注意:如果提示未安装yum 使用命令:apt-get install yum&a…

数数字

今天中午1小时&#xff0c;定时两道&#xff0c;我就知道自己的太阳降落了。。。orz 文章目录题目题解代码实现题目 PB 带来了若干只蒟蒻。 众所周知&#xff0c;NTF 是数论学会的会长&#xff0c;于是 PB 准备用数字击败 NTF&#xff0c;以证明 PB 比 NTF 更强。 于是 PB 准…

YBTOJ:前缀数组(KMP)

文章目录题目描述解析代码题目描述 解析 题面脸上写着5个大字&#xff1a;我是KMP 但是本题没有自己做出来。。。我一开始的思路其实很接近题解了&#xff0c;只是被我舍弃了qwq。 后来卡在暴力nL2的瓶颈上&#xff0c;用了个倍增的诡异操作搞到了nLlogL&#xff0c;但是n5&am…

西安活动 | 2019年1月13号 拥抱开源, 又见.NET 线下交流活动报名进行中

随着.NET Core的发布和开源&#xff0c;.NET又重新回到人们的视野。.NET Core的下个3.0即将release&#xff0c;加入非常多的新功能&#xff0c;越来越拥抱变化&#xff0c;DevOps和Microservice的最佳实践已经在.NET Core落地&#xff0c;比如 Ocelot网关、GrpcConsul 服务注册…

[ZOJ 3203] 灯泡

今天这个**又带着题走来了&#xff01;&#xff01; 文章目录[TOC] 题目题解代码实现题目 相比 wildleopard 的家&#xff0c;他的弟弟 mildleopard 比较穷。他的房子是狭窄的而且在他的房间里面仅有一个灯泡。每天晚上&#xff0c;他徘徊在自己狭小的房子里&#xff0c;思考如…

YBTOJ:字符串题(KMP)

文章目录题目描述解析1.p[i]>0:2.p[i]0&#xff1a;代码题目描述 解析 我个人做起来很费劲的一道题&#xff0c;用vector&#xff0c;并查集等等东西搞来搞去过掉了&#xff08;竟然只WA了一次 &#xff09; 看题解思路就一下子清晰了&#xff0c;还是对KMP的理解不到位。 …

Asp.Net Core 轻松学-正确使用分布式缓存

前言本来昨天应该更新的&#xff0c;但是由于各种原因&#xff0c;抱歉&#xff0c;让追这个系列的朋友久等了。上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存&#xff0c;那么本篇文章就来了解一下如何使用分布式缓存&#xff0c;通过本章&#xff0…

计算几何初步

两点之间距离 欧氏距离 即欧几里得距离。 平面内两点的距离为 \[\sqrt{(x_1-x_2)^2(y_1-y_2)^2} \]立体空间内两点的距离为 \[\sqrt{(x_1-x_2)^2(y_1-y_2)^2(z_1-z_2)^2} \]\(\dots\) \(n\) 维空间内两点的距离为 \[\sqrt{\sum_{i1}^{n}{(x_1-x_2)^2}} \]曼哈顿距离 二维空间内…

树链剖分概念及模板 + 例题 [POJ3237 tree + 软件包管理器]

文章目录概念模板例题1&#xff1a;软件包管理器题目题解代码实现例题2&#xff1a;POJ3237 tree题目题解代码实现概念 树链剖分主要是用于解决以下这两个问题。 1、更改树上点x到点y的最短路径上的所有结点的值 2、查询树上点x到点y的最短路径上的所有结点的和。 在讲树链剖分…