青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

分布式程序開(kāi)發(fā)平臺(tái)ICE概覽

本文基于ICE Manual及相關(guān)文檔就ICE的一些主要特性做一個(gè)概覽,它不是一個(gè)tutorial,不是一個(gè)guid,更不是manual。

概覽

ICE,Internet Communications Engine,按照官方介紹,是一個(gè)支持C++、.Net、Java、Python、Objective-C、Ruby、PHP及ActionScript等語(yǔ)言的分布式程序開(kāi)發(fā)平臺(tái)。按照我的理解,簡(jiǎn)單來(lái)說(shuō)它是一個(gè)核心功能包裝RPC的庫(kù)。要把這個(gè)RPC包裝得漂亮,自然而然,對(duì)于使用者而言,調(diào)用一個(gè)遠(yuǎn)端的接口和調(diào)用一個(gè)本地的接口沒(méi)有什么區(qū)別,例如:

    Object *obj = xxx
    obj->sayHello(); 

ICE包裝sayHello接口,當(dāng)應(yīng)用層調(diào)用該接口時(shí),ICE發(fā)送調(diào)用請(qǐng)求到遠(yuǎn)端服務(wù)器,接收返回結(jié)果并返回給應(yīng)用層。ICE在接口提供方面,做到了這一點(diǎn)。

以下,我將逐個(gè)給出ICE中的一些工具、組件、特性說(shuō)明,以展示它作為一個(gè)分布式程序開(kāi)發(fā)平臺(tái)所擁有的能力。到目前為止,所有這些信息均來(lái)自于ICE相關(guān)文檔,總結(jié)出來(lái)權(quán)當(dāng)為自己服務(wù)。

Slice

Slice(Specification Language for Ice)是ICE定義的一種中間語(yǔ)言,其語(yǔ)法類似于C++。對(duì)于一個(gè)RPC過(guò)程而言,例如上面調(diào)用遠(yuǎn)端的sayHello接口,其主要涉及到調(diào)用這個(gè)接口的參數(shù)和返回值傳遞,當(dāng)然接口本身的傳遞不在話下,ICE為了包裝這個(gè)過(guò)程,其使用了這樣一種方式:使用者使用Slice語(yǔ)言描述RPC過(guò)程中調(diào)用的接口,例如該接口屬于哪個(gè)類,該接口有哪些參數(shù)哪些返回值;然后使用者使用ICE提供的Slice編譯器(實(shí)際上是一個(gè)語(yǔ)言翻譯程序)將Slice源碼翻譯成目標(biāo)語(yǔ)言。而這個(gè)目標(biāo)語(yǔ)言,則是使用者開(kāi)發(fā)應(yīng)用程序的開(kāi)發(fā)語(yǔ)言,即上文提到的C++、.Net、Java等。

這些翻譯出來(lái)的目標(biāo)代碼,就封裝了sayHello底層實(shí)現(xiàn)的一切細(xì)節(jié)。當(dāng)然事情沒(méi)有這么簡(jiǎn)單,但我們目前只需關(guān)注簡(jiǎn)單的這一部分。ICE之所以支持那么多種開(kāi)發(fā)語(yǔ)言,正是Slice立下的功勞。Slice語(yǔ)言本身的語(yǔ)言特性,實(shí)際上受限于目標(biāo)語(yǔ)言的語(yǔ)言特性,例如Slice支持異常,恰是因?yàn)镾lice轉(zhuǎn)換的所有語(yǔ)言都包含異常這個(gè)語(yǔ)法特性。

Slice還有一個(gè)重要特性,在于一份Slice源碼被翻譯出來(lái)的目標(biāo)代碼,一般情況是被服務(wù)器和客戶端同時(shí)使用。

開(kāi)發(fā)步驟

使用ICE開(kāi)發(fā)應(yīng)用程序,其步驟遵循:

  1. 編寫(xiě)Slice,說(shuō)明整個(gè)RPC中涉及到的接口調(diào)用,編譯它
  2. 基于Slice目標(biāo)代碼和ICE庫(kù)編寫(xiě)Server
  3. 基于Slice目標(biāo)帶啊和ICE庫(kù)編寫(xiě)Client

一個(gè)例子

有必要展示一個(gè)例子,以獲得使用ICE開(kāi)發(fā)應(yīng)用程序的感性認(rèn)識(shí)。這個(gè)例子是一個(gè)簡(jiǎn)單的hello world程序,客戶端讓服務(wù)器打印一個(gè)字符串。

  • 編寫(xiě)Slice
    // Printer.ice,Slice源碼后綴為ice
    module Demo {
        interface Printer {
            void printString(string s);
        };
    };

