用.net core 写后端—— c++外的另一种选择?

https://blog.csdn.net/kenkao/article/details/71249138

用.net core 写后端—— c++外的另一种选择?

2017年05月06日 10:40:48 独孤残云 阅读数:8283

本文原创版权归 腾讯GAD 171762508 所有,转载请详细标明原创作者及出处,以示尊重!

作者:171762508

原文:http://gad.qq.com/article/detail/7181024

 

版权所有,禁止匿名转载;禁止商业使用;禁止个人使用。

 

一、.net core简介

(1).net是什么

  .net实际是遵守同一个标准(ECMA)的多种不同实现,如.net Framework、Mono、和较新的.net core。C#是.net支持的其中一种语言,理论上任何遵循公共语言规范(CLS)的语言都可以运行在.net框架上。

 

(2)什么是.net core

  .net core 是一个通用开发平台,由 Microsoft 和Github共同维护。 它是跨平台的,支持 Windows、macOS 和 Linux,并且可用于设备、云和嵌入式/IoT 方案。

 

(3)特点:自动内存管理、类型安全、委托和 lambda、泛型、异步编程、LINQ、使用其他非托管代码如C/C++。

 

(4).net core组成部分

  .net Runtime:即coreCLR。与.net Framework的CLR没有太大区别,进程管理,GC,JIT(RyuJIT 编译器)也都是一样的。只是针对服务器系统做了相应优化。CLR和coreCLR进行同步更新,未来coreCLR将一统天下;

  Framework Libraries:即coreFX。包括集合类,文件系统处理类,XML处理类,异步Task类等;

  SDK工具和编译器:即CLI工具和Roslyn编译器。可以通过.net core SDK获取;

  .net app host:用来选取并执行对应运行时,提供组件载入原则,以及启动.netcore应用程序。SDK也是通过相同程序启动。

 

(5)目前支持运行环境

 

用.net core 写后端—— c++外的另一种选择?

 

  目前不支持 ARM64 和 ARM32。

  https://github.com/dotnet/core/blob/master/roadmap.md

 

二、.net core与.net Framework, mono区别

(1).netFramework 的主要差异在于:

  应用模型:.netcore不支持所有.net Framework 应用模型,说白了,就是一切与windows UI相关的如WPF,sliverlight都不支持;

  API:.net core和.net Framework很多API相同,但也有少部分需要修改才能移植到.net core;

  子系统:.netcore实现.net Framework中子系统的子级,目的是实现更简单的实现和编程模型;

  平台:.netFramework只支持 Windows,而net core跨平台,支持macOS和Linux;

  开源:.netcore属于开放源,而.net Framework 的只读子集属于开放源。

