Web开发最佳实践(构建真实Azure云应用)

分享到:
更新时间:2015-11-18 14:06:05
 

Web开发最佳实践(构建真实Azure云应用)

 


前三种模式为设立一个敏捷开发过程; 其余的都是关于架构和代码。 接下来是web开发的最佳实践集合:

    无状态的Web服务器后面的智能负载均衡。
    防止会话状态 (如果你不能防止它,那就使用分布式缓存而不是数据库)。
    使用CDN到边缘缓存静态文件资源(图片,脚本)。
    使用.NET 4.5的异步支持 ,以避免阻塞调用。

这些做法适用于所有网络的发展,不仅为云应用,但他们的云应用尤其重要。 他们共同努力,帮助您做出的云环境提供了高度灵活缩放的最佳利用。 如果你不遵循这些做法,你会碰到的限制,当您尝试扩展您的应用程序。
后面的智能负载平衡器无状态的Web层

无状态Web层意味着你不存储任何应用程序数据在Web服务器内存或文件系统。 保持你的Web层的无状态,您可以都提供了更好的客户体验,并节省资金:

    如果Web层是无状态的,它坐在后面的负载平衡器,您可以快速的变化,应用流量通过动态添加或删除服务器的响应。 在云环境中,您只需支付服务器资源,只要你实际使用它们,这种能力应对需求的变化可以转化为巨大的节省。
    无状态的web层架构是非常简单的向外扩展应用程序。 这也使您更快速地扩展需求做出回应,并花更少的钱在这个过程中开发和测试。
    云服务器,就像在本地服务器上,需要进行修补并重新启动偶尔; 如果Web层是无状态,重新路由流量,当一台服务器出现故障暂时不会导致错误或意外行为。

大多数现实世界的应用程序都需要存储状态,网络会议; 这里的要点是不要将其存储在Web服务器上。 您可以通过其他方式,如饼干或缩小的过程在服务器端ASP.NET会话状态的使用缓存提供了客户端存储状态。 您可以在存储文件的Windows Azure的Blob存储 ,而不是本地文件系统。

由于它是多么容易扩展在Windows Azure网站的应用程序,如果你的Web层是无状态的一个例子, 看规模选项卡中的管理门户Windows Azure的网站:

比例选项卡

如果您要添加的Web服务器,您可以在实例计数滑块只需拖动到右边。 将它设置为5,然后点击保存,并在几秒钟内你必须在Windows Azure中5 Web服务器处理你的网站的访问量。

五个实例

你可以很容易地设置实例数下降到3或回落至1。当您缩减,就立即开始存钱,因为Windows Azure的收费标准由每分钟,而不是按小时。

你也可以告诉Windows Azure中自动增加或减少基于CPU使用率Web服务器的数量。 在下面的例子中,当CPU使用率在60%以下,web服务器的数量会减少到最低限度的2,并且如果CPU使用率在80%以上,web服务器的数量将增加至最大4。

规模CPU使用率

或者,如果你知道你的网站不仅会在工作时间忙? 你可以告诉Windows Azure中,以在白天运行多个服务器,减少到一台服务器的夜晚,晚上,和周末。 下面一系列的屏幕截图显示了如何建立网站运行在工作时间在下班时间一台服务器和4台服务器,从上午8点到下午5点。

规模按计划

设置计划时间

白天时间表

周日的夜间时间表

周末时间表

当然,所有这些都可以在脚本中以及在门户来完成。

您的应用程序进行扩展的能力是在Windows Azure中几乎是无限的,只要你避免阻碍动态添加或删除服务器上的虚拟机,通过保持Web层的无状态。
避免会话状态

这通常是不实际的现实世界的云应用程序,可避免储存某种形式的国家的用户会话,但比其他一些方法影响的性能和可扩展性等等。 如果您有存储状态,最好的办法是保持状态的量小,并将其存储在cookie中。 如果这是不可行的,下一个最好的解决方案是使用ASP.NET会话状态与提供商分布,内存中的缓存 。 从性能和可扩展性的角度来看,最坏的解决方案是使用数据库备份会话状态提供者。
使用CDN缓存静态文件的资产

CDN的全称是内容分发网络。 您提供的静态文件的资产,如图像和脚本文件到一个CDN提供商,并提供缓存世界各地的数据中心的这些文件,使地方的人访问您的应用程序,他们得到了缓存的资产相对快速的响应和低延迟。 这加速了网站的整体加载时间并减少您的Web服务器的负载。 CDN的是特别重要的,如果你已经达到广泛分布地域的观众。

Windows Azure中有一个CDN,你可以使用其他的CDN在运行于Windows Azure的或虚拟主机环境的应用程序。
使用.NET 4.5的异步支持,以避免阻塞调用

.NET 4.5增强以使其更加简单异步处理任务C#和VB编程语言。 异步编程的好处不只是为并行处理的情况下,当你想揭开序幕多个Web服务的同时调用,如。 这也使您的Web服务器高负荷条件下进行更有效和可靠。 Web服务器仅具有可用线程的数量有限,并且当所有的线程都在使用中高负荷条件下,传入请求必须等待,直到线程释放。 如果您的应用程序代码不处理像数据库查询和Web服务任务异步调用,多线程不必要地绑在服务器等待I / O响应。 这限制流量的服务器可以处理高负荷条件下的量。 与异步编程,正在等待的web服务或数据库线程返回数据被释放,直到被接收的数据的处理新的请求。 在繁忙的网络服务器,数百个请求或数千然后可以及时处理,否则在等待线程被释放。

