日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

架構(gòu)選型之Nodejs與Java

 instl 2019-03-15

前言:

 

身邊越來越多的同事談?wù)揘odejs,談其異步IO、事件回調(diào)、前后臺統(tǒng)一一門語言,創(chuàng)業(yè)的朋友的第一個(gè)創(chuàng)業(yè)項(xiàng)目也選擇了Nodejs,期望能夠使用一種語言節(jié)省成本快速完成需求開發(fā)。與其他項(xiàng)目組的同事聊項(xiàng)目選型Java時(shí)被他們嘲笑了一把,怎么這么不與時(shí)俱進(jìn)怎么還在用Java。而且發(fā)現(xiàn),越來越多的前端同事通過Nodejs輕松上手后端功能開發(fā),作為后端開發(fā)工程師倍感壓力。

借新項(xiàng)目的機(jī)會系統(tǒng)了解了下Nodejs的知識體系,本文對了解到的Nodejs技術(shù)作了總結(jié),同時(shí)將其與Java的相關(guān)技術(shù)進(jìn)行了總結(jié)對比,為其他考慮兩種語言選型的架構(gòu)師提供選型的決策依據(jù)。為了避免爭議,本文避免對選型語言的推薦,也不對未來的發(fā)展趨勢做出預(yù)測。

 

語言背景分析:

 

簡單對兩門語言進(jìn)行“拼爹”對比,發(fā)現(xiàn)有技術(shù)深度的事情還是博士比較擅長,計(jì)算機(jī)專業(yè)的技術(shù)又未必是計(jì)算機(jī)專業(yè)的人貢獻(xiàn):

Nodejs

 

Java

 

Ryan Dahl,非科班出身,數(shù)學(xué)系讀博士
2006開始學(xué)習(xí)網(wǎng)站開發(fā),2年后成為高性能Web服務(wù)器專家,3年后創(chuàng)建Node

 

2009年的2月開始開發(fā)Node,年底發(fā)表關(guān)于Node.js的演講

 

2010年由創(chuàng)業(yè)公司Joyent贊助開發(fā)

 

2013年更新緩慢、活躍度降低,糾結(jié)于穩(wěn)定內(nèi)核及新特性開發(fā)

 

2014年8月幾個(gè)重要core contributor發(fā)起組織(io.js前身),此后高速發(fā)展,新功能激進(jìn)、高速版本迭代、問題反饋快速回復(fù)解決,2015年5月Node.js項(xiàng)目和io.js項(xiàng)目都將加入Node.js基金會,io.js繼續(xù)發(fā)展的同時(shí)進(jìn)行合并,Nodejs的下一個(gè)版本將跨1.0直接到2.0

 

詹姆斯·高斯林,卡內(nèi)基·梅隆大學(xué)計(jì)算機(jī)博士,編寫了多處理器版本的Unix操作系統(tǒng),是JAVA的創(chuàng)始人。

 


1995年5月23日,Java語言誕生

 

1996年1月,第一個(gè)JDK-JDK1.0誕生

 

1997年9月,JavaDeveloperConnection社區(qū)成員超過十萬

 

1998年2月,JDK1.1被下載超過2,000,000次

 

2009-04-20甲骨文74億美元收購Sun。取得Java的版權(quán);

 


2014年3月19日,甲骨文公司發(fā)布Java 8.0的正式版。

 


2000年~今,編程語言排行榜一直在第一第二位

 

 

語言及SDK分析:

Nodejs選擇javascript語法導(dǎo)致了其靈活、面向過程、單進(jìn)程單線程執(zhí)行的基本特性。然而得意其語言的靈活性,一些面向?qū)ο蟮奶卣饕部梢酝ㄟ^邏輯代碼實(shí)現(xiàn),但受阻于ECMAScript的發(fā)展速度,整體上Nodejs向企業(yè)級應(yīng)用語法轉(zhuǎn)型還暫時(shí)較慢。Nodejs主打的異步IO事件回調(diào)使其更適合服務(wù)器的編程,其單進(jìn)程單線程的特質(zhì)使得開發(fā)變得簡單。得意與社區(qū)的活躍語言處于高速發(fā)展、SDK不斷地發(fā)展穩(wěn)定豐富。