(2)与 Mono 的主要差异在于

  应用模型:Mono 通过 Xamarin 产品支持 .net Framework 应用模型(例如,Windows Forms)和其他应用模型(例如,Xamarin.iOS)的子集。而 .net core 不支持这些内容;

  API:Mono 使用相同程序集名称和组成要素支持 .net Framework API 的大型子集;

  平台:Mono 支持很多平台和 CPU;

  开源:Mono 和 .net core都使用 MIT 许可证,金主都是.net Foundation;

  焦点: Mono 的战场是移动平台,而.net core剑指云平台。

  (整理自 https://docs.microsoft.com/zh-cn/dotnet/articles/core/)

 

三、没有免费的午餐,微软大有深意

(1)收敛自己的力量

  自从微软收购Xamarin之后,面临着同时维护3套基础库和平台兼容,一个事情要做3遍还是挺痛苦的,特别是在微软这样的大公司里。对开发者来说,不一致的API导致需要不同类库实现,代码无法得到复用。

  因此,充分运用 .net 平台十几年积累的设计理念,汲取过去数十年各种编程语言和开发模型中的精华,重新构建一个更高性能、与特定操作系统解耦、完全模块化、可独立自包含的开发平台。同时可以结合微软在不同操作系统上完善的编译、测试、团队合作开发工具,是未来的重要产品。

 

用.net core 写后端—— c++外的另一种选择?

 

  如上面那张随处可见的所示,中间紫色的.net标准库部分,原来是3种.net平台都有各自的实现,将来会被.net core统一。 

  但就目前来说,.net core的类库还不完善,许多.net framework第三方开发者开始给.net core移植,对很多有心人来说,利用得好是一个商机。

  对web开发者而言,可以跑在linux上的高性能asp.net core + Kestrel很有吸引力。性能对比可以参见这里。

 

(2)发力云业务

  为什么说.net core更适合容器,甚至成为微软发展的一大目标

  微软在移动领域和设备领域的接连失利,使前CEO和史蒂夫·鲍尔默和其继任者萨蒂亚·纳德拉押宝于云业务。事实上,连续几个季度的财报显示,Azure收入大幅增长(2016Q4 102%,2017Q1 116%),给整体业务不断下滑的微软注入了新的动力。

  然而,.net framework深度绑定在windows平台上,天然很难与以linux为基础的容器兼容。

  以Docker为代表的容器技术,可以批量地在生产环境中部署,为任何应用创建一个轻量级的、可移植的、自给自足的运行环境。具体可参考 coolshell.cn的系列文章。

  为了聚集更多的开发者,构建一个更加完整的生态圈,开发跨平台.net core的应用运行平台,就成为了其发展中不可获取的一环。

 

四、相比C++,C#正在快速地发展

(1)从语言规范出发

  语言规范是一门编程语言语法和用法的权威来源,是学术界、业界多方斡旋的结晶,不断推动着语言的发展。

  C++脱胎于C,在各种纷争中在1998年出了第一个正式标准,直到2015年,18年时间才经历了4个标准版本。

 

用.net core 写后端—— c++外的另一种选择?

(图片来自zh.wikipedia.org)

 

  在标准之下,Turbo C++,BorlandC++, Microsoft C++, Watcom C++, Symantec C++,intel C++以及linux下的霸主g++,clang百家争鸣,还爆发过所谓的语言“圣战”,可谓一路坎坷。

  而C#由微软主导推动,发展相对比较顺利,ECMA标准到2006年共经历了4版,近年的更新主要以微软版本为主。

 

用.net core 写后端—— c++外的另一种选择?

(图片来自zh.wikipedia.org)

 

  虽然,标准版本频繁,不一定代表语言发展就越迅速,但反观C++,多少团队还在头疼升级/更换编译器,从发展时间和标准制定的频次, C#和.net却表现得更加顺利和稳健。

 

(2)拥抱开源

  但是微软也不是一家独大,mono一度是其最大的竞争对手(其主要贡献团队xamarin现在已经被微软收购),依赖于开源社区,Mono几乎是与微软齐头并进,并在跨移动平台取得了绝对的优势(Unity+Xamarin)。

 

用.net core 写后端—— c++外的另一种选择?

 

  自从2014年宣布开源.net core(包含C#在内)之后,微软2016年9月才正式发布1.0版本,节奏比较慢。

  但不可否认的是,开源策略促进了.net core的迅速发展,越来越多的人贡献了代码,如下是corefx基础库的github截图(截至2016.12.5)

 

用.net core 写后端—— c++外的另一种选择?

 

  据官方消息,约40%的性能增长来自于开源社区。总体来看,.net core的发展还是非常迅猛的。

 

五、不得不说的性能

  下面是http://benchmarksgame.alioth.debian.org/提供的公开的测评结果,具体程序功能、代码、指标可在网站上查阅。

(1)以两个典型计算任务“spectral-norm”,“计算π”为例,C++, .net core, mono和C++性能对比:

  .net core VS c++

 

用.net core 写后端—— c++外的另一种选择?

 

  .net core VS mono

 

用.net core 写后端—— c++外的另一种选择?

 

(2)多个语言的比较

  13个标准测试程序,取每种程序最快的作为基数1,评估不同语言的时间和CPU使用情况:

 

用.net core 写后端—— c++外的另一种选择?

用.net core 写后端—— c++外的另一种选择?

 

  从前面几个图可以看到,c(gcc)语言在执行时间和实际CPU负载上远远优于其他语言,c++(g++)紧随其后,Ada/Fortran/Rust/JAVA的表现尚可,.net core与Go一样属于第一、二梯队之间,.net core略逊,但差距不是很大。

  对于.net core来说,其与C++的性能差距在1.5-2倍之间。上下四分位数差(盒子高度)较小,表明其对大部分计算任务来说比较稳定。相比之下,mono性能差了许多,对不同计算任务差异较大,但比垫底的node.js略胜一些。

 

六、开发效率,算一笔账

(1)使用.net core,效率提高可能体现在

  许多常用基础库,如协程、线程、内存池、锁等不需要单独维护

  受前端和后端语言一致,重用性高,对游戏来说,非常有利于反外挂

  调试成本降低,大部分游戏团队都是windows开发,linux编译和调试

  前后台沟通成本降低,全栈工程师不用在来回切换语言中烦恼

  降低新人学习成本

 

(2)人力成本VS机器成本?

  以公开的资料为例,网易的“绝代双骄”手游前端采用Unity,后端采用.net core进行开发,据说能降低30%的人员成本,提高20%的开发速度。如下:

 

用.net core 写后端—— c++外的另一种选择?

 

  数据说话,可以简单算这样的一笔账:假设现有两个团队,后端分别使用C++和C# .net core,  费用估计如下

  生产环境参考AWS的M4.2xlarge (2.3 GHz Intel Xeon® E5-2686 v4, 8G+32G,带宽费用不计)

  一个月的成本大概是2320RMB,假设自建机房能节约50%的费用,则为1160RMB/月,

  假设使用C#,服务器数量增加50%(根据上文性能估计)

  人力成本按人25W年薪(网易应届生平均成本)计算

 

用.net core 写后端—— c++外的另一种选择?

 

  可以看出,每月成本C++远高于C#,约是其1.7倍。

  考虑到手游开发的实际情况,我们假设研发周期为6个月,版本运营周期2年,运营期投入1/3人力,c++团队成本约为861W, C#团队成本为825W。成本上C#依然是比较划算。

 

用.net core 写后端—— c++外的另一种选择?

 

  同时,我们计算中还没有c#带来的20%开发效率的提升,以及摩尔定律带来的机器成本的降低,也没有考虑人员增加带来的沟通成本,以及雇用更高水平团队的薪资水平。

  总体来说,c#还是比较“省钱”的。

 

七、回归到现实:.netcore能给开发带来什么实际意义?

(1)反外挂是一个非常合适的场景,特别是前端模拟-后端校验的游戏项目,不用在语言移植、模型校验、缓慢的mono虚拟机之间纠结了;

(2)丰富的通用组件和标准库可以减少大量造车轮的时间,前提是要杜绝性能“洁癖”;

(3)不用纠结判空指针、使用class还是struct、各种内存分配和回收问题、多字节字符串编码;

(4)在处理IO和多线程方面更有信心一些,拥抱多核和异构计算;

(5)大前端的趋势下,未来是微服务、轻应用、H5游戏的世界。必定更青睐包袱更轻的、移植性强、跨平台的开发思想和工具。在高性能、高吞吐量、低延迟方面,.net core开始崭露头角,如下图所示,asp.net core的性能已经远远甩开node.js和asp.net 4。

 

用.net core 写后端—— c++外的另一种选择?

 

  图片来源:https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/

 

八、结语

  总的来说,不管是.net也好,C#也罢,并不是一个新鲜的事物。.net core严格来说也算不上具备伟大创新性或者突破力的“面壁者”。

  但对于许多C++er来说,能带来有关语言发展、工具链、模式、云计算等方面的思考,或者说,提供了关于未来的其中一种可能,这已值得我们的关注了。

在ASP.NET Core MVC中,为了在后端统一处理重定向并检查用户的会话,特别是当登录信息过期时,可以按照以下步骤进行: 1. **中间件(Middleware)处理**: - 创建一个自定义的`AuthorizeFilter`中间件,这个中间件在每个请求到达控制器前先检查用户的身份验证状态。 ```csharp public class CustomAuthorizeMiddleware { private readonly RequestDelegate _next; private readonly HttpContextAccessor _httpContextAccessor; public CustomAuthorizeMiddleware(RequestDelegate next, HttpContextAccessor httpContextAccessor) { _next = next; _httpContextAccessor = httpContextAccessor; } public async Task Invoke(HttpContext context) { var user = await AuthenticationManager.GetUserAsync(context.User); if (user != null && !user.IsAuthenticated || IsSessionExpired(user)) { // Session过期或未授权,重定向到登录页面 await RedirectToLogin(context); } else { await _next(context); } } private bool IsSessionExpired(User user) // 自定义函数判断session是否过期 { // ... 检查用户session的有效性 } private async Task RedirectToLogin(HttpContext context) { // 清除可能存在的跨站请求伪造令牌(CSRF) context.Response.GetOwinContext().Authentication.SignOut(context.Request.Scheme); // 设置重定向到登录页面的URL var loginUrl = "/Account/Login"; context.Response.Redirect(loginUrl, true); // 使用Response.Redirect强制重定向 } } ``` 2. **启用中间件**: - 在Startup.cs文件中,在`ConfigureServices`方法中添加该中间件。 ```csharp services.AddMvc(options => { options.Filters.Add(typeof(CustomAuthorizeMiddleware)); }); ``` 3. **登录页面处理**: - 当用户完成登录后,确保他们会被重定向回之前试图访问的页面,而不是总是首页。这通常通过`AuthorizationHandler`或`CookieAuthenticationOptions`来配置。 现在,每次请求都会首先经过这个中间件,如果用户会话无效,就会被引导至登录页面。登录后,系统会根据之前的请求信息进行适当的重定向。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值