• 关于

    Node.js多进程

    的搜索结果

问题

【精品问答】Node.js 性能平台

常见问题 Node.js 性能平台运行时与社区 Node.js 运行时是什么关系? https://developer.aliyun.com/ask/278116 Node.js 性能平台运行时是否会影响性能࿱...
montos 2020-04-09 19:25:39 4 浏览量 回答数 1

回答

一、nohup node *.js & node.js自带服务nohub,不需要安装别的包。缺点:存在无法查询日志等问题 二、foreverforever能做更多的事情,比如分别记录输出和错误日志,宕机重启,热部署。比如可以在js中作为api使用2.1安装forevernpm install forever -g2.2启动服务service forever start2.2使用forever启动js文件forever start app.js2.3停止js文件forever stop app.js2.4启动js文件并输出日志文件forever start -l forever.log -o out.log -e err.log app.js2.5重启js文件forever restart app.js 2.6查看正在运行的进程 forever listps:来源网络
元芳啊 2019-12-02 00:54:51 0 浏览量 回答数 0

回答

基本信息 最近一次日志上报的各项指标,具体指标含义如下所述。 长周期数据 Memory memory_sys:系统内存使用百分比。 memory_node: 所有 Node.js 进程内存使用之和占系统内存的百分比。 CPU cpu_sys:系统 CPU 使用百分比。 cpu_node:所有 Node.js 进程 CPU 使用百分比之和。 Load load1:1分钟内平均 Load。 load5:5分钟内平均 Load。 load15:15分钟内平均 Load。 下面是一些 Load 的参考信息 (Load 已经归一化处理,如果是 N 核 CPU,那么相应 Load * N): 0.7 < Load < 1:不错的状态,有新任务也可以及时处理; Load = 1:即将有任务需要额外的等待时间才能被处理,需要引起关注; Load > 5:任务需要等待时间很长,需要干预处理。 通常先看 load15,如果很高,再看 load1 和 load5,看是否有下降趋势,短时间内 load1 大于 1,不用担心,如果长时间 Load 较高,需要引起关注。 Understanding Linux CPU Load - when should you be worried? QPS 该实例所有 Node.js 进程每秒钟处理的 HTTP 请求数之和。 GC gc_avg:所有 Node.js 进程垃圾回收时间占比平均值。 gc_max:每分钟内垃圾回收时间最多的 Node.js 进程的垃圾回收时间占比。 Apdex 应用性能指标 Node.js 性能平台根据 HTTP 的响应时间 RT 来定义用户满意度(默认响应时间 100ms): satisfied(满意):RT <= T tolerating(容忍):T < RT < 4 * T frustrated(失望):RT > 4 * T 计算方式: satisfied + tolerating / 2 举例来说: 每分钟 satisfied 的 HTTP 请求为 60%,tolerating 的为 30%,frustrated的为 10% 那么 Apdex = 0.6 + 0.3 / 2 = 0.75 Apdex detail 如上面描述的,根据响应时间分类的 HTTP 请求详细统计。 node进程数 该实例内的 Node.js 进程数统计。 磁盘 该实例的磁盘使用率。
保持可爱mmm 2020-03-27 10:04:11 0 浏览量 回答数 0

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

问题

node.js 调研与服务性能测试? 400 报错

node.js 调研与服务性能测试? 400 报错 这几天对nodejs进行了一下简单的调研 主要关注这几个方面 socket服务性能,socket客户端性能http服务性能.服务的稳定性与资源占用开发成本 考虑到今...
爱吃鱼的程序员 2020-06-04 11:54:07 3 浏览量 回答数 1

问题

Alinode 阿里云出品的 Node.js 解决方案体验

介绍 alinode 是阿里云出品的 Node.js 应用服务解决方案,是一套基于社区 Node 改进的运行时环境和服务平台。在社区的基础上我们内建了强大的支持功能,帮助开发者迅速洞见性能细节࿰...
妙正灰 2019-12-01 21:20:05 4719 浏览量 回答数 0

回答

这里我只介绍一下linux的方法:1、我们可以通过修改代码里面的监听端口,然后重新运行。这样会导致一个问题是,服务器的监听端口越来越多,会给服务器带来些许的压力,这种方法也是不可取的,没运行一次监听一个新端口,当然不是我们所希望的啦;2、使用nodemon运行jsnodemon是一个nodejs的版本管理器,会自动在后台帮我们监控服务器端的程序是否会发生变化。如变化,立即重启服务器(这个重启会造成什么样的影响?)用例:nodemon index.js;安装:npm install nodemon -g //install it文档地址:https://github.com/remy/nodemon因为用npm安装的,那么 usr/bin/ 目录下默认的是nodejs,所以需要先 ln -s /usr/bin/nodejs /usr/bin/node 创建alias3、使用node-dev index.js下载安装,使用方法参考https://github.com/fgnass/node-dev4、ctrl+c,在进程的shell中杀死进程端口5、如果在3不小心使用ctrl+z后台运行,可以用fg命令再调到前台继续运行,也可以通过使用netstat -nap | grep node查看监听的端口的进程id,然后使用kill -9 进程id 来手动杀死进程(限linux下使用);ps:来源网络
元芳啊 2019-12-02 00:54:48 0 浏览量 回答数 0

回答

