阅读更多

0顶
2踩

企业架构

转载新闻 什么样的RPC才是好用的RPC

2016-09-01 09:13 by 副主编 mengyidan1988 评论(6) 有11769人浏览
本文来自:CSDN博客
作者:qicosmos

现在RPC框架很多,但是真正好用的RPC却是少之又少。那么什么是好用的RPC,什么是不好用的RPC呢,有一个评判标准吗?下面是我列举出来的衡量RPC好用与否的几条标准:
引用
真的像本地函数一样调用
使用简单,用户只需要关注业务即可
灵活,RPC调用的序列化方式可以自由定制,比如支持json,支持msgpack等方式

下面来分别解释这几条标准。

标准1:真的像本地函数一样调用

RPC的本质是为了屏蔽网络的细节和复杂性,提供易用的api,让用户就像调用本地函数一样实现远程调用,所以RPC最重要的就是“像调用本地函数一样”实现远程调用,完全不让用户感知到底层的网络。真正好用的RPC接口,他的调用形式是和本地函数无差别的,但是本地函数调用是灵活多变的。服务器如果提供和客户端完全一致的调用形式将是非常好用的,这也是RPC框架的一个巨大挑战

标准2:使用简单,用户只需要关注业务即可

RPC的使用简单直接,非常自然,就是和调用本地函数一样,不需要写一大堆额外代码,用户只用写业务逻辑代码,而不用关注框架的细节,其他的事情都由RPC框架完成。

标准3:灵活,RPC调用的序列化方式可以自由定制

RPC调用的数据格式支持多种编解码方式,比如一些通用的json格式、msgpack格式或者boost.serialization等格式,甚至支持用户自己定义的格式,这样使用起来才会更灵活。

RPC框架评估

下面根据这几个标准来评估一些国内外知名大公司的RPC框架,这些框架的用法在github的wiki中都有使用示例,使用示例代码均来自官方提供的例子。

谷歌gRPC

gRPC最近发布了1.0版本,他是谷歌公司用c++开发的一个RPC框架,并提供了多种客户端。

协议定义
先定义一个.proto的文件,例如

    // Obtains the feature at a given position.
    rpc GetFeature(Point) returns (Feature) {}
定义了一个服务接口,接收客户端传过来的Point,返回一个Feature,接下来定义protocol buffer的消息类型,用于序列化/反序列化

    message Point {
      int32 latitude = 1;
      int32 longitude = 2;
    }

服务器代码
class RouteGuideImpl final : public RouteGuide::Service {
    Status GetFeature(ServerContext* context, const Point* point, Feature* feature) override {
          feature->set_name(GetFeatureName(*point, feature_list_));
          feature->mutable_location()->CopyFrom(*point);
          return Status::OK;
    }
}

void RunServer(const std::string& db_path) {
  std::string server_address("0.0.0.0:50051");
  RouteGuideImpl service(db_path);

  ServerBuilder builder;
  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  builder.RegisterService(&service);
  std::unique_ptr<Server> server(builder.BuildAndStart());
  std::cout << "Server listening on " << server_address << std::endl;
  server->Wait();
}

客户端代码
bool GetOneFeature(const Point& point, Feature* feature) {
    ClientContext context;
    Status status = stub_->GetFeature(&context, point, feature);
    if (!status.ok()) {
      std::cout << "GetFeature rpc failed." << std::endl;
      return false;
    }
    if (!feature->has_location()) {
      std::cout << "Server returns incomplete feature." << std::endl;
      return false;
    }

    return true;
}

评价

gRPC调用的序列化用的是protocal buffer,RPC服务接口需要在.proto文件中定义,使用稍显繁琐。根据标准1,gRPC并没有完全实现像本地调用一样,虽然很接近了,但做不到,原因是RPC接口中必须带一个Context的参数,并且返回类型必须是Status,这些限制导致gRPC无法做到像本地接口一样调用。
根据标准2,gRPC的使用不算简单,需要关注诸多细节,比如Context和Status等框架的细节。根据标准3,gRPC只支持pb协议,无法扩展支持其他协议。

综合评价:70分。

百度sofa-pbRPC

sofa-pbRPC是百度用c++开发的一个RPC框架,和gRPC有点类似,也是基于protocal buffer的,需要定义协议。

协议定义
// 定义请求消息 
message EchoRequest { 
required string message = 1; 
}

// 定义回应消息
message EchoResponse {
    required string message = 1;
}

// 定义RPC服务,可包含多个方法(这里只列出一个)
service EchoServer {
    rpc Echo(EchoRequest) returns(EchoResponse);
}

