[깊이 들 어가 서 Node. js 시리즈 1] Node. js 가 뭐야?

10931 단어
1. 이름 부터
Node. js 에 관 한 기술 보도 가 갈수 록 많아 지고 있 습 니 다. Node. js 의 작법 도 다양 합 니 다. NodeJS 라 고 쓰 인 것 도 있 고 Nodejs 라 고 쓰 인 것 도 있 습 니 다. 도대체 어떤 작법 이 가장 표준적 입 니까? 우 리 는 공식 적 인 설 을 따 르 는 것 도 좋 습 니 다.Node. js 공식 홈 페이지 ”Node“ ”Node.js“ 에 서 는 다른 표현 이 발견 되 지 않 았 습 니 다. "Node" 가 가장 많이 사용 되 었 습 니 다. Node 라 는 단어의 뜻 과 용도 가 너무 광범 위 하여 개발 자 들 이 오해 하기 쉽 습 니 다. ——”Node.js“,js Node 다른 이름 은 다양 하고 정확 한 출처 가 없 기 때문에 저 희 는 사용 을 추천 하지 않 습 니 다.
2 노드 는 어떤 문 제 를 해결 하기 위 한 것 입 니까?
Node 가 공개 적 으로 선언 한 목 표 는 “ ” 입 니 다. 현재 서버 프로그램 에 무슨 문제 가 있 습 니까? 수학 문 제 를 풀 겠 습 니 다. 자바 에서™ PHP 와 같은 언어 에 서 는 모든 연결 에 새 스 레 드 가 생 성 됩 니 다. 새 스 레 드 마다 2 MB 의 메모리 가 필요 할 수 있 습 니 다. 8GB RAM 이 있 는 시스템 에 서 는 이론 적 으로 최대 의 병렬 연결 수가 4, 000 명의 사용자 입 니 다. 클 라 이언 트 가 증가 함 에 따라 웹 프로그램 이 더 많은 사용 자 를 지원 하려 면 더 많은 서버 를 추가 해 야 합 니 다.물론 서버 비용, 데이터 비용, 인건비 등 비용 을 증가 시 킬 수 있 습 니 다. 이러한 비용 상승 외 에 도 잠재 적 인 기술 문제 가 있 습 니 다. 즉, 사용자 가 요청 마다 다른 서버 를 사용 할 수 있 기 때문에 모든 공유 자원 은 모든 서버 에서 공유 해 야 합 니 다. , Web ( 、 ) : Node 가 이 문 제 를 해결 하 는 방법 은: 입 니 다. 연결 마다 Node 엔진 프로 세 스 에서 실행 되 는 이 벤트 를 발사 합 니 다. 연결 마다 새로운 OS 스 레 드 를 만 드 는 것 이 아 닙 니 다. Node , , I/O 서버 를 실행 하면 수만 개의 병렬 연결 을 지원 할 수 있 습 니 다.
3 Node. js 는 JS 애플 리 케 이 션 이 아니 라 JS 운영 플랫폼 입 니 다.
Node. js 라 는 이름 을 보면 초보 자 들 은 자바 script 애플 리 케 이 션 이 라 고 착각 할 수 있 습 니 다.자 바스 크 립 트 를 언급 할 때, 여러분 이 가장 먼저 생각 하 는 것 은 일상적으로 사용 하 는 브 라 우 저 입 니 다. 현대 브 라 우 저 는 렌 더 링 엔진, 자 바스 크 립 트 엔진 등 다양한 구성 요 소 를 포함 하고 있 습 니 다. 그 중에서 자 바스 크 립 트 엔진 은 웹 페이지 의 자 바스 크 립 트 코드 를 해석 하 는 일 을 맡 고 있 습 니 다. 웹 전단 에서 가장 중요 한 언어 중 하나 로 서 자 바스 크 립 트 는 전단 엔지니어 의 특허 입 니 다. 단, ,Node.js C++ , Javascript V8 , C++ 간단 한 명령 은 다음 과 같다.
#node helloworld.js

