一个因Microsoft Azure、ASP.NET Core和Docker的博客系统

二零零六年十二月,我以新浪通达了个人帐号,并在乐乎登了和睦之首先篇博客。当然,我形容博客也无是由二〇〇八年才开之,在更早时段,也在CSDN和系统分析员社团(之后名吧“希赛网”)个人空间发表了有及编程和开相关的篇章。从出道到本,我至始至终乐于与网友分享自己的所法所得,希望会合出更多之以及自己同样的正规化朋友可以在事业上取得成功,也算吧我们的软件事业贡献自己之均等客力吧,那为是我当网易建博客上的愿景:专业、求是、解惑。因而,我在写博客作品的早晚,都是坐客观谨慎的神态来阐释技术知识,并尽可能地因为重新好之内容协会格局来加强作品的可读性,同时尽量地回网友的发问。有很多新浪的粉及我领到了观点,有的说自己的博客更新太慢,也有些说自家来若干体系著作发生烂尾现象,对于粉丝们的咨询,我只有一个答应,这便是业余时间太单薄,我从未主意凭靠自己一个人的力,在个其余业余时间里,在包文章质料以前提下,为社区提供逾多之支撑。在就或多或少达到,我拔取的凡宁缺毋滥:宁可发布周期变长,也未欲把尚未质量的著作分享出来。另一方面,我呢发布了好多开源项目,有些体系属于自自己有私家聊器的代码备份,也有部分品种,比如Apworks、Byteart
Retail、WeText,甚至是我的新博客daxnet.me的源代码项目daxnet-blog,皆以自家之Github
Repo里。说实话我的确没时间把每个体系遭到之底细技术以博客的措施挨个介绍清楚,因而,一般自己基本就了协调相比满足的开源项目时,我还谋面写一篇博客来介绍项目之情节与所祭的技能,同时指导读者直接克隆我之种代码进行参考,或者直接folk(不用太操心许可协议问题,除了Raspkate项目之外,其余绝大部分项目如故MIT或者Apache的许可协议)。总之,不管形式怎么,我镇没屏弃过最初的愿景。

为是由这样的硬挺,我愿意会重新好地协会自己的博客作品,甚至是其它局部原创小说,以重为集中与高速之道啊读者提供再好的攻交流心得,一向以来我都思念过搭建属于自己的博客服务,我呢经过了成千上万尝。早以二零一二年,我动用Word
Press在一个海外站点建立了博客系统,然则后来坐外国服务供应商之由来,网站并未会延续维持下去,之后我哉透过好几差的尝尝,包括采用BlogEngine.NET等开源项目,不过也还没会做好。出于对技术之珍视和追求,那无异破,我算是下定狠心,使用自己所模拟的文化,依托微软的.NET平台,开发并部署了我好的新博客系统:【http://daxnet.me】。

站点效率

首先简要介绍一下时的站点功用吧。右图就是本站的主页效果,我开得死简单,没有就此最多花哨的图形,也从不因此走马灯。明眼人一看即亮这是因ASP.NET
MVC而付出的Web应用程序,使用了Bootstrap。不错,基本答对!需要强调的凡,这个博客站点NoSQL 1以及后端的RESTful服务,全体都是基于ASP.NET
Core完成的,.NET
Core运行时本也1.1.0,运行在Docker容器中。哎,说在说着又到技术上了,功用还无介绍了也。说交效能,近期效益很简单:主页列有了自己好原创要译的备小说,读者可登记用户帐号,注册用户可上评论,也堪以用户管理页面中改自己的昵称。好了,如今效应就这么多,别看效果少,我可前前后后陆陆续续花了2个月之工夫,才得即之样子。当然,我会继续革新是站点,让其的法力转移得更周全。

关联ASP.NET
Core,有没起悬挂起你的技艺胃口也?不用急,接下自己便介绍一下举站点中每组成部分的技术选型,看罢后,或许你会分晓干什么我花费了2独月之业余时间,才整出来那样个大概的玩具。

站点技术介绍

一体化架构

成套网站所接纳的有所基础设备俱全周转于微软云(Windows
Azure)中,使用了一部分托管资源,以及有非托管的Azure VM。大致情状如下:

  • 图表存储服务:由Azure Blob Storage 瑟维斯(Service)托(Stowe)管

  • 数据库系统:由Azure SQL
    Database托管(未启用Geo-Replication,因为尚未钱)

  • 邮件服务:由Azure SendGrid Account托管(Pricing
    Tier为F1,每月可以免费发送25000查封邮件)

  • 应用服务器:基于Azure构建的Ubuntu 16.04.1
    LTS虚拟机,运行了片只Docker容器:blog-web和blog-service,分别托管前端Web站点和后端RESTful服务。后端RESTful
    API服务没有做此外表明与授权,Web站点通过中间子网访问RESTful
    API服务,Docker容器运行于非托管环境中

  • 不止集成系统:Jenkins,基于Azure构建的Windows Server 2012
    R2一律高(Master),和平等宝Ubuntu 16.04.1
    LTS(Slave)。站点的前端和后端都于后世(Ubuntu)中完成编译、打包以及Docker镜像的公布,实现了平等步成功的布形式

  • 代码库:Github