服务器端代码
#include <sofa/pbrpc/pbrpc.h>  // sofa-pbrpc头文件
#include "echo_service.pb.h"   // service接口定义头文件
class EchoServerImpl : public sofa::pbrpc::test::EchoServer
{
public:
    EchoServerImpl() {}
    virtual ~EchoServerImpl() {}

private:
    virtual void Echo(google::protobuf::RpcController* controller,
                      const sofa::pbrpc::test::EchoRequest* request,
                      sofa::pbrpc::test::EchoResponse* response,
                      google::protobuf::Closure* done)
    {
        sofa::pbrpc::RpcController* cntl =
            static_cast<sofa::pbrpc::RpcController*>(controller);
        SLOG(NOTICE, "Echo(): request message from %s: %s",
            cntl->RemoteAddress().c_str(), request->message().c_str());
        response->set_message("echo message: " + request->message());
        done->Run();
    }
};
注意:

服务完成后必须调用done->Run(),通知RPC系统服务完成,触发发送Response;
在调了done->Run()之后,Echo的所有四个参数都不再能访问;
done-Run()可以分派到其他线程中执行,以实现了真正的异步处理;

客户端代码
int main()
{
    SOFA_PBRPC_SET_LOG_LEVEL(NOTICE);

    // 定义RpcClient对象,管理RPC的所有资源
    // 通常来说,一个client程序只需要一个RpcClient实例
    // 可以通过RpcClientOptions指定一些配置参数,譬如线程数、流控等
    sofa::pbrpc::RpcClientOptions client_options;
    client_options.work_thread_num = 8;
    sofa::pbrpc::RpcClient rpc_client(client_options);

    // 定义RpcChannel对象,代表一个消息通道,需传入Server端服务地址
    sofa::pbrpc::RpcChannel rpc_channel(&rpc_client, "127.0.0.1:12321");

    // 定义EchoServer服务的桩对象EchoServer_Stub,使用上面定义的消息通道传输数据
    sofa::pbrpc::test::EchoServer_Stub stub(&rpc_channel);

    // 定义和填充调用方法的请求消息
    sofa::pbrpc::test::EchoRequest request;
    request.set_message("Hello world!");
// 可以通过RpcClientOptions指定一些配置参数,譬如线程数、流控等
    sofa::pbrpc::RpcClientOptions client_options;
    client_options.work_thread_num = 8;
    sofa::pbrpc::RpcClient rpc_client(client_options);

    // 定义RpcChannel对象,代表一个消息通道,需传入Server端服务地址
    sofa::pbrpc::RpcChannel rpc_channel(&rpc_client, "127.0.0.1:12321");

    // 定义EchoServer服务的桩对象EchoServer_Stub,使用上面定义的消息通道传输数据
    sofa::pbrpc::test::EchoServer_Stub stub(&rpc_channel);

    // 定义和填充调用方法的请求消息
    sofa::pbrpc::test::EchoRequest request;
    request.set_message("Hello world!");

    // 定义方法的回应消息,会在调用返回后被填充
    sofa::pbrpc::test::EchoResponse response;

    // 定义RpcController对象,用于控制本次调用
    // 可以设置超时时间、压缩方式等;默认超时时间为10秒,默认压缩方式为无压缩
    sofa::pbrpc::RpcController controller;
    controller.SetTimeout(3000);
// 发起调用,最后一个参数为NULL表示为同步调用
    stub.Echo(&controller, &request, &response, NULL);

    // 调用完成后,检查是否失败
    if (controller.Failed()) {
        // 调用失败后的错误处理,譬如可以进行重试
        SLOG(ERROR, "request failed: %s", controller.ErrorText().c_str());
    }

    return EXIT_SUCCESS;
}

评价

sofa-pbRPC的使用并没有像sofa这个名字那样sofa,根据标准1,服务端的RPC接口比gRPC更加复杂,更加远离本地调用了。根据标准2,用户要做很多额外的事,需要关注框架的很多细节,比较难用。根据标准3,同样只支持pb协议,无法支持其他协议。

综合评价:62分。

腾讯Pebble

腾讯开源的Pebble也是基于protocal buffer的,不过他的用法比gRPC和sofaRPC更好用,思路都是类似的,先定义协议。

协议定义
struct HeartBeatInfo {
  1: i64 id,
  2: i32 version = 1,
  3: string address,
  4: optional string comment,
}

service BaseService {

   i64 heartbeat(1:i64 id, 2:HeartBeatInfo data),

   oneway void log(1: string content)

}

服务器端代码
class BaseServiceHandler : public BaseServiceCobSvIf {
public:

    void log(const std::string& content) {
        std::cout << "receive request : log(" << content << ")" << std::endl;
    }
};