Node. js 는 Google Chrome 브 라 우 저의 V8 엔진 을 사용 하여 파일 조작, 네트워크 프로 그래 밍 등 성능 이 좋 습 니 다. Node.js Javascript 에 비해 Node.js Javascript ( Linux、Windows).
4. Node. js 는 이벤트 구동, 비동기 프로 그래 밍 을 사용 하여 네트워크 서 비 스 를 위해 설계 되 었 다.
이벤트 구동 이라는 단 어 는 낯 설 지 않 습 니 다. 일부 전통 언어의 네트워크 프로 그래 밍 에서 우 리 는 리 셋 함 수 를 사용 합 니 다. 예 를 들 어 socket 자원 이 특정한 상태 에 이 르 렀 을 때 등 록 된 리 셋 함수 가 실 행 됩 니 다. Javascript , Node.js . Net 모듈 의 경우, 그 중의 net. Socket 대상 은 다음 과 같은 사건 이 있 습 니 다. connect, data, end, timeout, drain, error, close 등, Node. js 를 사용 하 는 개발 자 는 자신의 업무 논리 에 따라 해당 하 는 리 셋 함 수 를 등록 해 야 합 니 다. API이 는 코드 구조 에서 이러한 함수 들 이 순서대로 등 록 된 것 처럼 보이 지만 자신 이 나타 난 순서 에 의존 하지 않 고 해당 하 는 사건 이 발생 하 기 를 기다 리 는 것 을 의미한다. 사건 구동, 비동기 프로 그래 밍 의 디자인 은 중요 한 장점 은 시스템 자원 을 충분히 이용 하고 코드 를 실행 하 는 데 어떤 작업 이 완성 되 기 를 기다 리 는 것 을 막 지 않 아 도 된다 는 것 이다. 유한 한 자원 은 다른 작업 에 사용 할 수 있다 는 것 이다.백 엔 드 의 네트워크 서비스 프로 그래 밍 에 적합 한 디자인 입 니 다. Node. js 의 목표 도 여기에 있 습 니 다. 서버 개발 에서 동시 다발 적 인 요청 처 리 는 큰 문제 입 니 다. 차단 식 함 수 는 자원 낭비 와 시간 지연 을 초래 할 수 있 습 니 다. 이벤트 등록, 비동기 함 수 를 통 해 개발 자 는 자원 의 이 용 률 을 높이 고 성능 도 개선 할 수 있 습 니 다.
Node. js 가 제공 하 는 지원 모듈 에서 우 리 는 Javascript , 전통 적 인 언어 와 차이 가 있 습 니 다. 또한 서버 개발 을 편리 하 게 하기 위해 Node. js 의 네트워크 모듈 은 특히 많 습 니 다. HTTP, DNS, NET, UDP, HTTPS, TLS 등 을 포함 하여 개발 자 들 은 이 를 바탕 으로 웹 서버 를 신속하게 구축 할 수 있 습 니 다. 간단 한 helloworld. js 를 예 로 들 면:
//     require()        ,     require()             , JavaScript            。require("http")         http  。var http = require('http');