有人会问:为何用了非托管的Azure
VM环境运行应用连串?我哉设想了这问题,理论及称,基于云的系统架构最好采取托管的PaaS服务,这样不仅可得到纯天然的高可用性(包括灾备,比如AWS的跨AZ部署,某些服务领先区域的可用性,以及载重均衡),而且还得获取规范的技术帮助。唯有当在老系统为云迁移的需求,并需要迎合老系统的一定运行条件要求时,才考虑用IaaS服务。即便虚拟机等那个资源是出于Azure负责创设并运行的,在就同样重叠面Azure可以保证虚机的可用性,但虚机内部运转的外程序的状态,以及所下的数据,Azure等说话服务是不许得知的,对这一部分东西的监督为会晤更换得不行麻烦。出于安全考虑,平时云服务供应商是休相会,也不该拿到接近虚机内部的客户程序的运行数据的,使用虚拟机服务所出的程序运行风险,客户要自己负责。这吗不怕是出名的责任并负担原则。

关押起用虚拟机运行应用不是最为依仗谱嘛,然则我也选拔这么使用了。有几乎单由:

  • 干什么无行使Azure Web
    App?一方面Jenkins做自动化部署,直接将编译好之利用推送到Azure Web
    App中接近不是最为顺手,要描写一些PowerShell的代码,不过我的编译系统是Linux,不过本一度发Linux版的PowerShell了,而且Azure
    SDK Command Line
    Interface也暴发Linux版,所以这个理由有点牵强,更客观之解释是:劳资不相会!另一方面,我无以劳动端做证与授权,仅经过子网向外侧提供服务,所以我愿意我之Web
    App也运行在子网内部,然后朝他表露80端口供外界看。这样一来,Azure
    Web
    App又怎布置及自己自己之子网内?这是一个技能问题,我深信不疑肯定生化解方案,不过自啊一贯不太多日跟生命力去细究如何贯彻,自己之率先感应也特是用左右端全体布置在Azure
    Web
    App中,然后打开后端平的证实机制。但这样做而且比方花片额外的时日。好吧,如故那多少个理由:劳资不会晤

  • 为何不行使Azure Container 瑟维斯(Service)?Azure Container
    Service会在你指定的Resource
    Group(资源组)中创建一整套网络部署,包括一些华虚拟机、公网IP、两个负载均衡器等等,我缅怀你得知道自家怎么没有选Azure
    Container Service了,原因虽然是:劳资没钱

理够充足吧?微软Windows
Azure提供的那一个服务还深赞美,我未曾选不是说它们不佳用,而是由于自己的其实状况考虑:

  1. 一些服务之就学成本

  2. 经济资产

  3. 暂行没有必要就99.99999%的胜可用率

  4. 即采纳挂了,苏醒的财力万分有些:数据全不欲还原,托管的SQL
    Database、Blob
    Storage会保证我的数量不丢掉,应用程序復苏为酷简短:重新运行Docker容器就完事儿

OK,从总体架构上看,我之挑选就凡是如此而已,这样的精选当不自然完全正确,但本身觉着至少合适,仅供参考。下边附上本站点的共同体架构图。

NoSQL 2

发作几碰注明:

  1. 其三光VM位于同一个Virtual
    Network的subnet中,每令VM的杜撰网卡上且仿效出单独的Network Security
    Group(NSG),在NSG上设置了Inbound/Outbound
    Endpoints,严俊界定了端口访问的IP地址。三玉VM之间下subnet
    IP地址访问

  2. Windows Server 2012 VM宿主了Jenkins
    Master,以及Seq日志服务。它为公网暴露8080端口和5342端口,分别用于访问Jenkins服务和Seq管理界面

  3. 第一雅Ubuntu VM运行了Jenkins
    Slave,它不往公网表露任何端口,仅于Jenkins
    Master机器暴露22端口,用于Jenkins Slave Agent的推行调度

  4. 亚贵Ubuntu
    VM运行了博客系统的简单只Docker容器:前端应用程序blog-web和后端RESTful
    API服务程序blog-service。web通过子网IP地址访问service,VM仅为公网表露80端口,后台service无法从公网访问

  5. 鲜只Docker容器所运行的行使(blog-web和blog-service)都足以拜托管的Azure
    SQL database、Azure Storage blob和SendGrid Account服务

  6. 满部署的拓扑结构来或无极端合理,比如没有举办负载均衡,没有使用托管的采纳宿主服务(比如Azure
    Web App、Container
    Service等),没有应用Scaleset。因为时未曾必要而且尚未钱