相比之下,Java是面向?qū)ο蟮木邆淞嗣嫦驅(qū)ο蟮娜刻卣?,?jīng)歷了20年的發(fā)展沉淀越發(fā)的強(qiáng)大、穩(wěn)健。與Nodejs相比Java是個(gè)在各個(gè)領(lǐng)域作精作深的技術(shù)巨人,然而也正因如此,學(xué)習(xí)Java的成本要比Nodejs高很大一個(gè)臺階,每一個(gè)小的技術(shù)方面都能找到很厚的一本書來。面對異步IO事件回調(diào)的新技術(shù)Java也在其新的SDK中提供支持與時(shí)俱進(jìn),相關(guān)Java的開源項(xiàng)目也及時(shí)跟進(jìn)。

對比項(xiàng)

 

Nodejs

 

Java

 

函數(shù)式編程

 

非常自由,可以調(diào)用、作為參數(shù)、作為返回值

 

支持高階函數(shù)、偏函數(shù)用法

 

Java8中支持了Lambda表達(dá)式實(shí)現(xiàn)函數(shù)編程與時(shí)俱進(jìn)

 

類、接口、抽象類

 

原生不支持,本身是面向過程的,可利用函數(shù)實(shí)現(xiàn)類的定義能力。
ECMAScript 5引入Object.create(),類即對象,主流瀏覽器最新版本支持
ECMAScript 6引入class語法,2015年6月計(jì)劃發(fā)布,還需腳本引擎開發(fā)支持
無接口、抽象類的概念,可以利用語言的靈活實(shí)現(xiàn)類似接口的特性能力,較為復(fù)雜

 

原生支持,面向?qū)ο笳Z言基本能力,依賴接口編程降低耦合

 

封裝、繼承、多態(tài)

 

原生不支持
利用函數(shù)實(shí)現(xiàn)類似“類”的封裝,利用prototype實(shí)現(xiàn)類似繼承的能力,無多態(tài)能力
ECMAScript 6引入繼承語法,2015年6月計(jì)劃發(fā)布,還需腳本引擎開發(fā)支持
Nodejs中有繼承的概念,但非語言級別的支持
沒有多態(tài)的能力

 

原生支持,面向?qū)ο笳Z言基本能力

 

動態(tài)

 

需要重啟或者重新加載

 

依靠jvm的字節(jié)碼和內(nèi)存管理技術(shù),可以實(shí)現(xiàn)動態(tài)編譯、動態(tài)鏈接、動態(tài)加載、動態(tài)變更替換、熱部署

 

異常

 

支持,由于異步IO事件回調(diào)導(dǎo)致異常捕獲較為復(fù)雜。V8不會優(yōu)化含有try/catch的函數(shù)又導(dǎo)致過多捕獲異常產(chǎn)生性能問題。

 

全局捕獲uncaughtException會丟失堆棧通常為時(shí)已晚。

 

Domain機(jī)制當(dāng)前還不穩(wěn)定。

 

支持,相對更成熟完善些,單線程異常不影響其他線程。

 

算法與數(shù)據(jù)結(jié)構(gòu)

 

Node本身提供的較為簡單,但開源社區(qū)相關(guān)代碼高速發(fā)展中

 

比較穩(wěn)定完善

 

集合Set\Map\List

 

api能力較弱,ECMAScript 6引入Set和Map,2015年6月計(jì)劃發(fā)布,還需腳本引擎開發(fā)支持

 

完善豐富的集合容器,支持各種并發(fā)場景、業(yè)務(wù)特殊算法場景

 

事件回調(diào)與異步IO

 

語言級別支持,Nodejs殺手锏能力。

 

監(jiān)聽器模式實(shí)現(xiàn)事件回調(diào),利用事件隊(duì)列解決雪崩問題
利用事件機(jī)制充分利用異步IO突破單線程編程模型的性能瓶頸
通過異步機(jī)制使請求之間無阻塞,達(dá)到并行請求的目的,有效的調(diào)用下層資源
Linux采用線程池與阻塞I/O模擬出來的異步I/O(libeio)
Windows使用其獨(dú)有的內(nèi)核異步IO方案:IOCP

 

