「DevOps系列]为什么我们使用Terraform 而不使用Puppet, Ansible
本篇文章是深入理解Terraform系列的第一部分。在介绍文章中,我们讨论了为什么每家互联网软件公司都应该使用基础设施即代码(IAC)。那么本篇,我们打算讨论下为什么我们选择Terraform 作为我们的IAC 工具。
如果你在网上搜索“instrastructure-as-code”,很容易看到很多受欢迎的工具:
筛选出它们中你应该使用哪个不是很容易。所有这些上述工具都可以用于基础设施即代码。它们都是开源的,背靠庞大的贡献者社区,可以很好配合各种不同的云服务商。它们都提供商业支持,提供良好的文档——在官方文档和社区资源方面(比如博客文章和StackOverflow问答)。
本篇文章,我们会分成几个特定原因来解释为什么我们会选择Terraform作为IAC工具。与所有技术决策一样,这是一个权衡和优先级的问题,虽然您的特定优先级可能与我们的不同,但我们希望分享我们的思维过程将帮助您做出自己的决定。以下是我们考虑的主要权衡因素:
Chef, Puppet, Ansible, and SaltStack 都是配置管理工具,这意味着它们设计初衷都是在现有的服务器上安装和管理软件。CloudFormation 和 Terraform 是配置(provisioning)工具,这意味这它们的设计初衷是配置服务器本身的(以及基础设施的其他部分,比如负载均衡器,数据库,网络配置等),将配置这些服务器的工作留给其他工具。这两类工具互相不排斥的。因为大多数配置管理工具可以在某种程度上多一些配置工作而大多数配置工具也可以在某种程度上做配置管理的工作。但是聚焦于配置管理或者配置意味着,这些工具对于特定类型的任务会更加合适。
想Chef,Puppt,Ansible 这样的配置管理工具默认针对一种可变的基础设施范例。比如,如果你告诉Chef 安装一个新版本的OpenSSL,它就会在你现有的服务器上运行软件更新并且就地生效。随着时间推移,你会更新的更多,每台服务器都会构建一个唯一的修改 历史 。这通常会导致称为配置漂移或者误差的现象,其中每个服务器与所有其他服务器略有不同,导致难以诊断且几乎不可能再现的细微配置错误。
如果你正在使用像Terraform这样的配置工具来部署由Docker 或者 Packer创建的镜像,那么每次"修改"事实上都是一次新服务器的部署(就像是函数式编程中每次变量的修改事实上会返回新的变量)。比如,当我们部署一个新版本的OpenSSL,你会用装有新版本OpenSSL的Packer或者Docker来创建镜像,然后在整组新服务器中部署那个镜像,同时卸载老的镜像。这种方法减少了配置偏差问题的可能性,使得了解服务器上运行了哪些软件变得更加容易,同时可以让你任何时候都可以轻松部署任何版本的软件。当然,也可以强制配置管理工具来做不可变部署。但是对这些工具来说,这不是惯用的方式。不管怎样,使用配置工具都是一种更加自然的方式。
Chef和Ansible鼓励一种程序风格,您可以编写代码,逐步指定如何实现预期状态。 Terraform,CloudFormation,SaltStack和Puppet都鼓励更具说明性的风格,您可以编写指定所需最终状态的代码,IAC工具本身负责确定如何实现该状态。
例如,假设您要部署10台服务器(AWS术语中的“EC2 Instances”)来运行应用程序的v1版本。以下是使用过程方法执行此操作的Ansible模板的简化示例:
表面上看,这两种方法可能看起来相似,当您最初使用Ansible或Terraform执行它们时,它们将产生类似的结果。有趣的是,当您想要进行更改时会发生什么。
例如,假设流量增加,并且您希望将服务器数量增加到15。使用Ansible,您之前编写的过程代码就没法使用了;如果您刚刚将服务器数量更新为15并重新启动该代码,那么它将部署15台新服务器,总共25台服务器!因此,您必须了解已部署的内容并编写一个全新的过程脚本来添加5台新服务器:
如果你执行了这个模板,Terraform会意识到它已经创建了10个服务器,因此它需要做的只是创建5个新服务器。实际上,在运行此模板之前,您可以使用Terraform的 plan 命令来预览它将进行的更改:
显然,上述例子是简化的。 Ansible允许您在部署新的EC2实例之前使用标签来搜索现有的EC2实例(例如,使用instance_tags和count_tag参数),但是必须根据每个资源的情况为Ansible管理的每个资源手动找出这种逻辑。 过去的 历史 ,可能会令人惊讶地复杂化(例如,不仅通过标签,还可以通过图像版本,可用区域等查找现有实例)。 这突出了程序IAC工具的两个主要问题:
默认情况下,Chef,Puppet和SaltStack都要求您运行主服务器以存储基础设施的状态并分发更新。 每次要更新基础设施中的某些内容时,都使用客户端(例如,命令行工具)向主服务器发出新命令,主服务器将更新推送到所有其他服务器或那些服务器定期从主服务器中提取最新的更新。
主服务器提供了一些优点。 首先,它是一个单一的中心位置,您可以在其中查看和管理基础设施的状态。 许多配置管理工具甚至为主服务器提供Web界面(例如,Chef Console,Puppet Enterprise Console),以便更容易查看正在发生的事情。 其次,一些主服务器可以在后台连续运行,并强制执行您的配置。 这样,如果有人在服务器上进行手动更改,主服务器可以还原该更改以防止配置偏移。
但是,必须运行主服务器有一些严重的缺点:
Chef,Puppet和SaltStack对无主模式有不同程度的支持,您只需在每个服务器上运行代理软件,通常在一定周期内(例如,每5分钟运行一次的cron作业),并使用它从版本控制(而不是从主服务器)下拉最新更新。 这显着减少了变动的次数,但是,如下一节所述,这仍然留下了许多未答复的问题,尤其是关于如何配置服务器以及首先在其上安装代理软件的问题。
Ansible,CloudFormation,Heat和Terraform默认都是无主的。 或者,更准确一些,它们中的一些可能依赖于主服务器,但它已经是您正在使用的基础设施的一部分,而不是您必须管理的额外部分。 例如,Terraform使用云提供商的API与云提供商进行通信,因此在某种意义上,API服务器是主服务器,除了它们不需要任何额外的基础设施或任何额外的认证机制(即,只使用您的API密钥)。 Ansible的工作方式是通过SSH直接连接到每个服务器,因此,您不必再运行任何额外的基础结构或管理额外的身份验证机制(即只使用SSH密钥)。
Chef,Puppet和SaltStack都要求您在要配置的每台服务器上安装代理软件(例如,Chef Client,Puppet Agent,Salt Minion)。 代理通常在每个服务器的后台运行并负责
安装最新的配置管理更新。
这有一些缺点:
再强调一次,Chef,Puppet和SaltStack都对无代理模式(例如,salt-ssh)有不同程度的支持,但是这些通常感觉它们是作为事后的想法加入的,并不总是支持完整的配置管理工具的功能集。这就是为什么Chef,Puppet和SaltStack的默认或惯用配置几乎总是包含一个代理,通常也包含一个master。
所有这些额外的动态部分都会在您的基础架构中引入大量新的故障模式。 每次凌晨3点收到错误报告时,您都必须弄清楚它是否是应用程序代码,IAC代码,配置管理客户端,主服务器或者服务器中的错误。 客户端与主服务器通信,或者其他服务器与主服务器通信的方式,或者
Ansible,CloudFormation,Heat和Terraform不要求您安装任何额外的代理。 或者,更准确一些,它们中的一些需要代理,但这些代理通常已作为您正在使用的基础结构的一部分安装。 例如,AWS,Azure,Google Cloud和所有其他云提供商负责在每台物理服务器上安装,管理和验证代理软件。 作为Terraform的用户,您不必担心任何问题:您只需发出命令然后云服务商会在所有你的服务器上为你执行它们。 使用Ansible,您的服务器需要运行SSH守护程序,不管怎么样,这都会普遍运行在大多数服务器上的。
选择任何技术时要考虑的另一个关键因素是成熟度。 下表显示了每个IAC工具的初始发布日期和当前版本号(截至2019年5月)。
同样,这不是一个同类的比较,因为不同的工具有不同的版本控制方案,但一些趋势是明确的。 到目前为止,Terraform是此比较中最年轻的IAC工具。 它仍然是处于100版本之前,因此无法保证稳定或向后兼容的API,并且错误相对常见(尽管大多数都是次要的)。 这是Terraform最大的弱点:虽然它在短时间内变得非常受欢迎,但使用这种新的尖端工具所付出的代价是它不像其他一些IAC选项那样成熟。
虽然我一直在比较整个博客文章中的IAC工具,但事实是您可能需要使用多种工具来构建您的基础设施。 您看到的每个工具都有优点和缺点,因此您需要为正确的工作选择合适的工具。
以下是我见过的三种常见组合在很多公司都很好用:
配置 + 配置管理
示例:Terraform和Ansible。 您可以使用Terraform部署所有底层基础设施,包括网络拓扑(即VPC,子网,路由表),数据存储(例如,MySQL,Redis),负载均衡器和服务器。 然后,您使用Ansible在这些服务器之上部署您的应用程序。
这是一个简单的方法,因为没有运行额外的基础设施(Terraform和Ansible都是客户端应用程序),并且有很多方法可以使Ansible和Terraform一起工作(例如,Terraform为您的服务器添加特殊标签然后Ansible使用这些标签来查找服务器并对其进行配置。 主要缺点是使用Ansible通常意味着您编写了大量程序式代码,使用可变服务器,因此随着代码库,基础架构和团队的增长,维护可能会变得更加困难。
配置 + 服务器模板
示例:Terraform和Packer。您使用Packer将应用程序打包为虚拟机镜像。然后使用Terraform部署(a)具有这些虚拟机镜像的服务器和(b)基础架构的其余部分,包括网络拓扑(即VPC,子网,路由表),数据存储(例如,MySQL,Redis),和负载均衡器。
这也是一种简单的方法,因为没有运行额外的基础设施(Terraform和Packer都是仅客户端应用程序)。此外,这是一种不可变的基础架构方法,这将使维护更容易。但是,有两个主要缺点。首先,虚拟机可能需要很长时间才能构建和部署,这会降低迭代速度。其次,您可以使用Terraform实施的部署策略是有限的(例如,您无法在Terraform中本地实施蓝绿色部署),因此您要么最终编写大量复杂的部署脚本,要么转向编排工具,如下所述。
配置 + 服务器模板 + 编排
示例:Terraform,Packer,Docker和Kubernetes。 您使用Packer创建安装了Docker和Kubernetes的虚拟机映像。 然后使用Terraform部署(a)服务器集群,每个服务器运行此虚拟机镜像,以及(b)基础架构的其余部分,包括网络拓扑(即VPC,子网,路由表),数据存储( 例如,MySQL,Redis)和负载均衡器。 最后,当服务器集群启动时,它形成一个Kubernetes集群,用于运行和管理Dockerized应用程序。
这种方法的优点是Docker镜像构建相当快,您可以在本地计算机上运行和测试它们,并且您可以利用Kubernetes的所有内置功能,包括各种部署策略,自动修复,自动缩放, 等等。 缺点是增加了复杂性,无论是在运行额外的基础设施方面(Kubernetes集群都很难部署和运营,尽管大多数主要的云提供商现在提供托管的Kubernetes服务,可以减轻部分工作),还是学习、管理和debug额外的抽象层(Kubernetes,Docker,Packer)方面。
如果你像其他97%的人口一样,那么至少有一次在你的生活中,你使用手机发送文本或聊天消息。普通用户在一天内发送至少14条短信,可以通过即时消息APP或SMS发送。这实际上意味着消息传递可能位于智能手机高度使用功能列表的顶部。尽管如此,语音/视频通话仍然紧随其后。
11。什么是即时消息?
即时消息或即时消息是一种在线聊天,通过互联网提供实时文本传输。一些IMAPP还使用Push技术来提供实时文本,这些文本可以在字符构成时逐字传输文本。具有高级功能的即时通讯APP甚至可以帮助用户发送文件,可点击的超链接,VoIP,视频聊天,流媒体和更多类似的服务。
那么让我们来谈谈如何开发WhatsApp之类的APP。消息市场在WhatsApp领导游戏行业(每日活跃用户数为8亿)方面占据主导地位,其次是Facebook Messenger(每日活跃用户数为7亿)和微信(每日活跃用户数量为549亿人),但这并不意味着没有更多的空间和范围,一些更有创意的解决方案,金和盛在这里提供帮助!
2 WhatsApp的Tech Stack
如果你打算制作一个聊天APP,为什么不建模一个似乎已经正确的人。让我们开始了解什么样的技术堆栈与金和盛一起开发类似WhatsApp的即时消息APP?
21。Erlang
这是用于开发WhatsApp的首席编程语言。由于其卓越的性能,速度和可扩展性,这种语言获得了最多的认可和赞赏 - 这种组合最适合实时聊天应用!
22。Ejabberd
Ejabberd XMPP(可扩展消息和存在协议)服务器是独一无二的,它具有处理成千上万条消息的能力,并且速度快,无延迟,因此非常适合您。此外,它还可以很好地与Erlang编程语言结合使用,使它成为一个神话般的二重奏,并为整个APP提供动力!该服务器使用特定的可插拔模块进行开发,该模块允许广泛的功能范围,如:
一对一聊天
联系实际和在线列表
存储和转发(离线消息)
PEP(个人事件协议)和消息键入规范
多用户聊天(MUC) - 群聊
隐私设置和帐户欺骗
消息归档管理
23。YAWS
另一个Web服务器或YAWS是为多媒体文件存储而开发的,完全由Erlang编写。这是一款高性能的Web服务器,专为具有动态内容的高负载应用而开发。YAWS在处理并行流程的能力方面独树一帜,并且具有高性能标准。
24。FreeBSD的
这是WhatsApp正在使用的操作系统,并帮助它在其平台上每天发送数十亿条消息。FreeBSD操作系统具有精巧的网络堆栈和广泛的可靠性。这是一个功能强大,稳定,开放源码的Unix系统,实时聊天APP开发人员拥有丰富的使用经验。由于FreeBSD是一个单独的分销商,它在安装方面有一些明显的优势,并提供了二进制软件包的简单创建。
25。Lighttpd的
Lighttpd是一款开源Web服务器,针对更高的性能进行了优化。这个轻量级的Web服务器甚至可以在WhatsApp上部署,目的是添加安全,多功能,快速和兼容的功能。
26。自定义XMPP(可扩展消息和存在协议)服务器
最初这是WhatsApp用来传输所有用户信息的东西。这项技术具有很大的优势,因为它支持一对一和多用户聊天对话。但最终公司不得不切换到不同的互联网协议,以优化其服务器性能。
27。Mnesia DB
用Erlang编写的实时数据库管理功能非常适合存储任何实时聊天APP上运行的消息,文件,图像,视频,文档以及其他多媒体文件。对于WhatsApp,数据库通过Mnesia和MySQL数据库的组合启动。
3使WhatsApp真棒的功能
从Techstacks开始,让我们深入了解更明显的视觉功能,这些功能可以帮助您制作一款酷酷的新型聊天APP。当您打算构建WhatsApp这样的APP时,在决定APP拥有哪些APP之前,研究APP的功能非常重要!
31。注册和联系
大多数实时聊天APP或即时消息APP需要用户使用电话号码登录,而有些可能会通过社交媒体登录进行登录。WhatsApp更进一步,拍摄了短信进行确认,为用户增加了一层安全性,这是通过使用第三方API(如Twilio或Nexmo等)完成的。
然后,用户应该从地址簿中添加他们的联系人。聊天只能让你周围的所有朋友聊天才能开心!你甚至可以考虑整合其他选项,如gamil或Facebook(如果你有很多口袋的话)。现在,这一步需要非常快捷方便。
在这个级别考虑Profile UX / UI可能是一个好主意。您可以考虑您可能提供的那种自定义选项,或者决定是否希望用户能够与其他社交配置文件连接,或者您是否会向用户提供任何自定义设计功能。我们提供的用户体验堪称典范,让您的用户享受注册过程。
32。即时消息/实时聊天
由于它是一个聊天APP,所以消息传递功能是给定的。然而,这不是一种肯定或否定的选择,如果你正在考虑构建一个聊天APP,那么需要解决一些小小的细节。让我们来看看金和盛的清单,以帮助您做出决定。
用户以何种方式发起聊天?
你只会提供一对一的聊天选项,还是会有群聊的功能?除了这两个选项,WhatsApp甚至允许“广播列表”功能,它允许用户将相同的消息发送到指定的人员列表。
你会只提供私人聊天选项还是提供公共聊天室?
你想添加超级秘密安全功能,消息在读取后会在指定的时间后自毁吗?
你想提供一些装饰,如字体类型,字体选项,贴纸,静音功能,共享多媒体和文档等?尽管这些功能对于MVP来说可能不是一个好主意,但是请将它们包含在未来版本的APP中。
你会提前提前安排消息的功能吗?
今天的人们高度关注数据的隐私,研究表明,大约96%的人害怕在线黑客攻击,并将他们的私人数据置于危险之中。因此,当您着手开发私人Messenger软件时,务必注意用户的安全。以下是您的计划中应该注意的主要问题。
你可以看看开发和实现一个额外的匿名自毁功能。
您可能会考虑大量投资于高级加密技术,并保护所有消息免遭劫持。
您可以看看ChatSecure和CryptoCat这两个伟大的开源加密聊天APP。他们的代码甚至可以在Github上供所有开发人员查看并理解他们的加密如何工作。金和盛开发的即时消息功能对APP用户的安全保持警惕。
33。通知和推送消息
这些可能看起来很小,但在保留用户和保持其在APP中的活跃性方面有很长的路要走。一个基本规则是让用户自定义他们想要接收的通知类型。Firebase云消息传递适用于Android和iOS平台。但本机Apple推送通知可能更适合iOS平台。但是,Firebase Cloud Messaging大大降低了开发成本和开发时间。金和盛的聊天室和MessengerAPP可让您发送相关的推送通知,并帮助您吸引和留住您的用户。
34。多媒体文件传输
当它超越文本和表情符号时,聊天确实更有趣。您的用户会寻找他们可以共享多媒体文件的功能和方式,例如图像,GIF,视频,贴纸等等!毕竟,一张可能胜过千言万语。不过,如果您拥有财力雄厚的产品,您甚至可以考虑与领先的云端服务提供同步选项,例如Google Drive,Evernote和Dropbox。金和盛制作的即时通讯APP可让您的用户完美无缺地传输多媒体文件。
35。分享位置
这是一个功能,当你的朋友在圈子里走动试图去你的房子时,它会派上用场!Apple MapKit和Google Location SDK提供了用于集成位置共享的本地工具包。如果您计划与当地企业合作以通过应用获利,您还可以在应用中考虑iBeacon和Eddystone传感器。这有助于用户在进入会场的地理围栏后收到相关消息。很像WhatsApp,金和盛 制作的即时通讯APP可让用户与其他用户分享他们的位置。
4额外的实时聊天APP功能,您可能会考虑为您的APP
虽然WhatsApp可能会引领整个潮流,但这并不意味着它们是完美无瑕的,并且可以装载各种各样的功能。您可以查看WhatsApp尚未提供的以下功能并做出明智的决定!
41。VoIP(互联网协议语音)呼叫
在实施方面,这是一个昂贵的方面,但在用户中是一个非常有价值的功能。通过Skype或Viber等实时聊天应用进行呼叫越来越受欢迎,并逐渐取代传统的手机通话。
42。视频聊天
距离已经增加,时间被证明是一种难以捉摸的商品。在这个时代和时代,视频聊天或视频通话已经超越了“酷”,并且变成了一种必需品,以便与那些居住在那里的人保持联系远。
43。音频和视频流
这是SnapChat的核心功能,并且已被其他领先渠道(包括Instagram和Facebook)效仿。这可能是一个值得投资的功能。
44。活动计划和同步日历
此功能非常适合提醒用户有关特别活动或庆祝活动的信息,以便您可以提前计划。当您试图吸引“商业”人群到您的APP时,此功能特别有利并且效果很好。
45。应用内购买和订阅计划
必须有一个收入模式,这是实时聊天应用货币化的最有效方式之一。
46。多平台聊天
当您提供跨平台使用APP的选项时,无论您的APP是连接到桌面还是始终处于运行状态,您都可以帮助用户保持与APP的联系!
47。自毁信息
这是一个很棒的功能,可以让你发送秘密聊天信息给你的朋友,然后在他们看到它的一段时间后自毁。
48。云服务同步
当您允许用户将您的应用与突出的云服务同步时,可以以更高效的方式监控,更新,存储和扩展托管环境。
5促成和影响成本的因素
成本和预算因素对正在开发APP的人有很大的影响,当你跳跃时,它应该是一个计算出来的。虽然可能很难说出制作应用需要多少费用,但是可以列出对应用开发成本有重大影响的关键决策。
你选择的平台将决定你将要咳嗽的钱的种类。明智地选择是否要为Android,iOS或两者构建!
您决定继续使用的功能范围将决定您将要投入的时间和金钱类型。很自然地,你拥有的功能越多,成本就越高。虽然您必须优化您在MVP中提供的功能数量,但保留足够的功能以保持用户参与。
制定预算是您在整个过程中必须做出的最重要的决定之一。正是这个决定会推动所有其他决策,重要的是要保持现实,不要太过分或太紧张。
选择能够帮助您完成手头任务的代理商,同时满足您的时间表,提供优质的产品,并保持在预算范围内。
摄像头采集;
1、音视频编解码;
2、流媒体协议;
3、音视频流推送到流媒体服务器;
4、流媒体网络分发;
5、用户播放器;
6、音视频同步;
7、网络延迟自适应;
8、需要录制,多种视频文件的格式和封装;
9、语言:C、C、html、php、mysql
10、开发环境:嵌入式,Linux,Windows,Web
还有就是视频播放解决方案(卡顿、延迟):
1、CDN 加速;
2、自己架服务器;
3、用别人的云服务。
用 CDN 加速,可以尽量减少延迟。目前业内水准来看,视频延迟都在 3-6 秒之间。也就是在视频直播时,你看到的是几秒以前的画面。
自己架服务器,如果部署的数据中心不够多,那么遇上跨网、跨省的传输,还是得用 CDN 加速。那么为了尽可能降低延迟,你就需要在全国各省市都部署数据中心,来解决跨网、跨省的传输。用云服务的话,就是别人把服务器给你架好了,你只要傻瓜式的用就行了。当然,不管用哪种方式,综合权衡利弊,找到适合的方案就是最好的方案。
开发视频直播的流程有哪些:
1、采集;
2、前期处理;
3、编码;
4、传输;
5、解码;
6、渲染。
采集:iOS 是比较简单的,Android 则要做些机型适配工作。PC 最麻烦各种奇葩摄像头驱动,出了问题特别不好处理,建议放弃 PC 只支持手机主播,目前几个新进的直播平台都是这样的。
前期处理:现在直播美颜已经是标配了,80%的主播没有美颜根本没法看。美颜算法需要懂图像处理算法的人,没有好的开源实现,要自己参考论文去研究。算法设计好了还要优化,无论你打算用 CPU 还是 GPU 优化,算法优化本身也需要专业知识支持。GPU 虽然性能好,但是也是有功耗的。GPU 占用太高会导致手机发烫,而手机发烫会导致摄像头采集掉帧。而这一切都是需要经验支撑。
编码:如果你要上 720p,肯定要采用硬编码。软编码 720p 完全没希望,硬件编码不灵活。兼容性也有问题。如何适应纷繁复杂的网络和纷繁复杂的上下行设备?安卓和芯片的坑,开发过的人都知道。那有人问,要求不高,上软编码低分辨率 360p 行不行?就算上低分辨率,软编码还是会让 CPU 发烫,CPU 过热烫到摄像头,长期发烫不仅直接反应是费电。既然是手机直播,插着电源和充电器实在说不过去吧。还有,CPU 发烫会降频,怎么办?这还是只说性能方面。和前处理只影响图像质量和功耗不同,视频编解码技术还关联成本计算和网络对抗。考虑性能、功耗、成本、网络这四个之后你编码的码率、帧率、分辨率。软硬件开发该如何选择?
传输:自己做不现实,交给第三方服务商吧。
解码:如果你用硬解码,一定要做容错处理,一定要做适配。突然一个crash导致手机重启不好吧。安卓的硬解码,不说了。如果你加了网络目前手机的硬解码还不一定支撑用软解码,功耗发热的问题又来了。
渲染:为什么手机明明解码出好多帧数据。就是渲染不出来。为什么画面就是不同步。
以上是媒体模块,还有信令控制,登录、鉴权、权限管理、状态管理等等,各种应用服务,消息推送,聊天,礼物系统,支付系统,运营支持系统,统计系统等。后台还有数据库,缓存,分布式文件存储,消息队列,运维系统等。
以上技术要点的小结,确实能说明开发一个能用于生产环境的实时视频直播平台确非易事,跟IM里传统的实时音视频一样,这样的技术都是音视频编解码网络传输技术的综合应用体。
先以开发者的角度:
PHP跟net根本就不是一个级别的,net无论是应用场合、开发环境、帮助文档、编写风格、运行效率全部吊打PHP;PHP之所以流行就是因为很多开源框架都是现成的,刚好符合国人拿来主义的精神,修修改改就能拿来卖钱了。
JAVA各方面体量大致跟net旗鼓相当,Windows系统下还是net的天下,企业应用方面JAVA占用率高些,移动开发方面因为安卓和苹果的原因,net失去了先机。微软正在逐步赶超,unitiy、net core都在表明微软的态度。
以成本的角度:
微软的产品哪都好,就是版权太贵,Windows系统要钱,office要钱,服务器要钱,sqlserver要钱,再高级点用用企业版、集群之类的,做一个项目下来才能挣多少钱,都给微软了。PHP之所以能存活,就是linux免费,MySQL免费,Apache免费,PHP免费,就连框架都免费;JAVA跟PHP差不多。这种生态下导致了代码资源非常丰富,天下一般抄,开发成本就更低了。所以不是微软的东西不好,是JAVA和PHP开发成本太低了。用过对比你会发现,贵有贵的道理,所有开发帮助文档中,没有比微软做的更详尽的。
如果你是一个独立开发者,首选net,Windows桌面应用、Windows服务、Windows 游戏 、网站、webservice、unity 游戏 ,除了安卓和苹果原生应用,net都能胜任。如果微软可以在安卓下造出类似framework的东西,那就一统天下了。
做了7年的c#开发,4年多的java,c/c++,说说我的看法,主要有的区别:
一是开源和闭源的区别,net早期完全闭源,开发也是完全傻瓜式的,微软的思想就是让开发更容易,所以无法看到底层实现,给人的感觉就是走一条胡同,很快到达目的地却无法知道墙内的东西,接触过java和c之后,感觉就像掉进了大海,原来海底也这么漂亮,有太多开源的软件和框架,你可以看到更深层的东西,比如我们看dubbo,看进去后看netty,netty看进去后看到Linux,select,epoll,看到epoll,看Linux相关的,感觉就是掉进了大海,太多东西需要学习,做这么多年开发依然在不断的学习,但也给了我更多兴趣和探知未知世界的乐趣,以前做net的时候有种感觉就是,别让我做非net的东西,我不会,对陌生的的东西很害怕,现在的感觉就是你让我写个控制原子弹的程序我也敢去写(比方)。
二是免费和收费的区别,所有的公司产品的成本是公司发展的最关键因素之一,net全家桶成本太高,vs的版权+windows版权+sql server版权再加上其它支持类软件版权,成本非常高,相反linux完全免费开源,给你选你会选哪一个?同时linux或从Unix而来,但天生具有轻量级性能可以发挥到极致而且稳定的系统,而windows为个人和办公而设计,界面和系统其它资源就让系统占用一部分,感觉很笨重,上天做一个长连接测试,单台Linux轻松上几十万,当然由于内存原因,否则可以上百万,而windows就很难做到,而且Linux哪里不行你可以去改的,windows就不行了,所以一个稳定高效免费的还有一大堆开源支持的,和一个收费性能相比没有那么高效的,好多公司自然选择前者
三是开发效率,上面说两点都说net处于下风,但net不是一无是处,net有自身的优点,那就是开发效率,net在java之上做了改进,让开发人员更容易开发,语言优美,做企业应用开发是很好的工具,可以快速出结果,你用其它开发要么大炮打蚊子,要么不稳定,在工厂和企业就要求很快做出来,这是net优势,所以有他的市场份额,说这么多发现没个图,有评论的传一张
为什么PHP、Java在市面上比NET要受欢迎?而且从各大招聘网站上看PHP、Java的岗位比NET岗位要多很多。
其实NET也是有不少的优点的:
但是,它的致命缺点是:
设想一下,一个企业,如果服务器众多,那系统费用、数据库的授权费用,是多么庞大的一笔支出!
而PHP、Java则不同,它们都是跨平台开源免费的,虽然Java开始收费了(但还有免费的OpenJDK),所以PHP、Java还是首选。
我自己当初学过net,java,现在算是略有了解。 就我个人理解, 许多公司不用net 语言的根本原因,就是 net 在最初的时候不开源,教程少,入门较难,而且最后正式发行程序什么,还要交钱,所以在许多公司中首选java这种开放语言,教程多,入门简单,基本不收费(不收费是关键,划重点) 。这也算是开源与闭源软件之争吧,最终以java为首的开源软件获胜,得以普及。
后来,开源软件已经是大势所趋,这时候微软net阵营已经做了许多改变。我最熟悉net中的c#语言,我就以c#为例说说吧。
微软以前信奉闭环,所有语言都不支持跨平台,也就没有c#;后来java越来越发展壮大,net感受到了巨大危险,于是就模仿java,net提出了c#,借以打击java。c#很像java语言,而且和java一样能够跨平台,windows、linx、android、ios都可以编程,这就是微软做的改变。
如果大家用过c#或者vb,c++来编写窗口程序,就会发现,这些语言写出来的windows窗口太棒了,而用java写出来的窗口程序,不敢恭维,太丑了,这也就是我后来学习c#的原因。(这也就是为什么说跨平台只是一个美梦而已)。
跨平台、开源之后的 net ,其实跟java的基础结构并不差多少,但不具备数量优势,也就是说:java由于之前用的人太多了,各个方面的创新、发展都比较完善,有着坚实的用户群体、应用基础;而 net ,由于是后发,已经失去了太多的应用环境,自然现在许多公司在不考虑是专为windows开发的情况下,是不会太主动使用net。
如果用户采用微软全家桶解决方案, Net 的开发效率和体验是完全可以吊打 Java 和 PHP 的, 但昂贵的价格, 让开发者和用户又爱有恨
其实 Net + C# 现在虽说不如一票跨平台框架语言用得人多, 但也远远谈不上没落
在这个问题上, 个人认为 Microsoft 的原 CEO Steve Ballmer 难辞其咎, 在 Windows 霸主地位已经开始崩溃的时候 依然固执坚持封闭生态, 导致当时的 Net 开发者 无不焦虑和彷徨
不过 2014 年 Satya Nadella 接任 CEO 后, 微软 逐渐采取了 务实 开放 的做法, 收购 Xamarin 整合进 IDE, 推出 Visual Studio 社区版, C# 开始免费和跨平台, Microsoft 越来越像 Oracle, C# 越来越像 Java, 多多少少缓解了开发者的忧虑, 不少开发者开始回归, 毕竟 C# 优雅的语法 和 Visual Studio 卓越的开发体验 确实让人难以割舍
Net以前是不开源的,需要收费,有着各种版权问题,导致其语言生态发展不够。有其语言优点,但是从公司发展成本上来考虑,就注定不能作为首选。
PHP未兴起之前,很多公司使用net来开发网站,因为相比较java的JSP,开发效率也还是要高一些,这对中小型企业的业务快速变更升级很重要。JSP运行速度会快一些,但其需要编译的特点,开发速度会相对缓慢。而对中小型企业来说,时间就是金钱,开发速度太慢,跟不上业务发展是很致命的。
之后PHP应运而生,其语言设计的初衷就是为了快速开发web应用。完全的开源免费,开发效率非常高,甚至一个人就可以搞定一个项目。中小型公司,从发展之初的考虑,逐渐将PHP作为首选发展语言。
随着PHP生态的逐渐强大,net这种生态落后,开发速度比不上PHP,运行速度比不上JSP的语言也就逐渐没落了。
现在也有很多发展好了的公司,做大了做强了,又开始将自己的PHP项目往JSP迁移,因为开始追求运行速度。
所以PHP基本占领了中小型公司,而大公司则更多选择JSP。这都是语言的特性和优势决定的,将来如果出现一种语言能同时兼有开发速度和运行速度的免费开源的语言,那PHP和JSP也会逐渐走上net这条路。一切都是企业成本和效率的问题。
+++++++++++++++++++++++++++++++++++++
第一次写问答,没想到有这么高的阅读量。
有些人说我对net的认识太落后了,好吧,我开始学编程的时候,net确实是比较封闭的状态,这些年我也不再去关注net,对它的进一步了解也都是通过身边的同学朋友侧面反映的。
然后,真实情况是,我身边所有学net的同学都转行了。因为岗位少,薪资低,真的生存很艰难哩。
遥想当年,我们一个宿舍的同学(一群穷逼,只能住在学校破旧的8人大宿舍里,因为住宿费真便宜啊 ),开始讨论选某个语言作为今后学习方向。有人选择了net,有人选择了PHP,有人选择了JSP,然后各自努力。
现在,再来看彼此发展,net的同学都转行了,PHP的都在中小型公司,JSP的在平安保险这种大公司里。薪资待遇对比,net的同学和我们也有了差距。如果只看基本工资的话,还是PHP的高,哈哈。但是,加上年终奖就扑街了。我们同在深圳的经常一起出来聚聚,中小型公司的经常自嘲,辛辛苦苦一整年,比不上一个年终奖。唉,大公司年终奖是真多啊,可以顶你大半年甚至一年的工资,人比人气死人。
当然,学PHP也不是都好,有个同学受不了压力转行做SEO了。也不是所有学java都好,我现在公司的测试就是个学java找不到工作,转而当测试的。
其实问题还是经验,有多年工作经验,就是你找工作最好的敲门砖了。
最后,没有最好的语言,适应市场发展的语言就是好语言。
各位看官,不喜勿喷!
简单的说几句,就几句。我司用net做web,推送服务器,消息服务器,数据握手服务,cad应用二次开发,gis应用,各种手持设备应用,各种服务窗口用的终端应用,视频监控等等等,你还觉得php真的能打过net么?
个人的观点:
1、php肯定比不过net了,用他主要是网站那块而已。
2、net和Java,单纯从语言c#比java优秀,开源生态肯定是Java,效率是c#
3、net效率不高,在于windows平台,现在跨平台了,linux性能高于windows。
Net core 有一定的机会。
这个答案有几点:
1、运行环境成本问题,在net core出来之前,net
需要的运行环境搭设成本高,windows服务器正版上万,用access做数据库也需要几千元的正版office,虽说sql express是免费的,但是阉割的太厉害。所以一般win虚拟主机或者服务器都基本上比linux的贵,尤其是海外注重版权地区,更是差至少一半,所以造成了php大行其道,因为他的运行环境几乎零成本,而且服务器需要的配置可以很低,甚至128m内存就可以跑php程序。
2、开发环境成本问题,一样的毛病,code出来之前,开发net程序的工具首选visual studio,但是正版的也要几千上万,不是一般人承受的起的。而php和java的免费又好用的开发工具又很多,因此php又获得了先机。
3、学习成本问题,net之前,微软平台应用系列的开发需要太多,vb,c,c++,而网页脚本语言是基于vbscript的asp,随着系统的发展,这些需要和脚本逐步跟不上时代对敏捷开发、更复杂系统开发的需求,因此推出了aspnet和c#、f#,vbnet等语言,网页方面使用aspnet开发又一直升级,net 20,30,35,到现在的47x,每次升级都带来了新的概念,如今为了抢回份额,推出了net core 也是升级了好几个版本,所以net的开发要不断的学习,学习,升级,升级。而php就不一样了,版本的升级基本上都是框架内的升级,学习成本明显低于net
4、资源丰富问题,如上所述,由于成本问题,很多人选择了php开发,然后php的免费框架越来越多,程序员一般都懒,拿来修修改改就能上线,接着做下个项目就可以啦,而net明显没那么多免费框架,市面上分许多net框架是要授权费的。
不过目前微软的发力,也在着手改善这种问题,发布了visual studio code,visual studio community免费开发工具开发成本明显降低,net code跨平台语言只要版本符合要求linux系统也可以运行net code开发的程序了。如果能够有支持linux的文件型的数据库软件(例如office的access)发布就更好了。
做一个企业,最主要的目标是生存。活下来,才是根本目标,说好听一点,就是可持续发展。微软的生态圈大多收费,价格不菲,虽然从性能,入门,易用性来说,Net都好于Java领域,好于JSP和PHP,无奈中国市场竞争激烈,企业研发成本是首选考虑的因素,尤其是在中美贸易战的背景下,美国要加强知识产权保护的前提下,使用方用Net产品和服务就要支付昂贵的版权费用,让人承受不起。那么,免费开源的非Net体系,就会受到很多企业青睐,企业只要承担人工成本,不用过多支付版权费,是企业不得不考虑的方面。所以,现在使用什么技术,未来使用啥技术,是市场竞争的结果,要把握住这种趋势,才能占有先机。
0条评论