属下去,回到代码上,我往我们介绍部分框架的技巧选型,以及七只ASP.NET
Core可用的开源库项目。

前端

现在此前端技术日新月异,各个Javascript的框架和JSX的技术,使得前端开发变得更加有益急迅,所拿到的用户体验为变得尤其好。例如Angular
JS(包括1跟2点滴个本子)、React +
Redux、Knockout.JS、Backbone等等。在事实上项目遭到,我们吧以了及时个中绝大部分技术,然则,在自家的此博客系统中,我平素不下单页面应用的化解方案,而是继续应用前端Razor+后端C#代码的方法,对啊,这便是ASP.NET
Core
MVC!我从未动用此外MVVM的框架,只是简单地运了Bootstrap和jQuery,对自吧,这样选的原由发生以下八只:

  1. 相持而言对ASP.NET MVC相比较熟练,更易于尽快完成支付任务

  2. 自身站点逻辑不是最为复杂,暂时无必要拔取那么些前端框架

  3. 打算体验一下ASP.NET Core的新特性

本来,为了贯彻部分特定的效果,我要么接纳了一些开源代码和框架,现受我们大致介绍一下。

关于首页的分页实现

首页实现了博客著作的服务端分页,每回仅向服务器请求有限量的数码。分页控件是上下一心写的同仿算法实现的,并沿用了Bootstrap的pager样式,实现了响应式用户体验。分页控件使用了ASP.NET
Core MVC中初的Tag
Helper技术,从算法上冲每页的分寸和总博客数量,对页号举办分处理,使得整个分页效率爆发个分外好的用户体验。

NoSQL 3

有关验证码生成

验证码的转变于藏的ASP.NET应用程序中可知十分容易地实现。经典ASP.NET应用程序基于Full
.NET
Framework,运行于Windows的IIS上,依赖让Windows的图形库,可以好便利地出图片。但是,ASP.NET
Core应用程序则净两样,为了落实领先平台,就不可以利用System.Drawing命名空间下之种(当然你可指定你的ASP.NET
Core应用程序使用net45,可是这么不能够过平台)。在此地自己动用了CoreCompact.System.Drawing那么些库房,可以因此nuget搜索到
。它会靠让Microsoft.Win32.Primitives库,这一个库定义了部分同Drawing相关的数据结构,可是没有供其他图形库的实现。有趣味的读者不妨一试。

关于恢复生机编辑器

没关系好说的,使用了知名的CKEditor作为编辑器,当然,我采用性地启用/禁用了一点意义。

关于博客著作中之代码高亮

采纳了举世有名的AlexGorbatchev的SyntaxHighlighter,知乎也是使的这库房,不过自己用底或者未是风靡版本。

有关恢复中之时空新闻

于各首博客著作尾会来得网友的东山再起内容。那个情节会展示回复时间及当下光阴的干音讯,比如:

NoSQL 4

落得图展现就虽苏醒内容是发布于25天前之。可生成小看了此部分的贯彻,我是应用了一个叫作Humanizer的仓库。那多少个库房很有意思,它能提供部分特别实用的API,比如让其一个英文名词,它可回去复数情势;给它们一个日期,它可以重返一个重复近人类自然语言的抒发。它还有不少旁的幽默的功用,我们可以错过驾驭一下。

关于博客公布的MetaWeblog API

博客系统扶助以Windows Live Writer宣布博客,它经过Shawn魏尔德ermuth提供的魏尔德(Wild)erMinds.MetaWeblog实现了MetaWeblog API。通过Windows
Live Writer可以平素将站点添加到帐号中:

NoSQL 5

大抵前端所运用的有的技及老三着框架就如果上所述。下边来看看后台的局部术选型。

后台

数据库及数据看组件

无独有偶而上所述,新博客系统后台使用Azure SQL Database,也即是托管的SQL
Server关系型数据库。为啥选拔SQL
Server而休拣MongoDB等时兴的NoSQL方案?作为一个博客网站,我并未找到采纳NoSQL的理由,Azure上啊发托管的MongoDB服务,仅管它是托由Bitnami负责运维的。另一方面,就算自己采取了Azure
SQL
Database,但自戊辰曾运用其他第三正的数访问框架,没有行使ORM,包括近来盛行的Dapper。没有选ORM的理,一方面感觉ORM在斯景里仍然极致重,另一方面,截至我举行技术选型时,Entity
Framework
Core无法满足自身之需求,至少她无法从世界模型的角度去辅助多对准大多之投射。这为啥又没拔取Dapper呢?重要由要一如既往:无法满意自己的需要。原生的Dapper类库需要写一些SQL脚本,即使轻量了,但去了针对性代码重构的匡助,Dapper.Contrib增添了一部分复团结之API,但依旧无法满意好之急需。