1.4版本開始提供NIO工具包實(shí)現(xiàn)同步非阻塞IO
1.7版本NIO2.0提供了異步IO的支持,支持異步IO回調(diào)接口

 

進(jìn)程、線程

 

單線程單進(jìn)程模式,開發(fā)成本低。
高效CPU利用需要部署多個(gè)Node.js進(jìn)程,相對較為耗費(fèi)資源,通信成本較高
單進(jìn)程帶來的穩(wěn)定性可靠性問題通過負(fù)載均衡、自殺重啟提升

 

支持多線程編程,支持并發(fā)控制,較為復(fù)雜,需要有并發(fā)開發(fā)經(jīng)驗(yàn)
相對單進(jìn)程可靠性更高、更加靈活

 

網(wǎng)絡(luò)編程、WEB開發(fā)

 

可以十分方便地搭建網(wǎng)絡(luò)服務(wù)器
提供多個(gè)模塊快速搭建服務(wù)端和客戶端,TCP/UDP/HTTP/WebSocket
本身就是個(gè)好的WEB開發(fā)框架,無須切換語言環(huán)境,但也容易造成前后端Js代碼混淆

 

提供的還是底層API能力,由各個(gè)開源項(xiàng)目實(shí)現(xiàn)強(qiáng)大而專業(yè)的網(wǎng)絡(luò)編程框架及WEB開發(fā)框架

 

組件模塊、分包分層

 

package.json集合文件夾定義包,包內(nèi)部可定義多個(gè)模塊

 

通過package、類、ClassLoader、壓縮包實(shí)現(xiàn)多維度多層次的劃分和復(fù)用的能力
OSGI框架實(shí)現(xiàn)插件化、熱部署

 

注解、反射、泛型

 

 

原生支持

 

擴(kuò)展性

 

支持C/C++編寫的邏輯擴(kuò)展

 

支持C/C++/及其他可被JVM執(zhí)行語言編寫的邏輯擴(kuò)展

 

 

三方開源框架選型:

 

語言選型后面即框架選型,好的框架可以去除很多不必要的重復(fù)工作使項(xiàng)目輕松獲取強(qiáng)大的功能。當(dāng)然三方開源框架的引入也帶來的相應(yīng)的學(xué)習(xí)成本,同樣的,Nodejs框架由于發(fā)展時(shí)間相對較短學(xué)習(xí)成本相對較低,開發(fā)人員更容易了解到更多底層的實(shí)現(xiàn)源碼,但相對的部分框架容易出現(xiàn)穩(wěn)定性兼容性問題,加之NPM開發(fā)人員水平不一而又沒有很好的審核機(jī)制,選擇一些模塊(尤其是C/C++模塊)時(shí)需要慎重。Java三方開源框架大都已被大量企業(yè)大量使用、成熟穩(wěn)定,提供強(qiáng)大能力的同時(shí)作了很好的封裝分層,開發(fā)人員付出較高的學(xué)習(xí)成本后更多的是“傻瓜“式的使用。就WEB開發(fā)體系而言,兩者都可以找到很多可服用引入的開源框架。

對比項(xiàng)

 

Nodejs

 

Java

 

數(shù)據(jù)庫

 

針對不同數(shù)據(jù)庫類型引入不同的驅(qū)動模塊,Mongoose/reids/mysql

 

可以針對不同的數(shù)據(jù)庫引入不同的驅(qū)動模塊,也可以使用多個(gè)開源框架,降低數(shù)據(jù)庫使用成本、不同數(shù)據(jù)源的遷移成本:
hibernate/ibatis等等

 

MVC框架開發(fā)WEB

 

Express/Koa:輕量靈活快速地搭建網(wǎng)站,支持多種模板,利用generatora解決了繁瑣的回調(diào)嵌套

 