就拿查询MySQL获取结果集并在页面上显示数据为例来分析. HTTP请求由C级别的程序比如Apache/Nginx处理(Java的HTTP服务用的是Java开发的Tomcat等), PHP则调用内置在PHP引擎的C开发的数据库驱动mysqlnd(Java用的是Java开发的JDBC驱动)来操作MySQL, 查询的逻辑这个重点都落在了C/C++开发的MySQL身上, 然后就是把返回结果集放到PHP数组, 经过字符串处理后在页面输出, 这些逻辑并不复杂, PHP负荷并不大. 值得注意的是, PHP内置的大量库函数全部使用C实现, 而Java的核心运行时类库rt.jar则是使用Java实现.在一些CLI下的压力测试中,因为存在大量的循环,很容易就触发Java的JIT热点编译,这时Java的计算性能上升到C的级别,这样的测试结果只能说Java在计算上的性能碾压动态解释型弱类型的PHP,而不是在Web上.对比具有JIT的机制的HHVM和PHP7的性能也能说明这个问题,在bench.php这个计算脚本的压力测试中,HHVM还是要比PHP7快1到2倍,但在WordPress等真实Web应用的测试中,HHVM和PHP7两者的性能相近.PHP的运行模式要比Java健壮稳定得多,比如PHP-FPM是经典的多进程prefork模式,主进程会维持指定数量的工作进程数,可以设置工作进程在处理多少个请求后自动重启.反观Java多线程的Tomcat,除了内存膨胀,代码稍有不慎,就有可能让Tomcat崩溃退出,抛出一大堆的错误信息.PHP开启ZendOpcache后,可以把脚本生成的opcode缓存到内存形成opcache供下次请求直接在ZendVM上执行,能带来一定的性能提升.PHP进程(PHP-FPM,Apache)可以和MySQL/Memcached/Redis建立持久连接,一个PHP进程保持一个MySQL持久连接,省去每次请求都建立连接的开销.但需要注意PHP进程数不要超过MySQL最大连接数这一点,超时或重启MySQL后PHP-FPM在代码mysqli_connect时会自动重连,但会返回"MySQL server has gone away"的Warning信息,可以用@抑制错误输出.PHP的热部署特性大大方便了开发和运维,这点是Java等其他语言(包括RoR/Python/Node.JS)所不能媲美的.
蛮大人123 2019-12-02 01:53:14 0 浏览量 回答数 0

回答

想知道五年之后有什么变化,可以先看看现在对比五年前(2014年)有什么变化。 注:本文仅从搜索热度分析,不保证数据的准确性,拒绝其他角度的抬杠 :) 先看看美国的变化,以下数据来自 Google Trends 2014 年,是 jQuery 刚开始变得不潮的时候 2014 年,也是 AngularJS 开始变潮的时候,那个时候 React 还是小弟 你问 Vue ?2014 年 2 月 Vue 才发布 0.0.x 版本。而且 Vue 的历史搜索热度很难统计,因为有很多产品也叫 Vue,比如有个摄像相关的 App 就叫做 Vue。 再看看 2014 年 Node.js 的热度 可以明显看出,Angular 的兴起是与 Node.js 呈正相关的,这是因为 Node.js 催生了一系列前端自动化工具。 2016年到2017年,React 突飞猛进,超过了 Angular,这是因为什么? 当然是因为 Angular 2 的出现……让一部分人慌了。以及 React Native 的出现: 可以看出 Angular 2 不仅没有吸纳前一个版本的用户,反而还把自己的热度给弄熄火了。 继续看美国的搜索热度,Vue.js 到底是什么时候开始在美国火的呢?单独看 Vue 的数据吧 2016年中,也就是 Vue 1.0.0 发布之后。但要是把 Vue 和 React 的数据拉到一起: Vue.js 搜索量很少,Vue 搜索量很大,但其实这不准确,因为之前说过,Vue 的搜索热度很难统计(以后大家给库起名字的时候最好用一个独特的单词啊) 根据尤雨溪的说法,比较准的对比方式是看 devtools 的下载量,目前 Vue devtools 下载量100万次,React devtools 下载量接近200万次。 不过考虑到我国还有很多程序员不会搭梯子,所以 Vue 的使用者数量应该还能多。 本文无意对比框架使用量,只是简单罗列了一些数据,接下来总结一下。 总结 现在前端的重要框架,五年前刚好都出现了。因此,推测五年后的重要框架,现在应该也已经出现了,大家觉得是哪个?但也有可能像 Vue 一样,在两年后杀出来。 五年里死掉的技术比活下来的多多了,比如 Backbone.js、Reactive.js、Browserify、Grunt 等,因此,推测目前流行的大部分技术,Require.js、很有可能在五年后会无人问津 五年前前端从无框架进入有框架时代,因此,推测五年后前端应该集体学会另一个概念,大家觉得是哪个概念?类型?测试?还是 Serverless?wasm?...... 总之,五年来,前端总体上就只多了一个框架的概念,细节上有很多小概念,比如同构、工程化、可视化、PWA、WebAssembly 等。效率是提升了,但是不好解决的问题还是不好解决,比如 CSS 还是很难写,浏览器兼容从兼容 IE 变成了兼容 UC,需求还是明天上线,996 的还在996,单元测试还是不会写,知乎现在的 bug 反而比 2014 年更多了 :) 经典概念愈久弥新,当工具和库越来越完善,反而是会编译原理、进程线程纤程协程、函数式编程、树与 diff 算法、设计模式这些经典概念的人越来越吃香
茶什i 2020-01-13 10:15:41 0 浏览量 回答数 0