使用ICE提供的程序翻譯為C++代碼:

    $ slice2cpp Printer.ice

得到Printer.cpp和Printer.h。Slice翻譯出來(lái)的目標(biāo)代碼除了封裝RPC交互的一些細(xì)節(jié)外,最重要的,因?yàn)楸旧鞸lice文件其實(shí)是定義接口,但接口的實(shí)現(xiàn),則需要應(yīng)用層來(lái)做。

  • 服務(wù)器端使用生成的Printer.cpp/.h,并實(shí)現(xiàn)Printer接口
    // 翻譯出來(lái)的Printer.h中有對(duì)應(yīng)于Slice中定義的Printer類,及需要實(shí)現(xiàn)的printString接口
    class PrinterI : public Printer {
    public:
        virtual void printString(const string& s, const Ice::Current&) {
            count << s << endl;
        }
    };
  • 客戶端使用生成的Printer.cpp/.h,通過(guò)ICE獲得一個(gè)Printer對(duì)象,然后調(diào)用其printString接口
    // don't care about this
    PrinterPrx printer = PrinterPrx::checkedCast(base);
    printer->printString("Hello World!");

使用ICE開(kāi)發(fā)應(yīng)用程序,整體過(guò)程即為以上展示。

概念

ICE包含了很多概念,作為一個(gè)開(kāi)發(fā)平臺(tái)而言,有其專有術(shù)語(yǔ)一點(diǎn)不過(guò)分,熟悉這些概念可以更容易學(xué)習(xí)ICE。這里羅列一些關(guān)鍵概念。

服務(wù)器端和客戶端

ICE中的服務(wù)器端和客戶端和一般網(wǎng)絡(luò)程序中的概念不太一樣。在若干個(gè)交互的網(wǎng)絡(luò)程序中,我們都很好理解這樣一種現(xiàn)象:某個(gè)程序有多個(gè)角色,它可能是作為A程序的服務(wù)器端,也可能是作為B程序的客戶端。ICE中的服務(wù)器和客戶端角色更容易變換。

以Printer例子為例,如果我們的printString接口有一個(gè)回調(diào)函數(shù)參數(shù)(這在ICE中很常見(jiàn)),服務(wù)器實(shí)現(xiàn)printString時(shí),當(dāng)其打印出字符串后,需通過(guò)該回調(diào)函數(shù)通知客戶端。這樣的回調(diào)機(jī)制在ICE的實(shí)現(xiàn)中,會(huì)創(chuàng)建一個(gè)新的網(wǎng)絡(luò)連接,而此時(shí),這個(gè)原有的服務(wù)器端就變成了原有客戶端的客戶。當(dāng)然,你也可以避免這樣的情況出現(xiàn)。

ICE Objects/Object Adapter/Facet

對(duì)于Printer例子,一個(gè)Printer對(duì)象可以被看作是一個(gè)ICE Objects。Object可以說(shuō)是服務(wù)器端提供給客戶端的接口。所以在服務(wù)器端通常會(huì)創(chuàng)建出很多個(gè)Object。服務(wù)器端使用Object Adapter對(duì)象去保存這些Object。例如,一個(gè)典型的ICE對(duì)象在初始化時(shí)可能包含以下代碼:

    // 創(chuàng)建一個(gè)Object Adapter
    Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Hello");
    // 創(chuàng)建一個(gè)Object,形如Printer
    Demo::HelloPtr hello = new HelloI;
    // 將Object加入到Object Adapter
    adapter->add(hello, communicator()->stringToIdentity("hello"));

Facet是Object的一部分,或者說(shuō)Object是Facet的一個(gè)集合,摘Ice manual中的一句話:

An Ice object is actually a collection of sub-objects known as facets whose types are not necessarily related.

Proxy

Proxy是ICE客戶端里的概念。客戶端通過(guò)Proxy訪問(wèn)服務(wù)器端上的Object,通過(guò)Proxy調(diào)用服務(wù)器端Object上提供的接口。在客戶端上一般有類似以下代碼:

    Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
    // Printer Proxy
    PrinterPrx printer = PrinterPrx::checkedCast(base);
    printer->printString("Hello World!");

Proxy又分為幾種,包括:

Direct Proxy