int main(int argc, char* argv[]) {
    // 初始化RPC
    pebble::rpc::Rpc* rpc = pebble::rpc::Rpc::Instance();
    rpc->Init("", 0, "");

    // 注册服务
    BaseServiceHandler base_service;
    rpc->RegisterService(&base_service);

    // 配置服务监听地址
    std::string listen_addr("tcp://127.0.0.1:");
    if (argc > 1) {
        listen_addr.append(argv[1]);
    } else {
        listen_addr.append("8200");
    }
// 添加服务监听地址
    rpc->AddServiceManner(listen_addr, pebble::rpc::PROTOCOL_BINARY);

    // 启动server
    rpc->Serve();

    return 0;
}

客户端代码
// 初始化RPC
pebble::rpc::Rpc* rpc = pebble::rpc::Rpc::Instance();
rpc->Init("", -1, "");

// 创建rpc client stub
BaseServiceClient client(service_url, pebble::rpc::PROTOCOL_BINARY);

// 同步调用
int ret = client.log("pebble simple test : log");
std::cout << "sync call, ret = " << ret << std::endl;

评价

Pebble比gRPC和sofa-pbrpc更好用,根据标准1,调用方式和本地调用一致了,接口中没有任何限制。根据标准2,除了定义协议稍显繁琐之外已经比较易用了,不过服务器在使用上还是有一些限制,比如注册服务的时候只能注册一个类对象的指针,不能支持lambda表达式,std::function或者普通的function。根据标准3,gRPC只支持pb协议,无法扩展支持其他协议。

综合评价:75分。

apache msgpack-RPC

msgpack-RPC是基于msgpack定义的RPC框架,不同于基于pb的RPC,他无需定义专门的协议。

服务器端代码
#include <jubatus/msgpack/rpc/server.h>

class myserver : public msgpack::rpc::server::base {
public:
    void add(msgpack::rpc::request req, int a1, int a2)
    {
        req.result(a1 + a2);
    }

public:
    void dispatch(msgpack::rpc::request req)
    try {
        std::string method;
        req.method().convert(&method);

        if(method == "add") {
            msgpack::type::tuple<int, int> params;
            req.params().convert(&params);
            add(req, params.get<0>(), params.get<1>());

        } else {
            req.error(msgpack::rpc::NO_METHOD_ERROR);
        }

    } catch (msgpack::type_error& e) {
        req.error(msgpack::rpc::ARGUMENT_ERROR);
        return;
} catch (std::exception& e) {
        req.error(std::string(e.what()));
        return;
    }
};

客户端代码
#include <jubatus/msgpack/rpc/client.h>
#include <iostream>

int main(void)
{
    msgpack::rpc::client c("127.0.0.1", 9090);
    int result = c.call("add", 1, 2).get<int>();
    std::cout << result << std::endl;
}

评价

msgpack-RPC使用起来也很简单,不需要定义proto文件,根据标准1,客户端的调用和本地调用一致,不过,服务器的RPC接口有一个msgpack::rpc::request对象,并且也必须派生于base类,使用上有一定的限制。根据标准2,服务器端提供RPC服务的时候需要根据method的名字来dispatch,这种方式不符合开闭原则,使用起来有些不方便。根据标准3,msgpack-rpc只支持msgpack的序列化,不能支持其他的序列化方式。

综合评价:80分。

总结

目前虽然国内外各大公司都推出了自己的RPC框架,但是真正好用易用的RPC框架却是不多的,这里对各个厂商的RPC框架仅从好用的角度做一个评价,一家之言,仅供参考,希望可以为大家做RPC的技术选型的时候提供一些评判依据。
0
2
评论 共 6 条 请登录后发表评论
6 楼 andot 2016-11-29 09:11
标准1:真的像本地函数一样调用
标准2:使用简单,用户只需要关注业务即可
标准3:灵活,RPC调用的序列化方式可以自由定制

我觉得上面三个标准中,前两个说的不错,但是第三个我觉得说的不对。RPC在互通性上来说,在于协议的统一,而不在于使用什么序列化方式。如果RPC协议不一致,即使采用相同的序列化方式,仍然不能互通。所以第三个标准,我认为应该去掉,而改为下面三个标准:

标准3:是否能够支持不同的传输协议(HTTP、TCP、WebSocket 等)。
标准4:是否能够方便的跨语言互通。
标准5:服务器端和客户端是否能够做到充分的解耦合。

我觉得在这方面做得最好的 RPC,当属 hprose 了。
5 楼 panshunchang 2016-09-03 13:36
能跨跃防火墙吗?
4 楼 lovexiu1111 2016-09-02 18:01
最好的是满足自己需求的,比如我们是全java技术栈的,所以我们就自己实现了一套。
3 楼 g21121 2016-09-02 15:19
应该叫c++的rpc
2 楼 bocar 2016-09-02 10:26
阿里的Dubbo在哪里?
1 楼 netkiller.github.com 2016-09-01 13:25
都不好,这样才好。
1.支持各种序列化,反序列化
2.跟本地class 一样调用。而不是 call('name','param')
3.要支持各种协议,TCP,UDP,消息队列