问题

前端面试经典题目合集

本专题选取了前端面试易考知识点,旨在帮助大家加深对前端知识点的理解,进行复习备考准备。资料来源于网络,原作者@markyun(https://github.com/markyun/My-bl...
小柯卡力多 2019-12-01 22:06:33 14 浏览量 回答数 0

回答

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Node 可能是某些人的正确选择。 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务。 Node 旨在解决什么问题? Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户端基础的增长,您希望您的 web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在 Java 中,静态变量和缓存需要在每个服务器上的 JVMs 之间共享。这就是整个 web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。 Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的 OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。 现在您有了一个能处理数万条并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 如何工作以及它被设计的如何运行。 Node 肯定不是什么 没错,Node 是一个服务器程序。但是,它肯定不 像 Apache 或 Tomcat。那些服务器是独立服务器产品,可以立即安装并部署应用程序。通过这些产品,您可以在一分钟内启动并运行一个服务器。Node 肯定不是这种产品。Apache 能添加一个 PHP 模块来允许开发人员创建动态 web 页,使用 Tomcat 的程序员能部署 JSPs 来创建动态 web 页。Node 肯定不是这种类型。 在 Node 的早期阶段(当前是 version 0.4.6),它还不是一个 “运行就绪” 的服务器程序,您还不能安装它,向其中放置文件,拥有一个功能齐全的 web 服务器。即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?没错,您没有看错。服务器端 JavaScript 是一个相对较新的概念,这个概念是大约两年前在 developerWorks 上讨论 Aptana Jaxer 产品时提到的(参见 参考资料)。尽管 Jaxer 一直没有真正流行,但这个理念本身并不是遥不可及的 — 为何不能在服务器上使用客户机上使用的编程语言? 什么使 V8?V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。它不仅限于在一个浏览器中运行。因此,Node 实际上使用 Google 编写的 V8 JavaScript 引擎并将其重建为在服务器上使用。太完美了!既然已经有一个不错的解决方案可用,为何还要创建一种新语言呢? 事件驱动编程 许多程序员接受的教育使他们认为,面向对象编程是完美的编程设计,而对其他编程方法不屑一顾。Node 使用一个所谓的事件驱动编程模型。 清单 1. 客户端上使用 jQuery 的事件驱动编程 复制代码 代码如下: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); 实际上,服务器端和客户端没有任何区别。没错,这没有按钮点击操作,也没有向文本字段键入的操作,但在一个更高的层面上,事件正在 发生。一个连接被建立 — 事件!数据通过连接接收 — 事件!数据通过连接停止 — 事件! 为什么这种设置类型对 Node 很理想?JavaScript 是一种很棒的事件驱动编程语言,因为它允许匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处编写。这样,代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有在上面架构任何内容的潜能。只需监听事件,编写一个回调函数,然后,事件驱动编程将照管好一切! 示例 Node 应用程序 最后,我们来看一些代码!让我们将讨论过的所有内容综合起来,创建我们的第一个 Node 应用程序。由于我们已经知道,Node 对于处理高流量应用程序很理想,我们就来创建一个非常简单的 web 应用程序 — 一个为实现最大速度而构建的应用程序。下面是 “老板” 交代的关于我们的样例应用程序的具体要求:创建一个随机数字生成器 RESTful API。这个应用程序应该接受一个输入:一个名为 “number” 的参数。然后,应用程序返回一个介于 0 和该参数之间的随机数字,并将生成的数字返回调用者。由于 “老板” 希望它成为一个广泛流行的应用程序,因此它应该能处理 50,000 个并发用户。我们来看看代码: 清单 2. Node 随机数字生成器 复制代码 代码如下: // these modules need to be imported in order to use them. // Node has several modules. They are like any #include // or import statement in other languages var http = require("http"); var url = require("url"); // The most important line in any Node file. This function // does the actual process of creating the server. Technically, // Node tells the underlying operating system that whenever a // connection is made, this particular callback function should be // executed. Since we're creating a web service with REST API, // we want an HTTP server, which requires the http variable // we created in the lines above. // Finally, you can see that the callback method receives a 'request' // and 'response' object automatically. This should be familiar // to any PHP or Java programmer. http.createServer(function(request, response) { // The response needs to handle all the headers, and the return codes // These types of things are handled automatically in server programs // like Apache and Tomcat, but Node requires everything to be done yourself response.writeHead(200, {"Content-Type": "text/plain"}); // Here is some unique-looking code. This is how Node retrives // parameters passed in from client requests. The url module // handles all these functions. The parse function // deconstructs the URL, and places the query key-values in the // query object. We can find the value for the "number" key // by referencing it directly - the beauty of JavaScript. var params = url.parse(request.url, true).query; var input = params.number; // These are the generic JavaScript methods that will create // our random number that gets passed back to the caller var numInput = new Number(input); var numOutput = new Number(Math.random() * numInput).toFixed(0); // Write the random number to response response.write(numOutput); // Node requires us to explicitly end this connection. This is because // Node allows you to keep a connection open and pass data back and forth, // though that advanced topic isn't discussed in this article. response.end(); // When we create the server, we have to explicitly connect the HTTP server to // a port. Standard HTTP port is 80, so we'll connect it to that one. }).listen(80); // Output a String to the console once the server starts up, letting us know everything // starts up correctly console.log("Random Number Generator Running..."); 将上面的代码放到一个名为 “random.js” 的文件中。现在,要启动这个应用程序并运行它(进而创建 HTTP 服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时它看起来的样子: 复制代码 代码如下: root@ubuntu:/home/moila/ws/mike# node random.js Random Number Generator Running... 访问应用程序 应用程序已经启动并运行。Node 正在监听任何连接,我们来测试一下。由于我们创建了一个简单的 RESTful API,我们可以使用我们的 web 浏览器来访问这个应用程序。键入以下地址(确保您完成了上面的步骤):localhost/?number=27。 您的浏览器窗口将更改到一个介于 0 到 27 之间的随机数字。单击浏览器上的 “重新载入” 按钮,将得到另一个随机数字。就是这样,这就是您的第一个 Node 应用程序! Node 对什么有好处? 到此为止,应该能够回答 “Node 是什么” 这个问题了,但您可能还不清楚什么时候应该使用它。这是一个需要提出的重要问题,因为 Node 对有一些东西有好处,但相反,对另一些东西而言,目前 Node 可能不是一个好的解决方案。您需要小心决定何时使用 Node,因为在错误的情况下使用它可能会导致一个多余编码的 LOT。 它对什么有好处? 正如您此前所看到的,Node 非常适合以下情况:您预计可能有很高的流量,而在响应客户端之前服务器端逻辑和处理所需不一定是巨大的。Node 表现出众的典型示例包括: 1.RESTful API 提供 RESTful API 的 web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它还不需要大量逻辑;它只是从一个数据库查找一些值并组合一个响应。由于响应是少量文本,入站请求时少量文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。 2.Twitter 队列 想像一下像 Twitter 这样的公司,它必须接收 tweets 并将其写入一个数据库。实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站 tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集 tweet 并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个 tweet 将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理 2000 条入站 tweets。每秒 100 万条 tweets 需要 500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能捕获尽可能多的 tweets。一个能处理 50,000 条 tweets 的 Node 机器只需要 20 个服务器。 3.映像文件服务器 一个拥有大型分布式网站的公司(比如 Facebook 或 Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个 404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和 .css 文件等静态文件所需的服务器数量。 它对什么有坏处? 当然,在某些情况下,Node 并非理想选择。下面是 Node 不擅长的领域: 1.动态创建的页 目前,Node 没有提供一种默认方法来创建动态页。例如,使用 JavaServer Pages (JSP) 技术时,可以创建一个在这样的 JSP 代码段中包含循环的 index.jsp 页。Node 不支持这类动态的、HTML 驱动的页面。同样,Node 不太适合作为 Apache 和 Tomcat 这样的网页服务器。因此,如果您想在 Node 中提供这样一个服务器端解决方案,必须自己编写整个解决方案。PHP 程序员不想在每次部署 web 应用程序时都编写一个针对 Apache 的 PHP 转换器,当目前为止,这正是 Node 要求您做的。 2. 关系数据库重型应用程序 Node 的目的是快速、异步和非阻塞。数据库并不一定分享这些目标。它们是同步和阻塞的,因为读写时对数据库的调用在结果生成之前将一直阻塞通道。因此,一个每个请求都需要大量数据库调用、大量读取、大量写入的 web 应用程序非常不适合 Node,这是因为关系数据库本身就能抵销 Node 的众多优势。(新的 NoSQL 数据库更适合 Node,不过那完全是另一个主题了。) 结束语 问题是 “什么是 Node.js?” 应该已经得到解答。阅读本文之后,您应该能通过几个清晰简洁的句子回答这个问题。如果这样,那么您已经走到了许多编码员和程序员的前面。我和许多人都谈论过 Node,但它们对 Node 究竟是什么一直很迷惑。可以理解,他们具有的是 Apache 的思维方式 — 服务器是一个应用程序,将 HTML 文件放入其中,一切就会正常运转。而 Node 是目的驱动的。它是一个软件程序,使用 JavaScript 来允许程序员轻松快速地创建快速、可伸缩的 web 服务器。Apache 是运行就绪的,而 Node 是编码就绪的。 Node 完成了它提供高度可伸缩服务器的目标。它并不分配一个 “每个连接一个线程” 模型,而是使用一个 “每个连接一个流程” 模型,只创建每个连接需要的内存。它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了 Node 的理想目标 — 编写一个高度可伸缩的解决方案变得比较容易。 与理解 Node 是 什么同样重要的是,理解它不是 什么。Node 并不是 Apache 的一个替代品,后者旨在使 PHP web 应用程序更容易伸缩。事实确实如此。在 Node 的这个初始阶段,大量程序员使用它的可能性不大,但在它能发挥作用的场景中,它的表现非常好。 将来应该期望从 Node 得到什么呢?这也许是本文引出的最重要的问题。既然您知道了它现在的作用,您应该会想知道它下一步将做什么。在接下来的一年中,我期待着 Node 提供与现有的第三方支持库更好地集成。现在,许多第三方程序员已经研发了用于 Node 的插件,包括添加文件服务器支持和 MySQL 支持。希望 Node 开始将它们集成到其核心功能中。最后,我还希望 Node 支持某种动态页面模块,这样,您就可以在 HTML 文件中执行在 PHP 和 JSP(也许是一个 NSP,一个 Node 服务器页)中所做的操作。最后,希望有一天会出现一个 “部署就绪” 的 Node 服务器,可以下载和安装,只需将您的 HTML 文件放到其中,就像使用 Apache 或 Tomcat 那样。Node 现在还处于初始阶段,但它发展得很快,可能不久就会出现在您的视野中。 答案来源于网络
养狐狸的猫 2019-12-02 02:17:03 0 浏览量 回答数 0