Direct Proxy,這里的direct意指這個(gè)proxy訪問(wèn)的object時(shí),是否攜帶了地址(EndPoint)信息,例如上面例子中SimplePrinter:default -p 10000就是一個(gè)地址。

Indirect Proxy

Indirect Proxy相對(duì)Direct Proxy而言,其沒(méi)有具體的地址,僅僅是一個(gè)符號(hào)。通常包含兩種形式:

  • SimplePrinter
  • SimplePrinter@PrinterAdapter

為了獲取真正的地址,客戶端需要一個(gè)定位服務(wù)(location service)來(lái)獲取這個(gè)符號(hào)對(duì)應(yīng)的地址。ICE中提供了一些默認(rèn)的服務(wù)程序,IceGrid就是其中之一,而IceGrid的作用就包括定位具體的地址,即翻譯符號(hào)地址到具體的地址。

這里Indirect Proxy可以看作一個(gè)域名,而Direct Proxy可以看作是IP地址。Indirect Proxy使用時(shí),就需要借助DNS翻譯得到域名對(duì)應(yīng)的IP地址。

Fixed Proxy

由于Proxy是用于與服務(wù)器端的Object通信的,客戶端借助Proxy來(lái)訪問(wèn)服務(wù)器端的Object,所以Proxy通常都會(huì)對(duì)應(yīng)一個(gè)真實(shí)的網(wǎng)絡(luò)連接。在ICE中,一般的Proxy于網(wǎng)絡(luò)連接(Connection)實(shí)際上是沒(méi)有太大關(guān)聯(lián)的。一個(gè)Proxy可以沒(méi)有Connection,也可以在建立這個(gè)Connection后又?jǐn)嚅_(kāi)之。但是,ICE提供了一種特殊的Proxy,F(xiàn)ixed Proxy,這種Proxy緊密地與一個(gè)Connection綁定在一起,其生命周期被強(qiáng)制關(guān)聯(lián)起來(lái)。

關(guān)于Fixed Proxy可以參看ICE Manual Connection Management

其他

  • AMI

Asynchronous Method Invocation,對(duì)于客戶端而言,用于表示某個(gè)服務(wù)器端接口是異步操作,需在Slice中使用metadata來(lái)修飾這個(gè)接口,例如:

    ["ami"]  void sayHello(int delay)
  • AMD

Asynchronous method dispatch,這個(gè)針對(duì)于服務(wù)器端,同樣表示這個(gè)接口是異步操作,需在Slice中使用metadata來(lái)修飾這個(gè)接口:

    ["ami", "amd"]  void sayHello(int delay)

通常對(duì)于這種異步接口而言,都需要使用Slice metadata amiamd同時(shí)修飾。

  • idempotent

idempotent是Slice中的概念,同const一樣用于修飾某個(gè)接口的特性。idempotent表示該接口無(wú)論調(diào)用多少次,其執(zhí)行結(jié)果都是相同的,例如一般的get類接口。

  • batched invocation

客戶端調(diào)用服務(wù)器端的接口這個(gè)動(dòng)作稱為invocation。就像網(wǎng)絡(luò)層的數(shù)據(jù)緩存一樣,ICE對(duì)于接口調(diào)用也可能暫時(shí)緩存,當(dāng)多個(gè)提交請(qǐng)求緩存起來(lái)后,然后調(diào)用刷新接口全部刷新到服務(wù)器端,則稱為batched invocation。

服務(wù)

ICE除了提供一個(gè)庫(kù)之外,還提供了一些應(yīng)用程序。這些應(yīng)用程序本身也是一些服務(wù)器,提供了一些方便的功能方便我們開(kāi)發(fā)分布式程序。

Freeze

Freeze用于將Slice對(duì)象持久化到數(shù)據(jù)庫(kù)中,按照Manual里的說(shuō)法,它應(yīng)該是一個(gè)編譯器,可以生成一些持久化操作的代碼。Freeze持久化對(duì)象時(shí)使用的數(shù)據(jù)庫(kù)是Berkeley DB。

Ice has a built-in object persistence service, known as Freeze. Freeze makes it easy to store object state in a database: you define the state stored by your objects in Slice, and the Freeze compiler generates code that stores and retrieves object state to and from a database. Freeze uses Berkeley DB as its database.

FreezeScript有點(diǎn)類似于Rails中的數(shù)據(jù)庫(kù)操作工具,可用于操作持久化到數(shù)據(jù)庫(kù)中的對(duì)象數(shù)據(jù)。