正如前面看到的,它容易降低Web服务器处理您的网站,因为它是增加他们的数目。 因此,如果一台服务器可以实现更大的吞吐量,你并不需要尽可能多的人因为你对于给定的流量比你,否则将需要更少的服务器上,可以降低您的成本。

支持在.NET 4.5异步编程模型包含在ASP.NET 4.5 Web窗体,MVC和Web API; 在实体框架6,以及在Windows Azure的存储API。
在ASP.NET 4.5异步支持

在ASP.NET 4.5中,异步编程的支持已经被添加不仅仅是语言,但也给MVC,Web窗体和Web API框架。 例如,一个ASP.NET MVC控制器的操作方法,从一个Web请求接收数据,并将数据传递到一个视图,然后创建HTML发送到浏览器。 通常的操作方法需要得到以显示它在网页中或保存在网页中输入的数据从数据库或Web服务数据。 在这些情况下,很容易使操作方法异步:而不是返回一个 ActionResult对象,返回任务<的ActionResult>和标记方法async关键字。 里面的方法,当一行代码拉开序幕,涉及等待时间的操作,你用的await关键字标记它。

下面是调用库方法,数据库查询的简单操作方法:

 公众的ActionResult指数()
 {
    字符串的currentUser = User.Identity.Name;
     VAR的结果= fixItRepository.FindOpenTasksByOwner(的currentUser);

    返回查看(结果);
 }

这里是处理数据库调用异步同样的方法:

 上市  异步任务<  的ActionResult   >  指数()
 {
    字符串的currentUser = User.Identity.Name;
     VAR的结果=  等待   fixItRepository.FindOpenTasksByOwner  异步   (当前用户);

    返回查看(结果);
 }

在幕后编译器生成相应的异步代码。 当应用程序进行调用FindTaskByIdAsync使得FindTask请求,然后开卷的工作线程,并使其可用于处理其他请求。 当FindTask请求完成后,线程将重新启动,继续处理自带的调用之后的代码。 在当间临时FindTask请求发起时,返回的数据,你必须提供一个线程来执行,否则将被捆绑起来等待响应有益的工作。

有一些开销异步代码,但低负荷条件下,即开销是可以忽略的,而高负荷条件下你能够处理,否则将被举起等待可用线程的请求。

它已经可以做这样的异步编程,因为ASP.NET 1.1,但它是很难写,容易出错,而且难以调试。 现在,我们已经简化了编码它在ASP.NET 4.5中,我们没有理由不再做下去了。
在实体框架6异步支持

正如在4.5异步支持的一部分,我们发布异步支持Web服务调用,插座和文件系统I / O,但最常见的模式的Web应用程序是打一个数据库,我们的数据库不支持异步。 现在实体框架6增加了对数据库的访问异步支持。

在实体框架6引起一个查询或命令的所有方法被发送到数据库具有异步版本。 这里的例子显示了查找方法的异步版本。

 公共异步任务<FixItTask> FindTaskByIdAsync(INT ID)
 {
     FixItTask fixItTask = NULL;
    秒表的时间跨度= Stopwatch.StartNew();

    尝试
     {
         fixItTask =  等待   db.FixItTasks。   FindAsync   (ID);
       
         timespan.Stop();
         log.TraceApi(“SQL数据库”,“FixItTaskRepository.FindTaskByIdAsync”,timespan.Elapsed,“ID = {0}”,身份证);
     }
    赶上(例外五)
     {
         log.Error(即,ID“在FixItTaskRepository.FindTaskByIdAsynx(ID = {0})错误”);
     }

    返回fixItTask;
 }

而这种异步支持的工作不只是插入,删除,更新,和简单的发现,它也可以与LINQ查询:

 公共异步任务<列表<FixItTask >> FindOpenTasksByOwnerAsync(用户名字符串)
 {
    秒表的时间跨度= Stopwatch.StartNew();

    尝试
     {
         VAR的结果=  等待   db.FixItTasks
             。凡(T => t.Owner ==用户名)
             。凡(T => t.IsDone ==假)
             .OrderByDescending(T => t.FixItTaskId)。   ToListAsync   ();

         timespan.Stop();
         log.TraceApi(“SQL数据库”,“FixItTaskRepository.FindTasksByOwnerAsync”,timespan.Elapsed,“用户名= {0}”,用户名);

        返回结果;
     }
    赶上(例外五)
     {
         log.Error(即,用户名“中FixItTaskRepository.FindTasksByOwnerAsync(用户名= {0})错误”);
        返回null;
     }
 }

有一个Async版本的ToList方法,因为在此代码这导致一个查询被发送到数据库的方法。 在Where和OrderByDescending方法只配置查询,而ToListAsync方法执行查询并存储在响应result变量。
摘要
除此之外您还可以实现任何网页的编程框架和任何云环境的web开发最佳实践,但我们在ASP.NET和Windows Azure工具,以方便。 如果你遵循这些模式,您可以轻松地扩展了您的Web层,你会减少你的开支,因为每个服务器将能够处理更多流量。想了解更多请登入北大青鸟官网查看


 


        点击拨打北大青鸟电话  点击拨打北大青鸟电话  点击北大青鸟咨询师交谈

上一篇:关于排错:专注思考,细心观察,步步为营[ 11-18 ]下一篇:没有了!
相关信息
没有相关内容
©Copyright2015 - 2016 , All Rights Reserved
版权所有2015-2016 北大青鸟APTECH( 北京佳音旗舰 ) 授权培训中心
地址:北京西城区北礼士路100号( 阜成门地铁旁)