问题

Node.js 应该处于技术架构中的哪个位置?

Node.js 从 2009 年出世到现在,使用 Node.js 开发的构建工具改变了前端们的开发流程,已经是大部分前端开发者电脑上必装的 JavaScript Runtime 了。那它作为一门后端语言ÿ...
李博 bluemind 2019-12-01 21:47:42 2961 浏览量 回答数 0

问题

云服务器ECS【问答合集】

轻云服务器和云服务器ECS的区别?https://yq.aliyun.com/ask/187841云服务器ECS和传统服务器的区别https://yq.aliyun.com/ask/178920如何选择阿里云云服务器ECS操作系统https...
马铭芳 2019-12-01 20:19:32 20670 浏览量 回答数 11

问题

云服务器ECS【问答合集】

轻云服务器和云服务器ECS的区别? https://yq.aliyun.com/ask/187841 云服务器ECS和传统服务器的区别 https://yq.aliyun.com/ask/178920 如何选择阿里云云...
游客886 2019-12-01 21:30:13 1990 浏览量 回答数 3

问题

程序员报错QA大分享(1)

程序员报错QA征集第一弹来了哦~包含QA分享一期征集的部分内容,链接附带解决方案,可收藏哦~ npm install安装依赖一直报错?报错https://developer.aliyun.com/ask/301...
问问小秘 2020-06-18 15:46:14 1684 浏览量 回答数 2

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 本次活动特邀百位阿里技术专家对Java常...
管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

问题

MongoDB 使用场景及运维管理问题交流探讨

MongoDB是一个开源的文档型数据库(Document-oriented database),其灵活的文档模型使得其非常适合于快速开发迭代、需求多变的业务场景,MongoDB 支持复...
云栖技术 2019-12-01 21:56:59 2493 浏览量 回答数 0

回答

有过简单的了解,他和nodejsyou很多相同的特点。如1、事件驱动,异步执行,非阻塞IO2、单进程单线程更多信息可以查看 ReactPHP,PHP版的Node.js
exinnet 2019-12-02 01:32:23 0 浏览量 回答数 0

问题

社区系统 Icarus 1.3.0

开源协议 ZLIB 免费且商业友好,这个协议基本上和MIT相同。 特性 全局 文件上传(七牛云) 超宽屏支持 简易的移动端支持 实时在线人数 Markdown发帖和评论 ...
寒喵 2019-12-01 21:51:20 1292 浏览量 回答数 0

回答

1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 undefined 与 undeclared 的区别? 7 null 和 undefined 的区别? 8 如何获取安全的 undefined 值? 9 说几条写 JavaScript 的基本规范? 10 JavaScript 原型,原型链? 有什么特点? 11 js 获取原型的方法? 12 在 js 中不同进制数字的表示方式? 13 js 中整数的安全范围是多少? 14 typeof NaN 的结果是什么? 15 isNaN 和 Number.isNaN 函数的区别? 16 Array 构造函数只有一个参数值时的表现? 17 其他值到字符串的转换规则? 18 其他值到数字值的转换规则? 19 其他值到布尔类型的值的转换规则? 20 {} 和 [] 的 valueOf 和 toString 的结果是什么? 21 什么是假值对象? 22 ~ 操作符的作用? 23 解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字,它们之间的区别是什么? 24 + 操作符什么时候用于字符串的拼接? 25 什么情况下会发生布尔值的隐式强制类型转换? 26 || 和 && 操作符的返回值? 27 Symbol 值的强制类型转换? 28 == 操作符的强制类型转换规则? 29 如何将字符串转化为数字,例如 '12.3b'? 30 如何将浮点数点左边的数每三位添加一个逗号,如 12000000.11 转化为『12,000,000.11』? 31 常用正则表达式? 32 生成随机数的各种方法? 33 如何实现数组的随机排序? 34 javascript 创建对象的几种方式? 35 JavaScript 继承的几种实现方式? 36 寄生式组合继承的实现? 37 Javascript 的作用域链? 38 谈谈 This 对象的理解。 39 eval 是做什么的? 40 什么是 DOM 和 BOM? 41 写一个通用的事件侦听器函数。 42 事件是什么?IE 与火狐的事件机制有什么区别? 如何阻止冒泡? 43 三种事件模型是什么? 44 事件委托是什么? 45 ['1', '2', '3'].map(parseInt) 答案是多少? 46 什么是闭包,为什么要用它? 47 javascript 代码中的 'use strict'; 是什么意思 ? 使用它区别是什么? 48 如何判断一个对象是否属于某个类? 49 instanceof 的作用? 50 new 操作符具体干了什么呢?如何实现? 51 Javascript 中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是? 52 对于 JSON 的了解? 53 [].forEach.call($$(''),function(a){a.style.outline='1px solid #'+(~~(Math.random()(1<<24))).toString(16)}) 能解释一下这段代码的意思吗? 54 js 延迟加载的方式有哪些? 55 Ajax 是什么? 如何创建一个 Ajax? 56 谈一谈浏览器的缓存机制? 57 Ajax 解决浏览器缓存问题? 58 同步和异步的区别? 59 什么是浏览器的同源政策? 60 如何解决跨域问题? 61 服务器代理转发时,该如何处理 cookie? 62 简单谈一下 cookie ? 63 模块化开发怎么做? 64 js 的几种模块规范? 65 AMD 和 CMD 规范的区别? 66 ES6 模块与 CommonJS 模块、AMD、CMD 的差异。 67 requireJS 的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?) 68 JS 模块加载器的轮子怎么造,也就是如何实现一个模块加载器? 69 ECMAScript6 怎么写 class,为什么会出现 class 这种东西? 70 documen.write 和 innerHTML 的区别? 71 DOM 操作——怎样添加、移除、移动、复制、创建和查找节点? 72 innerHTML 与 outerHTML 的区别? 73 .call() 和 .apply() 的区别? 74 JavaScript 类数组对象的定义? 75 数组和对象有哪些原生方法,列举一下? 76 数组的 fill 方法? 77 [,,,] 的长度? 78 JavaScript 中的作用域与变量声明提升? 79 如何编写高性能的 Javascript ? 80 简单介绍一下 V8 引擎的垃圾回收机制 81 哪些操作会造成内存泄漏? 82 需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案? 83 如何判断当前脚本运行在浏览器还是 node 环境中?(阿里) 84 把 script 标签放在页面的最底部的 body 封闭之前和封闭之后有什么区别?浏览器会如何解析它们? 85 移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时? 86 什么是“前端路由”?什么时候适合使用“前端路由”?“前端路由”有哪些优点和缺点? 87 如何测试前端代码么? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)? 88 检测浏览器版本版本有哪些方式? 89 什么是 Polyfill ? 90 使用 JS 实现获取文件扩展名? 91 介绍一下 js 的节流与防抖? 92 Object.is() 与原来的比较操作符 '==='、'==' 的区别? 93 escape,encodeURI,encodeURIComponent 有什么区别? 94 Unicode 和 UTF-8 之间的关系? 95 js 的事件循环是什么? 96 js 中的深浅拷贝实现? 97 手写 call、apply 及 bind 函数 98 函数柯里化的实现 99 99. 为什么 0.1 + 0.2 != 0.3?如何解决这个问题? 100 原码、反码和补码的介绍 101 toPrecision 和 toFixed 和 Math.round 的区别? 102 什么是 XSS 攻击?如何防范 XSS 攻击? 103 什么是 CSP? 104 什么是 CSRF 攻击?如何防范 CSRF 攻击? 105 什么是 Samesite Cookie 属性? 106 什么是点击劫持?如何防范点击劫持? 107 SQL 注入攻击? 108 什么是 MVVM?比之 MVC 有什么区别?什么又是 MVP ? 109 vue 双向数据绑定原理? 110 Object.defineProperty 介绍? 111 使用 Object.defineProperty() 来进行数据劫持有什么缺点? 112 什么是 Virtual DOM?为什么 Virtual DOM 比原生 DOM 快? 113 如何比较两个 DOM 树的差异? 114 什么是 requestAnimationFrame ? 115 谈谈你对 webpack 的看法 116 offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别? 117 谈一谈你理解的函数式编程? 118 异步编程的实现方式? 119 Js 动画与 CSS 动画区别及相应实现 120 get 请求传参长度的误区 121 URL 和 URI 的区别? 122 get 和 post 请求在缓存方面的区别 123 图片的懒加载和预加载 124 mouseover 和 mouseenter 的区别? 125 js 拖拽功能的实现 126 为什么使用 setTimeout 实现 setInterval?怎么模拟? 127 let 和 const 的注意点? 128 什么是 rest 参数? 129 什么是尾调用,使用尾调用有什么好处? 130 Symbol 类型的注意点? 131 Set 和 WeakSet 结构? 132 Map 和 WeakMap 结构? 133 什么是 Proxy ? 134 Reflect 对象创建目的? 135 require 模块引入的查找方式? 136 什么是 Promise 对象,什么是 Promises/A+ 规范? 137 手写一个 Promise 138 如何检测浏览器所支持的最小字体大小? 139 怎么做 JS 代码 Error 统计? 140 单例模式模式是什么? 141 策略模式是什么? 142 代理模式是什么? 143 中介者模式是什么? 144 适配器模式是什么? 145 观察者模式和发布订阅模式有什么不同? 146 Vue 的生命周期是什么? 147 Vue 的各个生命阶段是什么? 148 Vue 组件间的参数传递方式? 149 computed 和 watch 的差异? 150 vue-router 中的导航钩子函数 151 两个router 的区别? 152 vue 常用的修饰符? 153 computed 和 watch 区别? 154 keep-alive 组件有什么作用? 155 vue 中 mixin 和 mixins 区别? 156 开发中常用的几种 Content-Type ? 157 如何封装一个 javascript 的类型判断函数? 158 如何判断一个对象是否为空对象? 159 使用闭包实现每隔一秒打印 1,2,3,4 160 手写一个 jsonp 161 手写一个观察者模式? 162 EventEmitter 实现 163 一道常被人轻视的前端 JS 面试题 164 如何确定页面的可用性时间,什么是 Performance API? 165 js 中的命名规则 166 js 语句末尾分号是否可以省略? 167 Object.assign() 168 Math.ceil 和 Math.floor 169 js for 循环注意点 170 一个列表,假设有 100000 个数据,这个该怎么办? 171 js 中倒计时的纠偏实现? 172 进程间通信的方式? 173 如何查找一篇英文文章中出现频率最高的单词? 174 174道 JavaScript 面试题,合集
剑曼红尘 2020-04-02 14:05:35 0 浏览量 回答数 0