Ice also offers a tool set collectively called FreezeScript that makes it easier to maintain databases and to migrate the contents of existing databases to a new schema if the type definitions of objects change.

IceBox

IceBox可用于管理服務(wù)器中的動(dòng)態(tài)組件。這些動(dòng)態(tài)組件本質(zhì)上也是提供服務(wù)的ICE程序。在形式上,這些組件可以是動(dòng)態(tài)連接庫(kù)。

IceBox is a simple application server that can orchestrate the starting and stopping of a number of application components. Application components can be deployed as a dynamic library instead of as a process.

IceGrid

IceGrid相當(dāng)于一個(gè)DNS解析服務(wù),可以讓服務(wù)器不用配置EndPoint,客戶端也不用指定服務(wù)器的EndPoint,以方便大量的服務(wù)器部署。在一般的應(yīng)用中,我們需要為ICE服務(wù)器指定綁定的網(wǎng)絡(luò)地址(IP和端口),同時(shí)也需要為客戶端指定服務(wù)器端的地址信息。當(dāng)服務(wù)增加到一定數(shù)量時(shí),就會(huì)存在管理上和配置上的麻煩。而IceGrid則是用于避免這種麻煩,將服務(wù)器端和客戶端上的地址信息通過(guò)一個(gè)符號(hào)代替,就像我們把Internet上的服務(wù)器使用域名來(lái)標(biāo)識(shí)一樣。

但I(xiàn)ceGrid的作用不僅如此,通過(guò)配合部署一系列稱為IceGrid Node的程序,IceGrid還可以管理各個(gè)服務(wù)器的啟動(dòng)、關(guān)閉、宕機(jī)重啟等,其中甚至包括負(fù)載均衡。

IceGrid provides a facility to activate servers on demand, when a client first invokes an operation. Server activation is taken care of by IceGrid nodes. You must run an IceGrid node on each machine on which you want IceGrid to start servers on demand.

簡(jiǎn)要介紹可以參看ICE Manual Teach Yourself IceGrid in 10 minutes

Glacier2

Glacier2 is a lightweight firewall traversal solution for Ice applications.

按我的理解,Glacier2就像一個(gè)網(wǎng)關(guān)服務(wù)器。它被部署在服務(wù)器和客戶端之間,我們的服務(wù)器群部署在內(nèi)網(wǎng),外網(wǎng)不可訪問(wèn),然后通過(guò)Glacier2,外部網(wǎng)絡(luò)的客戶端就可以訪問(wèn)內(nèi)網(wǎng)的服務(wù)器群提供的服務(wù)。

對(duì)于服務(wù)器的開(kāi)發(fā)而言,使用Glacier2,服務(wù)器端不需要做任何改動(dòng)??蛻舳诵枰渲肎lacier2服務(wù)的地址信息,也需要配置要使用服務(wù)器的地址信息。Glacier2通過(guò)客戶端欲訪問(wèn)的服務(wù)器地址,在內(nèi)網(wǎng)定位到真實(shí)的服務(wù)器,并轉(zhuǎn)發(fā)請(qǐng)求提供服務(wù)。

Glacier2支持驗(yàn)證客戶端,從這一點(diǎn)看來(lái),它又有點(diǎn)像一個(gè)驗(yàn)證服務(wù)器。通過(guò)驗(yàn)證客戶端,以提供被正確授權(quán)的客戶端以完整服務(wù)。

Glacier2的工作過(guò)程可以描述為:

When a client invokes an operation on a routed proxy, the client connects to one of Glacier2’s client endpoints and sends the request as if Glacier2 is the server. Glacier2 then establishes an outgoing connection to the client’s intended server in the private network, forwards the request to that server, and returns the reply (if any) to the client. Glacier2 is essentially acting as a local client on behalf of the remote client.

一個(gè)Glacier2可服務(wù)于若干個(gè)客戶端和服務(wù)器。

詳細(xì)參看ICE Manual Glacier2

管理

ICE服務(wù)器可以提供給外部一定的管理功能,包括:關(guān)閉服務(wù)器、讀取服務(wù)器配置。這個(gè)功能是通過(guò)操作Ice.Admin這個(gè)Ice Object來(lái)實(shí)現(xiàn)的。這個(gè)Object包含兩個(gè)Facet:Process和Property,分別對(duì)應(yīng)于關(guān)閉服務(wù)器和讀取服務(wù)器配置功能。

對(duì)于需要管理服務(wù)器的客戶端而言,可以大致通過(guò)如下代碼來(lái)完成:

    // 可以通過(guò)communicator來(lái)獲取這個(gè)admin object
    Ice::ObjectPrx adminObj = ...;
    // 獲取admin object里的property facet
    Ice::PropertiesAdminPrx propAdmin = Ice::PropertiesAdminPrx::checkedCast(adminObj, "Properties");
    Ice::PropertyDict props = propAdmin->getPropertiesForPrefix("");

詳細(xì)參看ICE Manual Administrative Facility

連接管理

前已述及,ICE中的網(wǎng)絡(luò)連接隱藏于Proxy之下。Proxy有兩個(gè)接口可以獲取這個(gè)連接對(duì)象:

    ice_getConnection
    ice_getCachedConnection

例如:

    HelloPrx hello = HelloPrx::uncheckedCast(communicator->stringToProxy("hello:tcp -h remote.host.com -p 10000"));
    ConnectionPtr conn = hello->ice_getConnection();

ICE隱藏了網(wǎng)絡(luò)連接的細(xì)節(jié)。當(dāng)ICE發(fā)現(xiàn)需要建立連接時(shí)才會(huì)去建立,例如以上例子中當(dāng)獲得一個(gè)Proxy時(shí)(這里是HelloPrx),ICE并不建立網(wǎng)絡(luò)連接,當(dāng)某個(gè)時(shí)刻通過(guò)該P(yáng)roxy調(diào)用服務(wù)器端的某個(gè)接口時(shí),ICE發(fā)現(xiàn)對(duì)應(yīng)的網(wǎng)絡(luò)連接沒(méi)有建立,則發(fā)起網(wǎng)絡(luò)連接。

以上例子在獲取Proxy時(shí),使用了uncheckCast,關(guān)于checkedCastuncheckedCast,也影響著網(wǎng)絡(luò)連接的建立邏輯:

On the other hand, if the code were to use a checkedCast instead, then connection establishment would take place as part of the checkedCast, because a checked cast requires a remote call to determine whether the target object supports the specified interface.

關(guān)于連接管理,ICE使用了一個(gè)稱為ACM的機(jī)制,即Active connection management。當(dāng)某個(gè)連接非active一段時(shí)間后,ICE就會(huì)主動(dòng)關(guān)閉此連接。應(yīng)用層當(dāng)然可以控制這個(gè)行為。

詳細(xì)參看ICE Manual Connection Management

posted on 2013-02-15 15:24 Kevin Lynx 閱讀(6466) 評(píng)論(0)  編輯 收藏 引用 所屬分類: c/c++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区二区三区在线免费观看 | 国产无一区二区| 亚洲主播在线| 美女脱光内衣内裤视频久久网站| 久久精品成人欧美大片古装| 久久精品99国产精品| 久久久久免费视频| 免播放器亚洲一区| 免费欧美日韩| 欧美日韩国内自拍| 国产精品三级视频| 一区免费观看| 一二三四社区欧美黄| 亚洲欧美一区二区三区极速播放 | 欧美国产在线视频| 国产精品久久激情| 国产一区二区精品在线观看| 亚洲肉体裸体xxxx137| 亚洲中午字幕| 男同欧美伦乱| 亚洲视频综合在线| 久久综合网络一区二区| 欧美日韩黄色一区二区| 国产嫩草影院久久久久| 亚洲人成亚洲人成在线观看| 性欧美超级视频| 欧美国产日韩xxxxx| 亚洲图片欧美日产| 嫩草影视亚洲| 激情久久五月| 香蕉久久夜色| 日韩亚洲欧美在线观看| 久久天天狠狠| 国产欧美高清| 亚洲一区二区精品视频| 免费观看在线综合色| 亚洲一区二区三区涩| 欧美~级网站不卡| 国产毛片久久| 亚洲永久免费视频| 91久久国产精品91久久性色| 亚洲欧美一区二区三区极速播放 | 欧美日韩中文另类| 91久久线看在观草草青青| 欧美在线精品一区| 亚洲美女精品成人在线视频| 免费成人高清在线视频| 国产自产女人91一区在线观看| 亚洲性图久久| 亚洲作爱视频| 欧美日韩一视频区二区| 亚洲精品欧美日韩专区| 欧美国产日本在线| 久久精品国产99精品国产亚洲性色| 亚洲精品午夜| 亚洲电影成人| 久久人人超碰| 激情综合自拍| 午夜视频一区在线观看| 一区二区三区四区五区视频| 欧美精品二区三区四区免费看视频| 亚洲二区在线观看| 欧美大香线蕉线伊人久久国产精品| 午夜一区在线| 狠狠干综合网| 欧美成人在线免费观看| 老司机精品福利视频| 亚洲第一级黄色片| 欧美国产专区| 欧美剧在线观看| 亚洲一区在线看| 亚洲素人一区二区| 国产欧美va欧美va香蕉在| 久久成人免费网| 久久国产精彩视频| 亚洲国产精品一区在线观看不卡| 欧美激情中文字幕一区二区| 免费亚洲电影在线观看| 亚洲美女精品成人在线视频| 99成人在线| 国产欧美日韩另类一区| 久久人人看视频| 欧美成人四级电影| 亚洲一区在线免费| 性视频1819p久久| 亚洲第一中文字幕在线观看| 亚洲人午夜精品| 国产美女精品人人做人人爽| 久久综合国产精品| 欧美精品成人一区二区在线观看 | 久久激情五月丁香伊人| 久久精品亚洲| 99精品国产在热久久| 亚洲视频福利| 亚洲国产视频a| 亚洲图片在线观看| 亚洲第一狼人社区| 亚洲天堂成人| 亚洲黄一区二区三区| 亚洲视频一区二区| 亚洲国产日韩一区| 欧美一二三区在线观看| 99re亚洲国产精品| 欧美在线免费播放| 亚洲夜间福利| 欧美成人中文| 久久影视精品| 国产精品日产欧美久久久久| 亚洲第一黄网| 国产亚洲午夜高清国产拍精品| 亚洲精品激情| 亚洲第一中文字幕在线观看| 亚洲欧美中文另类| 亚洲影视九九影院在线观看| 在线免费观看日韩欧美| 日韩午夜激情| 亚洲欧洲日韩综合二区| 欧美亚洲专区| 午夜在线不卡| 欧美色综合网| 亚洲激情在线| 最新日韩在线| 老司机一区二区| 久久综合九色综合网站| 国产精品一级二级三级| 亚洲精品中文字幕女同| 亚洲欧洲免费视频| 久久青青草原一区二区| 久久久久久久久久码影片| 国产精品久久一级| 中文欧美字幕免费| 日韩一级二级三级| 免费看精品久久片| 欧美成年人视频| 一区二区视频欧美| 久久久久成人精品| 久久噜噜噜精品国产亚洲综合| 国产精品中文在线| 午夜在线不卡| 久久婷婷丁香| 狠狠色综合色综合网络| 久久福利资源站| 乱中年女人伦av一区二区| 国产一区二区在线观看免费| 欧美在线视频播放| 麻豆freexxxx性91精品| 亚洲高清自拍| 欧美精品成人在线| 亚洲视频电影在线| 久久久国产亚洲精品| 在线成人国产| 欧美不卡视频一区| 99国产精品久久久| 性欧美超级视频| 黄色一区二区三区四区| 蜜桃av久久久亚洲精品| 亚洲乱码一区二区| 欧美亚洲一级片| 狠狠88综合久久久久综合网| 媚黑女一区二区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美色精品天天在线观看视频| 一区二区三区精品久久久| 欧美一级视频| 亚洲国产精品久久91精品| 欧美日韩精品在线| 午夜精彩国产免费不卡不顿大片| 久久综合一区| 亚洲视频狠狠| 有坂深雪在线一区| 国产精品大全| 麻豆av一区二区三区久久| aa成人免费视频| 欧美成人福利视频| 午夜精品久久久久久久蜜桃app| 一区二区三区在线不卡| 欧美日韩国产综合视频在线| 久久国产日韩欧美| 午夜精品久久久久久久99水蜜桃| 久久精品二区三区| 亚洲国产91色在线| 午夜精品久久久| 亚洲国产精品日韩| 国产视频久久| 欧美日韩一区二区欧美激情 | 国产精品久久久一区麻豆最新章节 | 卡通动漫国产精品| 亚洲性线免费观看视频成熟| 在线观看视频一区二区| 国产精品高清在线观看| 欧美11—12娇小xxxx| 欧美一区二区视频在线观看| 夜夜精品视频| 亚洲高清免费| 免费日本视频一区| 久久精品亚洲热| 亚洲欧美日韩综合| 在线视频你懂得一区二区三区| 亚洲高清视频一区二区| 国产欧美日韩三级|