// http.createServer      ,             web server  ,           ,      。
http.createServer(function (req, res) {
    //   response.writeHead()      HTTP  200 HTTP      (content-type)
    //   response.write()   HTTP         “Hello World"
    res.writeHead(200, {'Content-Type': 'text/plain'});
    //     
    res.end('Hello World
'
); // http.listen() HTTP 。 }).listen(80, "127.0.0.1"); // console.log , firebug ,Node 。 console.log('Server running at http://127.0.0.1:80/');

위의 코드 는 간단 한 http 서버 를 만 들 었 습 니 다.http://127.0.0.1로 컬 에서 80 포트 를 감청 할 수 있 습 니 다. 임의의 http 요청 에 대해 서버 는 머리 상태 코드 200, Content - Type 값 이 'text / plain' 인 'Hello World' 문자 응답 을 되 돌려 줍 니 다. 이 작은 예 에서 몇 가 지 를 알 수 있 습 니 다.
  • Node. js 의 네트워크 프로 그래 밍 이 편리 합 니 다. 제 공 된 모듈 (여기 서 http) 은 손 쉽게 시작 할 수 있 는 API 인 터 페 이 스 를 열 었 습 니 다. 몇 줄 의 코드 만 있 으 면 서버 를 구축 할 수 있 습 니 다.
  • 이벤트 구동, 비동기 프로 그래 밍 을 나타 내 고 createServer 함수 의 매개 변수 에 반전 함수 (자바 script 의 익명 함수 로 구현) 를 지정 합 니 다.http 요청 이 있 을 때 Node. js 는 이 반전 함 수 를 호출 하여 요청 을 처리 하고 응답 합 니 다. 물론 이 예 는 상대 적 으로 간단 하고 이벤트 등록 이 많 지 않 으 며 앞으로 의 글 에서 독자 들 은 더 많은 실제 예 를 볼 수 있 습 니 다.
  • http. createServer 방법 을 사용 할 때, 우 리 는 당연히 포트 를 탐지 하 는 서버 만 을 원 하 는 것 이 아니 라, 서버 가 HTTP 요청 을 받 았 을 때 무엇 을 하 기 를 원 합 니 다. 문 제 는 이것 이 비동기 적 인 것 입 니 다. Node.js , Javascript 서버 를 만 들 었 고, 그것 을 만 드 는 방법 에 함 수 를 전 달 했 습 니 다. Node.js , API 、 왜 이런 시간 구동 이 Node 에 이상 적 입 니까? 익명 함수 와 패 키 지 를 사용 할 수 있 기 때문에 더 중요 한 것 은 코드 를 쓴 사람 은 누구나 문법 을 잘 알 고 있 습 니 다. 이벤트 가 발생 했 을 때 호출 되 는 리 셋 함 수 는 캡 처 이벤트 에서 작성 할 수 있 습 니 다. 코드 를 쉽게 작성 하고 유지 할 수 있 습 니 다. 복잡 한 대상 프레임 워 크 가 없고 인터페이스 가 없 으 며 과도 한 디자인 가능성 이 없습니다. 이 벤트 를 감청 하고 작성 하 십시오.리 턴 함수, 다른 일 은 시스템 에 맡 길 수 있 습 니 다!
    5 Node. js 의 특징
    다음은 Node. js 의 특징 을 말씀 드 리 겠 습 니 다. 이벤트 구동, 비동기 프로 그래 밍 의 특징 은 방금 상세 하 게 말씀 드 렸 습 니 다. 여 기 는 중복 되 지 않 습 니 다. . 창시자 인 Ryan Dahl 의 말 에 따 르 면 성능 은 Node. js 가 고려 하 는 중요 한 요소 이다. Node. js 는 디자인 에 있어 서도 비교적 대담 하 다. 전통 적 인 언어 에 익숙 한 인터넷 서비스 개발 자 들 은 다 중 스 레 드 병행 과 협력 에 익숙 할 수 있 지만 Node. js 에 직면 하여 우 리 는 그 특징 을 받 아들 이 고 이해 해 야 합 니 다. 따라서 우 리 는 이러한 디자인 회 JavaScript 를 추측 할 수 있 습 니까? 눈 에 보 이 는 것 이 사실 입 니 다. 타 오 바 오 공유 데이터 플랫폼 팀 이 Node. js 에 대한 성능 테스트 를 보 는 것 이 좋 지 않 습 니 다.
  • 물리 장치 설정: RHEL 5.2, CPU 2.2GHz, 메모리 4G
  • Node. js 응용 장면: MemCache 대리, 매번 100 바이트 데이터
  • 연결 탱크 크기: 50
  • 동시 다발 사용자 수: 100
  • 테스트 결과 (socket 모드): 메모리 (30m), QPS (16700), CPU (95%)
  • 위의 결 과 를 통 해 알 수 있 듯 이 이러한 테스트 장면 에서 qps 는 16700 회 에 달 할 수 있 고 메모리 가 30m (그 중에서 V8 더 미 는 22M) 만 차지 하 며 CPU 는 95% 에 달 하여 병목 이 될 수 있다. 또한 많은 실천 자 들 이 Node. js 에 대해 성능 분석 을 했 는데 전체적으로 보면 그의 성능 이 사람 을 믿 게 하 는 것 도 인기 의 중요 한 원인 이다. Node.js 현재 제3자 Node. js 다 중 프로 세 스 지원 모듈 이 많이 발표 되 었 습 니 다. 다음 글 은 Node. js 가 다 중 핵 CPU 에서 의 프로 그래 밍 을 상세 하 게 설명 할 것 입 니 다.
    Node. js 의 또 다른 특징 은 지원 하 는 프로 그래 밍 언어 가 자바 script 이라는 것 입 니 다. 동적 언어 와 정적 언어의 장단 점 에 대한 비 교 는 여기에서 더 이상 토론 하지 않 습 니 다. 세 가지 만 말 합 니 다.
  • Javascript 은 전단 엔지니어 의 주력 언어 로 서 기술 커 뮤 니 티 에서 상당 한 호소력 을 가지 고 있다. 또한 웹 기술 의 발전, 특히 전단 의 중요성 이 증가 함 에 따라 많은 전단 엔지니어 들 이 '백 스테이지 애플 리 케 이 션' 을 시험 적 으로 사용 하기 시작 했다. Node. js 를 사용 하 는 많은 기업 에서 엔지니어 들 은 Javascript 에 익숙해 져 서 Node. js 를 선택 했다 고 밝 혔 다.
  • C++ V8 Ruby helloworld 의 예 에서 우 리 는 리 셋 함수 가 익명 함수 의 형식 으로 실현 되 는 것 을 볼 수 있 고 편리 하 다. 패 킷 을 닫 는 역할 이 더욱 크다. 아래 의 코드 예 시 를 보면
    var hostRequest = http.request(requestOptions,f unction(response) {
      var responseHTML =''; 
      response.on('data', function (chunk) {
          responseHTML = responseHTML + chunk;    
      });
      response.on('end',function(){ 
         console.log(responseHTML);
         // do something useful
      });
    });
    
    위의 코드 에서 우 리 는 end 이벤트 에서 responseHTML 변 수 를 처리 해 야 한다. 、 ( , ? Javascript ), Node.js , , http ,Node.js 그리고 data 이벤트 에 대응 하 는 리 셋 함수 에서 값 을 계속 수정 하고 최종 적 으로 end 이벤트 에 접근 하여 처리 합 니 다.
  • 자 바스 크 립 트 는 동적 언어 에서 성능 이 비교적 좋 고 개발 자가 자 바스 크 립 트, Python, Ruby 등 동적 언어 에 대해 성능 분석 을 한 결과 자 바스 크 립 트 의 성능 이 다른 언어 보다 좋 은 데다 가 V8 엔진 도 같은 종류의 백미 이기 때문에 Node. js 의 성능 도 그 중에서 이득 을 보 았 다. Node. js 를 선택 한 데 는 여러 가지 이유 가 있다. 예 를 들 어 취미 와 지역사회 발전 을 고려 한 것 이다 CPU( ?) ( Java OutOfMemory ?).
  • 좋은 웹페이지 즐겨찾기