回答

下表介绍了Web+自2019年6月14日公测上线以来的迭代版本的重要功能说明以及相关文档链接。 2020-02-06 功能名称 功能描述 功能类型 相关文档 一键部署WordPress应用 可以在控制台上一键部署WordPress应用程序,默认使用单机部署的MySQL数据库,降低启动成本。 新增 一键启动WordPress 支持编排Redis资源 可以在控制台界面上直接添加和配置Redis资源。 新增 云数据库Redis 开放Nginx配置文件的编辑功能 在控制台概览页右侧可以查看各开发语言的快速入门交互式教程。 新增 反向代理服务器 免费的OSS存储空间 在创建应用的时候可以选择使用由系统提供的免费OSS存储空间。 优化 / 2019-12-05 功能名称 功能描述 功能类型 相关文档 支持域名托管 支持托管阿里云云解析和任何第三方域名服务提供商处注册的域名。 新增 域名托管 支持分批部署 当部署环境有多台实例的时候,支持按照指定规则进行分批部署,以保证业务不中断。 新增 部署环境 各开发语言的交互式教程 在控制台概览页右侧可以查看各开发语言的快速入门交互式教程。 新增 / 开通向导优化 支持一键开通及授权相关产品。 优化 开通Web+相关服务并授权 部署环境配置界面优化 以架构图的方式展现环境配置信息,并可以进行编辑操作。 优化 / 支持禁用健康检查 部署环境默认禁用健康检查,您可以在环境配置界面选择手动开启。 优化 配置健康检查 2019-09-29 功能名称 功能描述 功能类型 相关文档 代购ECS实例 支持使用控制台和CLI代购包年包月的ECS实例。 新增 ECS实例 代购SLB实例 支持使用CLI代购包年包月SLB实例。 新增 使用CLI配置SLB 代购RDS实例 支持使用CLI代购包年包月RDS实例。 新增 使用CLI配置RDS 支持HTTPS访问 可以在SLB和反向代理层配置证书实现HTTPS访问。 新增 为部署环境配置HTTPS 2019-09-25 功能名称 功能描述 功能类型 相关文档 正式商用 正式商用后Web+仍然免费,您只需要对用到的底层资源付费。 新增 / 2019-09-04 功能名称 功能描述 功能类型 相关文档 支持导入已购买的ECS实例 您在ECS控制台购买的ECS实例,可在Web+导入使用。 新增 导入ECS实例 支持.NET Core应用 支持在Web+控制台托管.NET Core应用。 新增 设置ASP.NET Core开发环境 部署ASP.NET Core应用至Web+ 支持Ruby应用 支持在Web+控制台托管Ruby应用。 新增 配置Ruby开发环境 部署Ruby on Rails应用至Web+ 显示部署环境资源 在部署环境概览页,可以展示部署环境内包含的资源。 新增 部署环境信息说明 2019-08-12 功能名称 功能描述 功能类型 相关文档 支持Python应用 支持在Web+控制台托管Python应用。 新增 设置Python开发环境 使用Flask开发应用 使用Django开发应用 反向代理优化 支持关闭反向代理服务器。 新增 反向代理服务器 2019-08-06 功能名称 功能描述 功能类型 相关文档 支持Go应用 支持在Web+控制台托管Go应用。 新增 设置Go开发环境 将Beego应用部署到Web+ 向Go应用的部署环境中添加RDS实例 支持PHP应用 支持在Web+控制台托管PHP应用。 新增 设置PHP开发环境 使用Symfony开发应用 使用Laravel框架开发应用 支持导入SLB实例 您在SLB控制台购买的SLB实例,可导入Web+使用。 新增 导入负载均衡SLB 应用生命周期挂钩脚本 Web+提供了通过设置命令来管理用户的服务进程,以及通过设置生命周期挂钩来简化部署、监控、运维和治理等应用生命周期管理操作。 新增 命令与生命周期挂钩 增加技术栈版本 在部分技术栈内,有多个技术栈版本可选择。 新增 技术栈 2019-07-25 功能名称 功能描述 功能类型 相关文档 功能优化 产品功能性能优化,使Web+的使用体验更良好。 优化 / 2019-07-15 功能名称 功能描述 功能类型 相关文档 支持Node.js应用 支持在Web+托管Node.js语言的应用。 新增 设置Node.js开发环境 将Express应用部署到Web+ 向Node.js应用部署环境中添加RDS数据库实例 支持RDS 支持在控制台和CLI内为部署环境配置RDS。 新增 云数据库RDS 变更操作清单 在部署环境中变更配置时,会罗列出变更资源的清单。 新增 / 2019-06-14 功能名称 功能描述 功能类型 相关文档 产品正式公测 Web+正式在阿里云公测上线,免费开放给用户托管应用。 新增 什么是Web应用托管服务Web+? 支持Java技术栈应用 支持在控制台和CLI内将Java技术栈的应用托管至Web+。 新增 设置Java开发环境 使用Spring Boot开发应用 向Java应用的部署环境中添加RDS实例 支持Tomcat技术栈应用 支持在控制台和CLI内将Tomcat技术栈的应用托管至Web+。 新增 项目文件夹结构设置 使用Web+部署Tomcat应用 日志和诊断 支持下载日志和诊断信息排查问题。 新增 查看日志 支持控制台部署 可以在控制台快速创建应用并部署。 新增 在Web+控制台快速部署应用 支持CLI部署 可以使用CLI快速创建应用并部署。 新增 使用CLI快速部署Java应用
1934890530796658 2020-03-23 15:41:58 0 浏览量 回答数 0

