精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

編寫自己的js運行時第二篇

開發 前端
第一版基于V8實現了一個樸素版的服務器,第二版支持了多進程架構,并且支持了SO_REUSEPORT。本文介紹一下第二版的一些實現,設計上還是比較隨意的,目前主要關注功能。

[[410500]]

前言:第一版基于V8實現了一個樸素版的服務器,第二版支持了多進程架構,并且支持了SO_REUSEPORT。本文介紹一下第二版的一些實現,設計上還是比較隨意的,目前主要關注功能。

首先我們看看第二版怎么使用。

1 通過fork共享端口

  1. const TCPServer = TCP(); 
  2.  
  3. const tcpServer = new TCPServer('127.0.0.1', 8989); 
  4.  
  5. tcpServer.socket(); 
  6. tcpServer.setReusePort(1); 
  7. tcpServer.bind(); 
  8. tcpServer.listen(); 
  9.  
  10. for (let i = 0; i < 3; i++) { 
  11.  
  12.     // 等于0說明是子進程,進入處理連接的邏輯,否則是主進程,循環創建多個進程 
  13.     if (Child_Process.fork() === 0) { 
  14.         while(1) { 
  15.             tcpServer.accept(); 
  16.         }  
  17.     } 
  18.  
  19.  
  20. // 主進程創建完子進程后自己進入阻塞狀態 
  21.  
  22. Child_Process.wait(); 

通過fork共享端口版本的原理是主進程首先創建一個socket并且綁定一個端口。然后通過fork的方式讓多個子進程共享監聽的端口。最后主進程進入阻塞模式。核心實現是fork,我們看看代碼。

  1. static Local<Object> ChildProcess(Isolate * isolate) { 
  2.   Local<ObjectTemplate> target = ObjectTemplate::New(isolate); 
  3.   Local<String> forkName = String::NewFromUtf8(isolate, "fork", NewStringType::kNormal, strlen("fork")).ToLocalChecked(); 
  4.   Local<String> waitName = String::NewFromUtf8(isolate, "wait", NewStringType::kNormal, strlen("wait")).ToLocalChecked(); 
  5.  
  6.   target->Set(forkName, FunctionTemplate::New(isolate, Child_Process::Fork)); 
  7.   target->Set(waitName, FunctionTemplate::New(isolate, Child_Process::Wait)); 
  8.   Local<Object> obj; 
  9.   bool ignore = target->NewInstance(isolate->GetCurrentContext()).ToLocal(&obj); 
  10.   return obj; 
  11.  

第二版加入了進程模塊,上面的代碼定義了進程模塊的功能。然后注入到全局變量,No.js目前的設計中,每個模塊是一個全局變量,和我們使用Object、Array一樣,不像Node.js的C++模塊是鏈成一條鏈表。

  1. // 模塊名稱 
  2. Local<Value> child_process_name = String::NewFromUtf8(isolate, "Child_Process",  strlen("Child_Process")).ToLocalChecked();// 注冊全局變量 
  3. global->Set(context, child_process_name, ChildProcess(isolate)); 

這樣就完成了模塊的注入,在JS層就可以使用了。下面我們看看具體的實現。

  1. class Child_Process { 
  2.     public
  3.  
  4.         static void Fork(const FunctionCallbackInfo<Value>& info) { 
  5.             info.GetReturnValue().Set(Number::New(info.GetIsolate(), fork())); 
  6.         } 
  7.  
  8.         static void Wait(const FunctionCallbackInfo<Value>& info) { 
  9.             int status; 
  10.             wait(&status); 
  11.         } 
  12.  
  13. }; 

實現很簡單,只是對fork函數的封裝,重點在于對fork函數的理解, 執行fork函數后會創建一個子進程,子進程的fork返回0,主進程返回子進程id,通過這個特性,我們可以寫一個if判斷處理下一步的邏輯。

2 通過fork+execve+reuserport共享端口

第二種模式是比較復雜且比較高性能的模式,之前的文章介紹過不同服務器架構的實現和優缺點,第一種fork共享端口的模式中,會有驚群和負載不均衡的問題,有興趣可以參考之前的文章,就不多介紹。接下來看第二種模式的使用(下面代碼是execve-server.js)。

  1. const TCPServer = TCP(); 
  2.  
  3. const tcpServer = new TCPServer('127.0.0.1', 8989); 
  4.  
  5. tcpServer.socket(); 
  6. tcpServer.setReusePort(1); 
  7. tcpServer.bind(); 
  8. tcpServer.listen(); 
  9.  
  10. const isMaster = Child_Process.getEnv("isMaster") === ""
  11.  
  12. if (isMaster) { 
  13.  
  14.     for (let i = 0; i < 3; i++) { 
  15.         Child_Process.execve("./No""execve-server.js");   
  16.     } 
  17.     Child_Process.wait(); 
  18.  
  19. else { 
  20.  
  21.     while(1) { 
  22.         tcpServer.accept(); 
  23.     } 
  24.  

我們知道多個進程是不能綁定同一個端口的,第一種模式中通過fork繞過了這個限制,第二版面對并解決了這個問題。上面代碼的邏輯看起來也很簡單,主進程創建多個子進程,并且在每個子進程里執行同一個文件execve-server.js。然后在execve-server.js中通過環境變量isMaster區分主子進程進行不同的處理,當然也可以執行新的文件。這里是為了提到isMaster這個環境變量。上面代碼中,重點是setReusePort和execve,下面我們具體看一下實現。

  1. static Local<Object> ChildProcess(Isolate * isolate) { 
  2.   Local<ObjectTemplate> target = ObjectTemplate::New(isolate); 
  3.   Local<String> execveName = String::NewFromUtf8(isolate, "execve", NewStringType::kNormal, strlen("execve")).ToLocalChecked(); 
  4.   Local<String> getEnvName = String::NewFromUtf8(isolate, "getEnv", NewStringType::kNormal, strlen("getEnv")).ToLocalChecked(); 
  5.  
  6.   target->Set(execveName, FunctionTemplate::New(isolate, Child_Process::Execve)); 
  7.   target->Set(getEnvName, FunctionTemplate::New(isolate, Child_Process::GetEnv)); 
  8.   Local<Object> obj; 
  9.   bool ignore = target->NewInstance(isolate->GetCurrentContext()).ToLocal(&obj); 
  10.   return obj; 
  11.  

同樣,先定義入口使得JS可以調用。另外給TCP模塊定義了一個新接口setReusePort。

  1. SetProtoMethod(isolate, TCPServer, "setReusePort", TCPServer::TCPServerSetUserPort); 

接下來看底層的實現,首先看TCPServerSetUserPort的實現。

  1. static void TCPServerSetUserPort(const FunctionCallbackInfo<Value>& info) { 
  2.     int on = info[0].As<Uint32>()->Value(); 
  3.     GetTCPServer(info.Holder())->Setsockopt(SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)); 
  4.  
  5.  
  6.  
  7.  
  8. int Setsockopt(int levelint optionName, const void *optionValue, socklen_t option_len) { 
  9.  
  10.     return setsockopt(listerFd, level, optionName, optionValue, option_len); 
  11.  

簡單地對setsockopt的封裝,沒有太多需要講的。下面看環境變量和execve的邏輯。

  1. class Child_Process { 
  2.     public
  3.  
  4.         static void GetEnv(const FunctionCallbackInfo<Value>& info) { 
  5.             String::Utf8Value key(info.GetIsolate(), info[0]); 
  6.             char * value = getenv(*key); 
  7.             // Logger::log(value); 
  8.             Local<String> str = String::NewFromUtf8(info.GetIsolate(), value, NewStringType::kNormal, strlen(value)).ToLocalChecked(); 
  9.             info.GetReturnValue().Set(str); 
  10.         } 
  11.  
  12.         static void Execve(const FunctionCallbackInfo<Value>& info) { 
  13.             int length = info.Length(); 
  14.             char** args = new char*[length + 1]; 
  15.             int i = 0; 
  16.             for (i = 0; i < length; i++) { 
  17.                 String::Utf8Value arg(info.GetIsolate(), info[i]); 
  18.                 args[i] = strdup(*arg); 
  19.             } 
  20.             args[i] = NULL
  21.             char *env[] = { "isMaster=0"NULL }; 
  22.             // int fd[2]; 
  23.             // socketpair(AF_UNIX, SOCK_STREAM, 0, fd); 
  24.  
  25.             int pid = fork(); 
  26.             if (pid == 0) { 
  27.                 // close(fd[0]); 
  28.                 execve(args[0], args, env); 
  29.                 // execve會加載可執行文件,從新的入口開始執行,執行到這說明execve出錯了 
  30.                 write(1, strerror(errno), sizeof(strerror(errno))); 
  31.                 exit(-1); 
  32.             } 
  33.             // close(fd[1]); 
  34.             if (args) { 
  35.                 for (int i = 0; i < length && args[i]; i++) { 
  36.                     free(args[i]); 
  37.                 } 
  38.                 delete [] args; 
  39.             } 
  40.         } 
  41.  
  42. }; 

目前只實現了獲取環境變量的邏輯,主要是對getenv的封裝。execve的代碼看起來很多,主要是參數的處理,我們只需要關注下面的代碼。

  1. int pid = fork(); 
  2.  // 子進程重新加載新的可執行文件 
  3.  if (pid == 0) { 
  4.      // close(fd[0]); 
  5.      execve(args[0], args, env); 
  6.      // execve會加載可執行文件,從新的入口開始執行,執行到這說明execve出錯了 
  7.      write(1, strerror(errno), sizeof(strerror(errno))); 
  8.      exit(-1); 
  9.  } 

首先通過fork創建一個子進程,然后通過execve加載要執行的代碼(這里是./No execve-server.js)。重點是execve函數會重新加載可執行文件,然后從新的地址(可執行文件中指定)開始執行,所以我們看到execve后是不需要return的,因為下面的代碼不會執行了,除非execve執行出錯了,這里我們打印錯誤信息然后退出進程。第二種模式的好處就是我們可以隨意在多個js文件中綁定同一個端口而不會報錯,這得益于SO_REUSEPORT的特性。SO_REUSEPORT讓每個進程對應一個連接隊列,解決了驚群問題,并且內核負責連接分發的復雜均衡,不僅提高了性能,同時使得應用程序變得簡單。

3 和Node.js相比

Node.js的進程是通過fork+execve實現的,Cluster模塊基于進程模塊實現了多進程架構,主要有兩種模式:輪詢和共享,輪詢就是主進程接收連接分發給子進程處理,子進程不接收連接只負責處理業務邏輯。這種模式的好處是沒有驚群現象,但是主進程的能力會成為服務器的瓶頸,共享模式和本文的第一種一樣,多個子進程共享一個端口,但是實現不一樣,本文是主進程創建socket通過fork子進程共享,Node.js是主進程創建socket通過文件描述符的方式傳遞給子進程,不過殊途同歸,主要是讓多個子進程共享監聽socket。本文的第二種模式,目前Node.js還不支持,因為SO_REUSEPORT是比較新的特性,但是對性能提升非常大。

后記:以上就是第二版新增的功能,我們已經具備了一個可以處理請求的多進程架構服務器,但是目前還是單進程里串行處理請求的,我們還需要很多東西,文件、IPC、事件驅動模塊、HTTP解析器等等,后續會考慮把最近寫的Node.js io_uring Addon合進來。最近把頭文件和V8靜態庫都打包了,有興趣的同學可以自行編譯運行https://github.com/theanarkh/No.js。

 

責任編輯:姜華 來源: 編程雜技
相關推薦

2024-03-21 09:15:58

JS運行的JavaScrip

2021-08-27 00:21:19

JSJust源碼

2014-03-28 13:30:36

2022-10-08 00:00:00

V8channel對象

2011-06-21 10:28:49

Oracle

2015-07-20 15:44:46

Swift框架MJExtension反射

2017-04-10 14:46:29

AndroidGradleBuild.gradl

2011-03-14 16:05:17

2022-08-02 10:26:09

網絡層網絡網絡協議

2023-09-12 17:38:41

2022-10-08 00:06:00

JS運行V8

2020-12-07 13:31:43

GoMutex開發者

2021-10-14 09:53:38

鴻蒙HarmonyOS應用

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運行鏡像開放

2021-09-07 11:19:42

操作系統華為鴻蒙

2024-01-29 08:07:42

FlinkYARN架構

2023-08-27 21:07:02

2023-08-21 09:37:57

MySQL工具MariaDB

2022-09-07 08:11:30

LinuxLKRG結構體
點贊
收藏

51CTO技術棧公眾號

一区二区三区毛片免费| 精品免费av在线| 26uuu久久天堂性欧美| 日韩av手机在线| 国产精品国产精品88| 国产精品调教视频| 欧美三级一区二区| a级黄色一级片| 午夜不卡视频| 99re这里只有精品首页| 国产欧美日韩视频| 久久久午夜影院| 外国成人激情视频| 亚洲精品色婷婷福利天堂| 午夜视频在线网站| 成人免费看视频网站| 亚洲精品一卡二卡| 日韩欧美一区二区三区四区五区| 亚洲精品人妻无码| 精品综合免费视频观看| 日本人成精品视频在线| 久久免费公开视频| 色噜噜日韩精品欧美一区二区| 特级丰满少妇一级aaaa爱毛片| 久久激情五月婷婷| 国产91精品在线播放| 日本熟妇毛耸耸xxxxxx| 在线中文一区| 中文字幕亚洲综合久久| 国产黄色网址在线观看| aaa国产精品视频| 日韩欧美一二三区| 国产精品久久久久久9999| 你懂得影院夜精品a| 天天做天天摸天天爽国产一区 | 黄色av免费观看| 精品一区二区三区久久久| 国产精品精品久久久久久| 黄网在线观看视频| 亚洲精品字幕| 久久久久五月天| 免费网站看av| 欧美视频导航| 欧美肥婆姓交大片| 欧美成人免费看| 中文在线日韩| 欧美日韩第一视频| 青青草手机视频在线观看| 一本精品一区二区三区| 久久天天躁狠狠躁老女人| 一本一本久久a久久| 99久久婷婷这里只有精品| 日韩在线视频中文字幕| 永久免费未视频| 9999国产精品| 久久影院模特热| 69av视频在线| 精品99视频| 国语对白做受69| 国产又黄又爽又色| 蜜桃久久av| 国产精品日韩专区| 国产乱子伦精品无码码专区| 国产在线播精品第三| 91亚色免费| 日韩中文字幕免费观看| 99精品视频在线免费观看| 久久综合色一本| 国产福利在线| 天海翼精品一区二区三区| 精品乱码亚洲一区二区不卡| 精品无码人妻少妇久久久久久| 精品视频高潮| 亚洲午夜av久久乱码| 欧美精品日韩在线| 欧美黄在线观看| 高清在线视频日韩欧美| 欧美a视频在线观看| 美女脱光内衣内裤视频久久网站 | 3d动漫一区二区三区| 瑟瑟视频在线看| 欧美三级电影在线看| 涩多多在线观看| 加勒比视频一区| 国产一区二区三区视频| 国产一区二区播放| 在线亚洲自拍| 成人国产精品久久久久久亚洲| 国产成人毛毛毛片| 久久蜜桃香蕉精品一区二区三区| 亚洲精品一区二| 久久国产精品黑丝| 在线观看不卡视频| 国产精品99精品无码视亚| 无码日韩精品一区二区免费| 日韩在线视频网| 久久久久久蜜桃| 日韩电影在线一区二区| 超碰国产精品久久国产精品99| 日中文字幕在线| 亚洲精品视频在线看| 欧美视频免费播放| 日本亚洲视频| 一本色道久久88精品综合| 国产成人无码aa精品一区| 免费一区视频| 国产经典一区二区三区| 91在线网址| 欧美日韩国产色| 亚洲一区二区三区四区精品| 色棕色天天综合网| 在线综合色站| 日韩久久久精品| 国产手机在线观看| 亚洲国产高清一区二区三区| 成人av.网址在线网站| 日产精品久久久久久久性色| 一区二区三区国产精品| 91极品视频在线观看| 偷拍亚洲精品| 韩国三级日本三级少妇99| 国产又粗又黄又爽的视频| 国产丝袜欧美中文另类| 五月丁香综合缴情六月小说| 久久国产精品美女| 日韩在线视频免费观看| 中文无码精品一区二区三区| 97se亚洲国产综合在线| 国产精品第157页| 嫩呦国产一区二区三区av| 中文字幕亚洲国产| 波多野结衣黄色网址| 91一区二区在线| 91午夜在线观看| 中文字幕一区二区三区中文字幕 | 久久uomeier| 亚洲国产天堂久久国产91| 妺妺窝人体色www聚色窝仙踪| 久草中文综合在线| 亚洲欧美日韩另类精品一区二区三区| 欧美电影h版| 亚洲欧美日韩高清| 中文字幕在线看人| 久久免费国产精品| 超碰av在线免费观看| 欧美激情在线精品一区二区三区| 欧美一级大片在线观看| 手机看片福利在线观看| 成人不卡免费av| 国产精品一区二区欧美| 少妇人妻一区二区| 亚洲成a人片综合在线| 不卡的一区二区| 影音先锋国产精品| 国产精品一区二区三区精品| free性欧美16hd| 亚洲激情视频在线播放| 亚洲s码欧洲m码国产av| 久久免费国产精品| 日韩欧美国产片| 亚洲成人精选| 国产精品污www一区二区三区| 黄色大片在线| 国产视频精品自拍| 国产真人无遮挡作爱免费视频| 国产日韩欧美精品一区| 欧美美女一级片| 欧美日韩1区| 国产专区一区二区三区| 怡红院成人在线| 色悠悠久久久久| 性少妇videosexfreexxx片| 亚洲国产精品一区二区久久| 波多野结衣福利| 老司机免费视频一区二区| 色哺乳xxxxhd奶水米仓惠香| 嗯用力啊快一点好舒服小柔久久| 国产91精品视频在线观看| 国产高清视频在线观看| 欧美一区二区三区性视频| 国产在线视频卡一卡二| 久久久久久久av麻豆果冻| 国产精品一区二区小说| 好吊一区二区三区| 日韩精品久久久毛片一区二区| 亚洲成人毛片| 91成人性视频| 麻豆网在线观看| 日韩成人黄色av| 中文字幕人妻精品一区| 亚洲国产美女搞黄色| 老熟妇一区二区| 高清成人免费视频| 亚洲欧美国产日韩综合| 亚洲国产激情| 亚洲啪啪av| 欧美电影完整版在线观看| 国产在线高清精品| 国产在线精彩视频| 日韩视频一区在线| 色视频在线观看| 日韩一区二区在线看| 日韩中文字幕高清| 亚洲18女电影在线观看| 2014亚洲天堂| 久久综合久久综合久久综合| 能看毛片的网站| 免费精品视频在线| 国产黄页在线观看| 一区二区三区四区日韩| 日韩欧美精品在线不卡| 国产欧美三级电影| 亚洲一区二区自拍| 精人妻一区二区三区| 性人久久久久| 成人资源av| 欧美韩国日本| 国产精品18久久久久久麻辣| av影院在线免费观看| 久久精品国产综合| 91精品国产91久久久久游泳池 | 在线观看国产日韩| 久草视频在线观| 亚洲一区在线看| 麻豆视频在线免费看| 国产精品国产三级国产普通话99| 91中文字幕永久在线| 成人免费电影视频| 久久久精品人妻一区二区三区| 久久91精品久久久久久秒播| 免费在线观看的毛片| 午夜一区不卡| 精品99在线视频| 亚洲欧美日本国产专区一区| 水蜜桃色314在线观看| 精品二区视频| 日韩精品一区二区三区四| 亚洲美女视频| 日韩国产精品毛片| 你懂的国产精品| 久久精品在线免费视频| 欧美一区二区三区久久精品茉莉花| 亚洲亚洲精品三区日韩精品在线视频| 日韩免费av| 中国一区二区三区| 亚洲精品中文字幕乱码| 日本一二三区视频在线| 午夜视频精品| 成人免费视频91| 亚洲裸体俱乐部裸体舞表演av| 人妻夜夜添夜夜无码av| 亚洲三级免费| 欧美v在线观看| 日本成人在线一区| 91视频这里只有精品| 极品美女销魂一区二区三区| 免费观看黄色大片| 亚洲精品二区三区| 欧美这里只有精品| 在线综合亚洲| 国产日韩成人内射视频 | 国产免费一区二区三区在线能观看 | 亚洲精品手机在线观看| 精品中文字幕一区二区| 久久av一区二区三| 91农村精品一区二区在线| 成都免费高清电影| 国产精品国产三级国产普通话99| 特级片在线观看| 精品人伦一区二区三区蜜桃网站 | 91精品国产综合久久久久久| av观看在线免费| 亚洲精品久久久久| 国产精品麻豆一区二区三区| 久久精品这里热有精品| 久久一卡二卡| 国产精品69精品一区二区三区| 日日夜夜亚洲精品| 国产精品一区二区三区免费| 激情五月综合网| 国产制服91一区二区三区制服| 亚洲第一黄网| 欧美wwwwwww| 不卡的看片网站| 波多野结衣家庭教师在线观看 | 极品尤物一区| 亚洲一卡二卡| 99精品视频网| 亚洲男人天堂av在线| 91影院在线观看| 国产盗摄一区二区三区在线| 一本久久a久久精品亚洲| 国产青青草视频| 亚洲区一区二区| 精灵使的剑舞无删减版在线观看| 国产99久久精品一区二区永久免费 | 国产亚洲久久| 日本一区二区三区免费观看| 欧美激情综合| 天天干天天玩天天操| 久久综合狠狠综合| 久久无码精品丰满人妻| 欧美日韩精品三区| 亚洲av成人精品一区二区三区在线播放| 中文字幕一区二区三区电影| 韩日毛片在线观看| 亚洲综合最新在线| 日韩精品四区| 久草精品在线播放| 成人av电影在线| 成人免费黄色小视频| 欧美亚洲动漫另类| 青青国产在线| 午夜精品蜜臀一区二区三区免费| 全球中文成人在线| 日韩色妇久久av| 亚洲一区中文| 午夜久久久久久久| 亚洲精品免费看| 国产乱子伦精品无码码专区| 中文字幕欧美日韩| 欧美最新精品| 免费亚洲精品视频| 亚洲一级在线| jlzzjizz在线播放观看| 夜夜操天天操亚洲| 国产成人精品亚洲精品色欲| 精品国产一区二区三区在线观看| 婷婷六月国产精品久久不卡| 久久伦理网站| 亚洲精品1区2区| 深田咏美中文字幕| 亚洲国产综合在线| 男人天堂av网| 97碰在线观看| 婷婷五月色综合香五月| 免费观看精品视频| 久久久青草青青国产亚洲免观| 99精品在线播放| 亚洲欧洲偷拍精品| 日韩性xxx| 日韩精品一区二区三区四区五区| 久久精品亚洲| 国产人妻大战黑人20p| 欧美性猛交xxxxxxxx| av在线收看| 成人激情春色网| 亚洲欧美在线专区| 免费黄视频在线观看| 亚洲伊人伊色伊影伊综合网| 嫩草影院一区二区| 欧美性在线视频| 国产欧美日韩视频在线| 日日噜噜夜夜狠狠| 国产精品污网站| aaa国产视频| 久久久久久中文| 校园春色另类视频| 嫩草影院国产精品| 亚洲品质自拍视频网站| 黄色一级大片在线免费看国产一| 久久久久久香蕉网| 伊人成综合网伊人222| 色哟哟精品视频| 亚洲精品videosex极品| 刘玥91精选国产在线观看| 欧美一级高清免费| 日韩成人a**站| 免费黄视频在线观看| 色哟哟精品一区| 久草免费在线观看| 国产精品亚洲不卡a| 日韩高清一级片| 青娱乐av在线| 亚洲久久久久久久久久久| 国产成人77亚洲精品www| 大地资源网在线观看免费官网| 99久久久国产精品| 亚洲天堂自拍偷拍| 久久人人爽人人| 日韩精品电影| 国产国语老龄妇女a片| 欧洲一区二区av| 四虎亚洲精品| 亚洲 国产 欧美一区| 国产高清亚洲一区| 中文字幕免费观看| 欧美老妇交乱视频| 欧美日韩在线播放视频| 少妇极品熟妇人妻无码| 欧美在线观看一区| 欧美aaaaaaa| 亚洲福利av| 99re视频精品| 97人妻精品一区二区三区动漫| 91极品女神在线| 欧美一区成人| 91无套直看片红桃在线观看| 亚洲成人免费网站| 国产情侣一区在线|