相關(guān)框架均較為成熟可靠,典型的有:
Structs:發(fā)展長達(dá)9年,穩(wěn)定成熟,面對一些新的框架只能作為稍穩(wěn)妥的選擇
Srping MVC:為解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建,輕量、控制反轉(zhuǎn)、面向切面
阿里內(nèi)WebX,其他的開源框架還有很多
Web容器也多種選擇:tomcat\jetty\jboss等等,隨著java支持nio也持續(xù)發(fā)展

 

前端模板

 

EJS:強(qiáng)大易用,語法更接近前端語言。Jade語法更接近后端語言,功能更強(qiáng)大

 

Velocity:基于java的模板引擎,阿里主流選擇,內(nèi)部進(jìn)行了性能優(yōu)化,支撐住了淘寶天貓的大流量
其他:FreeMarker、Jamon、JDynamiTe、Jbyte等

 

Rest開發(fā)

 

Restify:Rest應(yīng)用框架,支持服務(wù)器端和客戶端,專注Rest服務(wù)

 

JAX-RS:提供了一些標(biāo)注將一個(gè)資源類、一個(gè)POJO Java類封裝為Web資源。
Axis2:Apache項(xiàng)目,同時(shí)支持SOAP和REST風(fēng)格的Web Service。 
Cetia4:基于Servlet API開發(fā),可以運(yùn)行于所有的Web容器中

 

Web Socket

 

Socket.IO:跨平臺,多種連接方式自動切換,做即時(shí)通訊方面的開發(fā)很方便

 

Netty:異步的、事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架和工具包

 

日志管理

 

Log4js:簡單易用,winston:功能更強(qiáng)大,稍復(fù)雜

 

Log4j:輸出定制、日志級別格式控制。Slf4j:簡單統(tǒng)一的日志接口

 

HTTP調(diào)用

 

Request:建立各種HTTP請求,支持授權(quán)驗(yàn)證,其實(shí)功能還是非常多的,基本滿足絕大部分需求。

 

HttpClient:Apache Jakarta Common 下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包

 

異步流程控制

 

Async:使異步流程同步化。Q是另外一種非常不錯的選擇,它是實(shí)現(xiàn)了promises接口。

 

asyn4j:異步方法調(diào)用框架,基于消費(fèi)者與生產(chǎn)者模式。包括了異步方法執(zhí)行,異步回調(diào)執(zhí)行,異步工作緩存模塊.支持Spring。

 

定時(shí)任務(wù)

 

Cron:小巧的定時(shí)任務(wù)管理模塊。Later功能強(qiáng)大但稍微復(fù)雜

 

Quartz:可以用來創(chuàng)建簡單或?yàn)檫\(yùn)行上萬個(gè)jobs這樣復(fù)雜的程序,讓作業(yè)變得易用管理

 

其他框架

 

社區(qū)活躍,更新非???,但也容易存在不穩(wěn)定、不兼容的風(fēng)險(xiǎn)。

 

Npm模塊的開發(fā)人員水平不一,暫時(shí)只能依靠口碑、測試文檔等條件選型

 

各種場景均有很多成熟穩(wěn)定開源框架可供選擇,公司內(nèi)部通常也有自己的成熟項(xiàng)目

 

 

產(chǎn)品化分析:

 

就產(chǎn)品化而言,Nodejs雖然在各個(gè)方面都有建設(shè),但相對Java還有很多需要繼續(xù)完善發(fā)展的地方,如系統(tǒng)監(jiān)控和性能分析領(lǐng)域還不如Java體系那么完善,受限于單進(jìn)程單線程模式穩(wěn)定性部署方面還不如Java那么靈活,靈活的腳本語言加上Nodejs發(fā)展時(shí)間相對較短使得系統(tǒng)的安全性還需要經(jīng)受更多的考驗(yàn)。同時(shí),前后端代碼都可以使用到j(luò)s并同時(shí)保存在一個(gè)開發(fā)分支時(shí),單純的依賴目錄去區(qū)分前后端代碼,容易造成前后端代碼的混淆,相對不夠清晰。但相信爭議和問題都是暫時(shí)的,高速發(fā)展的Nodejs會逐步完善完美。

對比項(xiàng)

 

Nodejs

 

Java

 

編碼規(guī)范

 

JSLint/JSHint:定義代碼格式規(guī)范的規(guī)則,統(tǒng)一編碼

 

CheckStyle/FindBug/Code formatter:比較完善,支持持續(xù)集成

 

包管理、構(gòu)建

 

NPM:Nodejs的包管理器,模塊庫發(fā)展是十分神速和活躍
Makefile:linux下,依托強(qiáng)大的bash編程
Grunt:依托豐富的插件,NPM加Grunt媲美輕量級的Maven

 

MAVEN:一個(gè)項(xiàng)目管理和構(gòu)建自動化工具,包含了一個(gè)項(xiàng)目對象模型、一組標(biāo)準(zhǔn)集合、一個(gè)項(xiàng)目生命周期、一個(gè)依賴管理系統(tǒng)、插件,方便、擴(kuò)展性好、功能強(qiáng)大

 

部署

 

腳本方式啟停進(jìn)程進(jìn)行部署
forever/pm2:進(jìn)程容災(zāi)重啟,Linux上支持的較好,

 

WEB項(xiàng)目利用Maven可以打包成一個(gè)war包,直接部署到容器的指定目錄即可。
依賴部分容器的特性可以實(shí)現(xiàn)熱部署,大部分還是去除流量后依靠腳本完成重啟。

 

系統(tǒng)監(jiān)控

 

但針對Nodejs的監(jiān)控技術(shù)還是比較缺乏的,資料也比較缺乏

 

JVM提供虛擬機(jī)各項(xiàng)指標(biāo)的監(jiān)控接口,包括C++和Java的,基于此類接口實(shí)現(xiàn)了很多成熟的監(jiān)控工具,互聯(lián)網(wǎng)公司內(nèi)將很多監(jiān)控能力WEB化

 

性能分析

 

內(nèi)存快照分析:node-heapdump/node-memwatch
Chrome:內(nèi)存快照、CPU Profile

 

基于JVM的工具API實(shí)現(xiàn)有多種性能分析工具,可以分析CPU耗時(shí)分布、CPU調(diào)用鏈、CPU熱點(diǎn)、內(nèi)存分布、內(nèi)存熱點(diǎn)、線程阻塞等等。

 

穩(wěn)定性

 

受限于單進(jìn)程單線程的設(shè)計(jì),穩(wěn)定性需要引入多進(jìn)程來解決,限制較大,相對比較耗費(fèi)資源

 

傳統(tǒng)的多線程、多進(jìn)程、多機(jī)多機(jī)房機(jī)制,靈活選擇部署,穩(wěn)定性已經(jīng)歷過線上的長期考驗(yàn)

 

安全性

 

腳本語言的安全性較弱加上Nodejs的語法靈活性導(dǎo)致編碼時(shí)較容易出現(xiàn)安全問題,已成立Node安全項(xiàng)目有針對性的分析解決Nodejs的安全問題。

 

相對腳本語言安全性較強(qiáng),漏洞經(jīng)過多年分析與解決

 

 

執(zhí)行引擎分析:

 

在瀏覽器方面V8引擎大名鼎鼎贊不絕口,這也是Nodejs選型V8這個(gè)最快的Javascript執(zhí)行引擎的原因。然而另一方面,V8引擎專門針對瀏覽器的設(shè)計(jì)也嚴(yán)重限制了Nodejs在服務(wù)器領(lǐng)域的大有作為,仿佛帶著手鏈腳鏈在高速奔跑。因V8引擎的創(chuàng)始人和技術(shù)都是來自Java虛擬機(jī),使用了部分Java虛擬機(jī)技術(shù)適配瀏覽器業(yè)務(wù)實(shí)現(xiàn),所有相比之下Java虛擬機(jī)更加的成熟完善,也必然相對的復(fù)雜沉重。

對比項(xiàng)

 

Nodejs

 

Java

 

引擎概述

 

V8:最快的JavaScript虛擬機(jī),參考JVM部分核心技術(shù)實(shí)現(xiàn),針對瀏覽器需求場景而專門設(shè)計(jì)優(yōu)化

 

JVM:成熟穩(wěn)定完善的虛擬機(jī)技術(shù)及體系,各個(gè)內(nèi)部模塊算法等都經(jīng)過深入研究形成專業(yè)領(lǐng)域,V8的創(chuàng)始人是原SUN的技術(shù)人員

 

內(nèi)存限制

 

V8專為瀏覽器設(shè)計(jì),最大內(nèi)存占用:64位1.4GB,32位0.7GB,新生代分布對應(yīng)為最大32M和16M(限制可打開,容易造成延遲,不推薦)
不能靈活的使用內(nèi)存,必須嚴(yán)謹(jǐn)?shù)臑槊恳环葙Y源作出安排。

 

可以結(jié)合系統(tǒng)的內(nèi)存情況可以按需要設(shè)置,并且可以根據(jù)業(yè)務(wù)對內(nèi)存的需求靈活設(shè)置調(diào)優(yōu)。

 

垃圾回收

 

模仿JVM的分代回收。新生代晉升條件相對固定,復(fù)制回收。老生代標(biāo)記清除回收(壓縮解決碎片問題)

 

普遍分代回收,有多種垃圾回收算法可供選擇,每個(gè)回收算法有多種參數(shù)可以配置調(diào)優(yōu),持續(xù)發(fā)展更新。

 

內(nèi)存監(jiān)控分析

 

process.memoryUsage查看內(nèi)存概況,os模塊的totalmem()和freemem()查詢系統(tǒng)內(nèi)存使用
--trace_gc打印垃圾回收日志
內(nèi)存快照:V8-profiler/node-heapdump/node-memwatch

 

JVM提供C++和Java的接口可以查詢詳細(xì)的JVM內(nèi)存及系統(tǒng)內(nèi)存信息
可以通過啟動參數(shù)打印回收日志,可以通過jstat命令實(shí)時(shí)查看
可以通過jmap或者多種工具dump內(nèi)存,可以通過memoryAnalyzer等多種工具分析內(nèi)存比對內(nèi)存

 

跨平臺、可移植

 

暫時(shí)只能支撐到Chrome瀏覽器支撐得了的平臺

 

任何虛擬機(jī)支撐的平臺,更為廣泛穩(wěn)定

 

擴(kuò)展性

 

為瀏覽器設(shè)計(jì),擴(kuò)展性相對較差,體系還不夠完善

 

技術(shù)體系比較深,提供多種接口方便三方擴(kuò)展開發(fā)

 

 

其他一些對比:

 

其他一些簡單對比如下:

領(lǐng)域

 

對比項(xiàng)

 

Nodejs

 

Java

 

開發(fā)工具

 

IDE

 

WebStorm

 

Eclipse

 

測試技術(shù)

 

單元測試

 

Mocha/Karma/Jasmine

 

Junit/TestNG/jMock

 

應(yīng)用場景

 

場景

 

服務(wù)器編程,擅長高并發(fā)IO密集型程序項(xiàng)目

 

服務(wù)器編程、大數(shù)據(jù)、企業(yè)開發(fā)、android

 

開發(fā)者

 

來源

 

部分是向后臺開發(fā)試水的前臺人員,部分是被異步I/O吸引的后臺人員

 

大部分還是后臺開發(fā)人員

 

 

結(jié)束:

 

Nodejs的異步IO、事件回調(diào)雖是殺手锏能力,但其他程序開發(fā)語言也都有相應(yīng)的跟進(jìn)支持,但Node成功將前后端統(tǒng)一一門語言開發(fā),這絕對是無人能及,吸引了大批的開發(fā)者加入。得益但又受限于V8引擎,其發(fā)展還帶著包袱,但Nodejs還年輕還處在高速發(fā)展中,相信隨著IO.js與Node.js合并、越來越多的開發(fā)者進(jìn)行共建,Node會越來越穩(wěn)定成熟。

相比之下Java是編程領(lǐng)域的巨人,20年的發(fā)展,越發(fā)的成熟穩(wěn)定,形成完善的體系完善的生態(tài),Android的流程再次將這門語言推到了巔峰,架構(gòu)選型永遠(yuǎn)是個(gè)重點(diǎn)選項(xiàng)。

https://as./articles/54118?spm=5176.100239.blogcont118673.32.8NFfUv

 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多