几乎外来思考,我操好写一个有点框架,既好支撑好定义的简短领域模型,又好支撑基于Lambda的语法、辅助数据库事务、帮助异步API、匡助多体系型的干项目数据库。这几个小框架的代码位于DaxnetBlog.Common.Storage命名空间下,使用了一些不行巧妙的技术,比如,开发者可以用拉姆da表明式来定义查询条件,框架会通过ExpressionVisitor(访问者情势)将兰姆(Lamb)da表达式转换成SQL语句。上边的代码正是这框架的动代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var rowsAffected = await this.storage.ExecuteAsync(async (connection, transaction, cancellationToken) =>
{
    var account = (await this.accountStore.SelectAsync(connection,
        acct => acct.UserName == userName,
        transaction: transaction,
        cancellationToken: cancellationToken)).FirstOrDefault();
 
    if (account == null)
    {
        throw new ServiceException(HttpStatusCode.NotFound, Reason.EntityNotFound, $"未能找到帐号名称为{userName}的用户帐号。");
    }
 
    account.DateLastLogin = DateTime.UtcNow;
    return await this.accountStore.UpdateAsync(account,
        connection,
        acct => acct.UserName == userName,
        new Expression<Func<Account, object>>[] { acct => acct.DateLastLogin },
        transaction, cancellationToken);
});

NoSQL,眼看段代码用于立异指定帐号名称的用户的报到时,代码中尚无穿插SQL语句,而是用兰姆da表达式进行发挥。代码中storage对象指代关系项目数据库的实业,而accountStore则意味着对某种实体(在此处是帐号实体)的蕴藏,有接触像世界让设计受到的Repository的定义。这样的统筹是为着落实职责分开:accountStore不汇合拄让storage(也就是关乎项目数据库类型)的落实。

日志

任前端如故后端,我还使了Serilog作为日志框架,并以日志推送至Seq系统。具体做法我会在另外的博客作品中详尽介绍,在是就是不多介绍了。下图虽是按博客的日记输出,为了省钱,在Docker容器启动时,通过环境变量将日志级别设置也Warning。

NoSQL 6

API文档

不多说,Swagger。具体实现格局自啊会以此外的作品被介绍。

NoSQL 7

缓存

小无以缓存,下一致步会大增。

哼了,整个博客的架和上下端技术大概就介绍这么多,假诺假定深刻技术实施的各一个细节,我眷恋,猜度几单系列著作都说不了事。依旧如本文最开端之上所陈述,博客代码开源,我们可以学习交流。今后我仍然会力争多写有篇来介绍有关技能。

自身还相会延续当搜狐上博客吗?

本来会!乐乎一直是本人跟我们互换的首要性场面,将来为是。可以解,为了为我们提供再多赛品质的“干货”,天涯论坛对博主曹所作作品还会晤有局部限,博客主旨写也会来一对羁绊。作为自身我来说,在博客这种形式下,我说不定应该可以因重多之不二法门来呈现自我之技艺生涯,甚至是协调的有些针对性活面临东西之思考,这可能对旁人的技能发展吧会是一律种植启发,在获我们的报告及死灰复燃后,我啊可以继续增强协调。与这么些有关的情节,我会发布于温馨的博客中,当然,我思,我自己之博客依旧会因为技术类小说为主吧。

即以此新博客展现了自早已于网易宣布之博客(当然就是为了充数,使得主页不示那么干燥,所有图片被或封存天涯论坛的链接)。我打算为这新博客定下三独月的试运营阶段,这一个过程准备考察一下网的运行意况,并统计一下微软Azure云的应用体验,当然最好要紧之凡衡量一下祥和能否支付得打运营的这笔开支。整个试运营阶段自己还会连续为系统进入更多职能。

假设运营失败,也求我们多多原谅,权当是自吧社区多进献了一个开源项目吧。

总结

正文首先演讲了本人对社区贡献的有些事实上情况,并因而引出自身要好都手工成立的按照ASP.NET
Core实现之博客系统;接下介绍了此系统的完好架构和配置,以及内外端的片段技艺选型;最终对大家莫不指出的问题展开了简要解答。立时以比方进来新的如出一辙年了,也赶忙至了和睦MVP
Renew的流年,无论Renew是否中标(二零一八年进献量感觉不是无限强),我论拿继续百折不回为社区多做进献,真正完成“专业、求是、解惑”。

原文地址: http://www.cnblogs.com/daxnet/p/6139317.html

网站地图xml地图