微软的跨平台战略
微软在过去的一年多中时间中发生了令整个 IT 行业感到惊叹的变化。这一切始于 Ballmer 的退位和 Nadella 的决心,更始于早已在微软各个基层部门蠢蠢欲动的二次创业。
以开发工具团队来说,他们很早就开源了 ASP.NET MVC 开发框架,并从那以后连续开源了后续全部新的开发框架,例如 Web API 和 SignalR,例如 OWIN 组件 Katana,并且和开源社区如 Mono 保持着良好的互动。
而其他团队,例如 Hyper-V,则同样与 Linux 内核社区有积极互动。
图一:微软 CEO Nadella 先生表示 Microsoft Loves Linux
因此当 Nadella 先生在2014年10月表态 Microsoft Loves Linux 时,长期的微软观察家应该并不会表现出太多惊讶,因为这真的只是个水到渠成的过程。
以 ASP.NET 为例,业界的公司早已或多或少的使用了 Linux 或者基于 Linux 平台的解决方案。因此如果微软提供 ASP.NET 跨平台开发和部署支持,那么此前完全采用 Linux 的公司可以直接在现有平台上部署网站,从而节约购买 Windows 授权的费用。混合使用 Linux 和 Windows 的公司则有机会重新调整平台间的相对规模,达成成本控制目标。
除去公司内部计算平台,在多种主流公有云平台上,采用 Linux 虚拟机为主的解决方案也非常普遍,成本低廉,同时适合各种级别的公司和个人来部署网站应用。
因此只要微软 ASP.NET 技术能够支持跨平台开发部署,那么就能立即进入一个全新的市场领域。
.NET Core 5 和 ASP.NET 5
为了达成跨平台目标,微软开发工具部门在发布了 .NET 4.5 和 ASP.NET 4.5 之后花了相当长的时间来构架下一代网站开发技术。在这个超过两年的漫长过程中,以下几个目标逐渐清晰,
- 采用新思路来重新设计框架基础。这方面向 node.js 学习不少。
- 采用全新技术,主要是 Roslyn。
- 脱离 .NET Framework 的束缚实现跨平台。
结果就是我们现在已经看到的 ASP.NET 5。
图二:ASP.NET 5
为了使得 ASP.NET 5 运行在新平台上,.NET 团队也借此机会开发了全新的运行环境,也就是 .NET Core 5。
.NET Core 5 完全开源,整个开发过程和全部代码都可以在 GitHub 上面找到。它的 API 参考资料可以在下面找到,
https://dotnet.github.io/api/index.html
一个明显的变化是很多我们熟悉的 .NET Framework 类型被删除了,例如 System.Security.Cryptography 下面的一些类型,System.Net 下面的 UdpClient 类型和 Socket 类型的同步方法。
在 VS 2015 中新建一个 .NET Core 函数库工程的时候,也有很大变化。首先就是工程类型变成了 .xproj,依赖项管理方式改为通过 project.json 文件指定,而编译结果也换成了 NuGet 包。
ASP.NET 5 方面同样如此,完全开源之外也带来了很大的变化。System.Web 这个古老的部分和 WebForms 一并被删除。今后我们就不再通过 HttpContext 类型访问运行时的各种信息,也不再通过 web.config 文件中的 <system.web> 标签来管理配置项目了。MVC/Web API/SignalR 三个原本独立的框架得以统一为一个开发模型(例如Web API 中的 ApiController 类型现在就和 MVC 的 Controller 类型合二为一)。
在最终应用的部署上,假如 ASP.NET 应用部署在 IIS 和 Windows 上,那么需要额外安装 HttpPlatformHandler。在 Linux 平台上,则首推 nginx 和 Kestrel 搭配的部署方式。
图三:微软的应用迁移路径
由此我们可以看出微软提供的迁移方式有一个从 ASP.NET 4 到 ASP.NET 5 的迁移步骤。这一个看似简单的步骤其实并不简单。代码的迁移和修改暂时还需要很多手工步骤,部署方式的变化要求 Linux 和 nginx 知识的学习,而之前开发者学习多年的 Windows 和 IIS 知识似乎都过时了。
有没有更加简单的方式让 ASP.NET 应用登陆 Linux 平台呢?
Mono 和 Jexus 网站服务器
Mono 这个开源项目其实一直伴随着 .NET Framework 成长。Miguel de Icaza 先生早年一直领导着 Gnome 这个开源桌面系统的开发。在2000年微软公布了 C# 语言和 .NET Framework 之后,他非常感兴趣并且希望能把这些新技术带到 Linux 平台,于是一手建立了 Mono 这个项目和社区。现在 Mono 的稳定版本是 4.2.1,得到了 Xamarin 和微软两家公司的共同支持。
和 .NET Core 5 另起炉灶相比,Mono 处处都保持着和 .NET Framework 的兼容性。在微软去年11月完全基于 MIT 协议开放 .NET Framework 参考代码后,Mono 立即开始集成微软的代码(迄今完成超过600多个类型),非常明显的改善了兼容性。不过 Mono 保持了自己独立开发的 CLR 实现和 C# 编译器,有自己的 AOT 运行环境和 C# Shell。在应用程序框架方面,Mono 提供 WinForms 和 WebForms 支持,也包含了微软早已开源的 MVC 5、Web API 2 和 SignalR 2。
在 Mono 这个稳固的基础之上,中国四川的一位微软 C# MVP 刘冰历时多年设计了一款免费的网站服务器,取名 Jexus,最新稳定版本是5.8.0。比较有意思的是,它基本是用 C# 开发,直接通过 Linux 内核的 epoll 机制来处理网站请求,而不是采用 libuv 之类的封装库,所以提供了高性能保证。作为一款跨平台软件,它支持各种主流 Linux 发布版本和 FreeBSD。
从架构等技术特点来看,Jexus 也可以媲美 IIS 等商用服务器。比如它提供了多站点支持,拥有应用程序池来调度管理工作进程,具有良好的稳定性和容错能力。又比如它支持 HTTPS 和 WebSockets,支持 FastCGI 协议和 OWIN 标准。它不仅可以作为一款应用服务器,来托管各种 ASP.NET 4 应用(WebForms、MVC、Web API、SignalR),同样也可以作为一般服务器使用,包含 URL 重写、反向代理、压缩传输等基础功能和 SQL 注入预防等多项内置安全防护。
图四:Mono 和 Jexus 提供的简便迁移路径
因为 Jexus 提供了如果便利的迁移方法,所以国内外一些网站已经采用它来作为服务器。在 Jexus 官方网站上有相关的案例可供参考。
视频二:Visual Studio 2013 导出 MVC 5 网站
Jexus Manager
为了进一步简化 Jexus 的管理,方便熟悉 IIS 的开发者迁移,我在2014-2015这段时间开发了一个可视化的管理工具,名叫 Jexus Manager。
图五:Jexus Manager 用户界面
这是一个可以跨平台运行的程序,支持 Jexus,IIS 和 IIS Express 三种服务器的管理,操作方式完全和微软的 IIS Manager 一致。
从技术细节来看,它也和微软 IIS 高度相似,比如提供了 Microsoft.Web.Administration 和 Microsoft.Web.Management 两个 API 接口,实现配置文件的读写和用户界面的扩展。
Jexus 的未来蓝图
在未来的版本中,Jexus 服务器可能会加入下面的功能:
- 完美支持 web.config 中的 <system.webServer>
- 提供 Microsoft.Web.Administration API 给本机其他程序
- 提供 appcmd 命令行管理工具以达到本机和远程管理
- 完整的 ASP.NET 5 支持!
- 提供更多配置选项
- 提供基于 REST 的远程管理 API
- 提供网页版的管理工具
- 可靠的商业技术支持服务
而 Jexus Manager 管理工具则会在2016年分阶段完全开源。
参考
- Jexus 官方网站 http://jexus.org
- Jexus 英文资料 https://jexus.codeplex.com