回答

作为一个跨平台的桌面应用开发框架,Electron 的迷人之处在于,它是建立在 Chromium 和 Node.js 之上的 —— 二位分工明确,一个负责界面,一个负责背后的逻辑。也不难理解,为什么 Electron 能开发跨平台的桌面应用 了。 但是,不同系统间还是会有很大的差异,需要相应地做一些额外处理,使得打包出的应用在不同系统下都能正常运转。但相比于 80% 都能完全复用的代码,这些成本几乎可以忽略不计。 所以,对 Web 前端开发者来说,用 Electron 开发多平台客户端的成本非常低。 而且,Electron 是基于 Node.js 的,这就意味着,Node 这个大生态下的模块,Electron 都可以用。同时,跨平台也让 Electron 可同时开发 Web 应用和桌面应用,无论是 UI,还是代码,很多资源都可以共享,大幅减少了开发者的工作量。 作为目前非常热门的技术,Electron 在 GitHub 上已经有 7w+ star 了,很多应用都是用 Electron 开发的,比如字节跳动的飞书、Slack、VS Code、Atom、Skype、WhatsApp、支付宝小程序 IDE(蚂蚁开发者工具)等。 与此同时,包括蚂蚁金服、小米、华为、GitHub、微软在内的很多大厂都在使用 Electron。因此,学好 Electron 是你日后跳槽加薪的加分项,毕竟,大厂都在用。 如何深入理解,并高效使用 Electron? 用 Electron 写一个简单的桌面端应用并不难,有一定 JavaScript 基础的话,可能只要半小时。但要做一个项目,就没那么容易了: 第一,涉及技能栈众多。我们不仅要了解 Electron、客户端知识,还要在客户端中使用 Node.js,甚至是集成 C++、Rust 等三方库,涉及多进程等概念,对基础薄弱的前端工程师来说有些难度。 第二,基建缺乏,工程化建设难以落地。Electron 基建在大部分公司都比较缺乏,依赖 Web、手机客户端的基建无法满足 Electron 业务,比如在 Mac 端打包可以依赖 iOS 持续集成,但 Windows 端则不行,类似场景非常之多。 第三,欠缺充分利用好 Electron 的能力。在开发 Electron 应用时,很多 Web 前端工程师会习惯性地局限于浏览器开发思维中,做出的交互和体验与 Web 应用一样,不知如何释放自己的想象力,并发挥客户端的作用。 其实,以上这些问题,我都遇到过。我所负责的美团大象,早在 2016 年就开始用 Electron 技术构建桌面端了,是美团最早一批用 Electron 做大型项目的团队。 那会儿,我们从 0 开始探索 Electron 的工程化建设,从组内小 Demo 到全公司的桌面客户端,搭建了 Electron 更新、崩溃治理、异常监控等多项基础服务。凭借这些实战经验,我帮很多兄弟团队实现了 Electron 技术从无到有的落地过程。 当然,在这期间,我们也遇到了很多问题。在解决问题的过程中,我经常思考:如何让 Web 前端同学 在工程中快速开发、最大程度地发挥 Electron 的作用,为业务带来更好的体验,创造更大的价值。
茶什i 2020-01-10 15:19:27 0 浏览量 回答数 0

问题

函数计算

函数计算 1、 什么是函数计算? 2、 函数计算使用流程是怎样的? 3、 函数计算如何使用控制台创建函数? 4、 函数计算如何使用Fun创建函数? 5、 函数计算如何使用VSCode插...
黄一刀 2020-04-04 03:07:45 80 浏览量 回答数 1

问题

【精品问答】大数据计算技术1000问

为了方便大数据开发者快速找到相关技术问题和答案,开发者社区策划了大数据计算技术1000问内容,包含Flink、Spark等流式计算(实时计算)、离线计算、Hbase等实践中遇到的技术问...
问问小秘 2019-12-01 21:57:13 6895 浏览量 回答数 2

问题

基于Swarm mode 的极简Serverless实践

函数计算(FaaS)是目前最新的云服务模式,阿里云容器服务基于 swarm mode 集群上实现了一个极简的Serverless 框架,支持将任意 Unix 进程作为函数实现来对外提供...
反向一觉 2019-12-01 21:23:17 1934 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。
有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板