class test extend framework{
    public int a, b;
    public string add(a, b){
        this.a =a; this.b=b;
        return a +b 
    }
}


客户端
client = new Client(192.168.0.1)
print client.add(11,11)
print client.a



要能这样访问才是好RPC, 除了实例化设置了IP地址,其他用法跟本地实例化对象 100
% 一样。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 性能基础之常见RPC框架浅析

    在性能基础之浅谈常见接口性能压测一文中我们有简单介绍常见的RPC接口,本文将单篇详细介绍RPC框架。RPC(RemoteProcedureCall)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络...

  • 什么样的 RPC 才是好用的 RPC

    那么什么是好用的RPC,什么是不好用的RPC呢,有一个评判标准吗?下面是我列举出来的衡量RPC好用与否的几条标准: 真的像本地函数一样调用 使用简单,用户只需要关注业务即可 灵活,RPC调用的序列化方式可以自由定制...

  • 什么是RPC?RPC框架dubbo的核心流程

    RPC 框架的目标就是让远程服务调用更简单、透明,由 RPC 框架负责屏蔽底层的序列化、传输方式和通信的细节,开发者在使用时只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用...

  • 什么是RPC? RPC是什么?

    什么是RPC 以下摘自百度百科 远程过程调用协议 RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底&gt;层网络技术的协议。RPC协议假定某些传输协议的...

  • RPC服务与HTTP服务的区别是什么

    1、什么是RPCRPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息...

  • 一文带你搞懂RPC到底是个啥

    linux服务器开发相关视频解析: 大厂面试rpc必问的几个问题 ...RPC还有什么特点,常见的选型有哪些? 1. RPC是什么 RPC可以分为两部分:用户调用接口 + 具体网络协议。前者为开发者需要关心的,后者由框

  • 你说说RPC的一个请求的流程是怎么样的?

    面试的时候经常被问到RPC相关的问题,例如:你说说RPC实现原理、让你实现一个RPC框架应该考虑哪些地方、RPC框架基础上发起一个请求是怎样一个流程等等。所以这次我就总结一波RPC的相关知识点,提前说明一下,本篇...

  • RPC 详解

    声明:本文转载自老卫的博客 什么是 RPC RPC 是远程过程调用(Remote Procedure Call)的缩写形式,Birrell 和 Nelson 在 1984 发表于 ACM Transactions on Computer Systems 的论文《Implementing remote procedure...

  • 什么是RPC

    RPC(远程过程调用)是什么 简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。 RPC 会隐藏底层的通讯细节(不需要直接处理...

  • 技巧:用JAX-RPC发送与接收SOAP消息

    最基本的操作就是对一个URL流执行println,不过这要求您理解太多有关SOAP协议的知识,并且要知道某个服务期望收到的SOAP消息是什么样,发出的又是什么样。我们无法很方便地从服务本身获得这些信息,因此这种方法的可...

  • 什么是 RPC 框架

    首先了解什么叫RPC,为什么要RPC,RPC(Remote Procedure Call Protocol) 是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能...

  • postman rpc本地调用_gRPC系列(一) 什么是RPC?

    本系列分为四大部分:gRPC系列(一) 什么是RPC?gRPC系列(二) 如何用Protobuf组织内容gRPC系列(三) 如何借助HTTP2实现传输gRPC系列(四) 框架如何赋能分布式系统 (尽情期待)初步印象RPC的语义是远程过程调用,在一般的...

  • 有了HTTP,为什么还要RPC?

    RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说RPC服务和HTTP服务。

  • 有了HTTP,为什么还要RPC

    rpc于tcp的区别

  • Google已经推出了Google VR SDK,

    VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

  • 基于51单片机的自动循迹、蓝牙遥控,超声波避障的智能小车+全部资料+详细文档(高分项目).zip

    【资源说明】 基于51单片机的自动循迹、蓝牙遥控,超声波避障的智能小车+全部资料+详细文档(高分项目).zip基于51单片机的自动循迹、蓝牙遥控,超声波避障的智能小车+全部资料+详细文档(高分项目).zip基于51单片机的自动循迹、蓝牙遥控,超声波避障的智能小车+全部资料+详细文档(高分项目).zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

  • 整合了在Unity开发过程中自主开发的实用代码,如摄影机操作,角色操作,控制器交互等。涵盖3D游戏到VR领域。.zip

    VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

  • 基于GPT-SoVITS的视频剪辑快捷配音工具.zip

    基于GPT-SoVITS的视频剪辑快捷配音工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

  • node-v4.3.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics