日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从零开始玩转JMX(一)——简介和Standard MBean

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始玩转JMX(一)——简介和Standard MBean 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JMX的全稱為Java Management Extensions. 顧名思義,是管理Java的一種擴展。這種機制可以方便的管理、監控正在運行中的Java程序。常用于管理線程,內存,日志Level,服務重啟,系統環境等。

簡介
基本術語
MBean:是Managed Bean的簡稱,可以翻譯為“管理構件”。在JMX中MBean代表一個被管理的資源實例,通過MBean中暴露的方法和屬性,外界可以獲取被管理的資源的狀態和操縱MBean的行為。事實上,MBean就是一個Java Object,同JavaBean模型一樣,外界使用自醒和反射來獲取Object的值和調用Object的方法,只是MBean更為復雜和高級一些。MBean通過公共方法以及遵從特定的設計模式封裝了屬性和操作,以便暴露給管理應用程序。例如,一個只讀屬性在管理構件中只有Get方法,既有Get又有Set方法表示是一個可讀寫的屬性。一共有四種類型的MBean: Standard MBean, Dynamic MBean, Open MBean, Model MBean。
MBeanServer:MBean生存在一個MBeanServer中。MBeanServer管理這些MBean,并且代理外界對它們的訪問。并且MBeanServer提供了一種注冊機制,是的外界可以通過名字來得到相應的MBean實例。
JMX Agent:Agent只是一個Java進程,它包括這個MBeanServer和一系列附加的MbeanService。當然這些Service也是通過MBean的形式來發布。
Protocol Adapters and Connectors:MBeanServer依賴于Protocol Adapters和Connectors來和運行該代理的Java虛擬機之外的管理應用程序進行通信。Protocol Adapters通過特定的協議提供了一張注冊在MBeanServer的MBean的視圖。例如,一個HTML Adapter可以將所有注冊過的MBean顯示在Web 頁面上。不同的協議,提供不同的視圖。Connectors還必須提供管理應用一方的接口以使代理和管理應用程序進行通信,即針對不同的協議,Connectors必須提供同樣的遠程接口來封裝通信過程。當遠程應用程序使用這個接口時,就可以通過網絡透明的和代理進行交互,而忽略協議本身。Adapters和Connectors使MBean服務器與管理應用程序能進行通信。因此,一個代理要被管理,它必須提供至少一個Protocol Adapter或者Connector。面臨多種管理應用時,代理可以包含各種不同的Protocol Adapters和Connectors。當前已經實現和將要實現的Protocol Adapters和Connectors包括: RMI Connector, SNMP Adapter, IIOP Adapter, HTML Adapter, HTTP Connector.
Adapter 和Connector的區別在于:Adapter是使用某種Internet協議來與JMX Agent獲得聯系,Agent端會有一個對象 (Adapter)來處理有關協議的細節。比如SNMP Adapter和HTTP Adapter。而Connector則是使用類似RPC的方式來訪問Agent,在Agent端和客戶端都必須有這樣一個對象來處理相應的請求與應答。比如RMI Connector。

JMX Agent可以帶有任意多個Adapter,因此可以使用多種不同的方式訪問Agent。

JMX基本構架


JMX分為三層,分別負責處理不同的事務。它們分別是:

Instrumentation 層?
Instrumentation層主要包括了一系列的接口定義和描述如何開發MBean的規范。通常JMX所管理的資源有一個或多個MBean組成,因此這個資源可以是任何由Java語言開發的組件,或是一個JavaWrapper包裝的其他語言開發的資源。
Agent 層?
Agent 用來管理相應的資源,并且為遠端用戶提供訪問的接口。Agent層構建在Intrumentation層之上,并且使用并管理 Instrumentation層內部描述的組件。Agent層主要定義了各種服務以及通信模型。該層的核心是一MBeanServer,所有的MBean都要向它注冊,才能被管理。注冊在MBeanServer上的MBean并不直接和遠程應用程序進行通信,他們通過協議適配器(Adapter)和連接器(Connector)進行通信。通常Agent由一個MBeanServer和多個系統服務組成。JMX Agent并不關心它所管理的資源是什么。
Distributed 層?
Distributed層關心Agent如何被遠端用戶訪問的細節。它定義了一系列用來訪問Agent的接口和組件,包括Adapter和Connector的描述。
如果一個Java對象可以由一個遵循JMX規范的管理器應用管理,那么這個Java對象就可以由JMX管理資源。要使一個Java對象可管理,則必須創建相應的MBean對象,并通過這些MBean對象管理相應的Java對象。當擁有MBean類后,需要將其實例化并注冊到MBeanServer上。

詳述
這里采用的是JDK7,JDK7中已經包含了jmx,但是如果用到HtmlAdaptorServer類(后面會看到)還需要用到jmxtools.jar, 可以去這里下載,有兩個包:jmx-1_2_1-ri.zip; jmx_remote-1_0_1_03-ri.zip。jmx-1_2_1-ri.zip解壓后lib中有jmxri.jar和jmxtools.jar,將jmxtool.jar拷貝出來放入classpath中即可(jmxri.jar在JDK5+已經包被包含了)。

Standard MBean
Standard MBean的設計和實現是最簡單的,它們的管理接口通過方法名來描述。Standard MBean的實現依靠一組命名規則,稱之為設計模式。這些命名規則定義了屬性和操作。?
檢查Standard MBean接口和應用設計模式的過程被稱為內省(Introspection)。JMX代理通過內省來查看每一個注冊在MBeanServer上的MBean的方法和超類,看它是否遵從一定設計模式,決定它是否代表了一個MBean,并辨認出它的屬性和操作。?
Standard MBean是JMX管理構件中最簡單的一種,只需要開發一個MBean接口(為了實現Standard MBean,必須遵循一套繼承規范。必須每一個MBean定義一個接口,而且這個接口的名字必須是其被管理的資源的對象類的名稱后面加上”MBean”),一個實現MBean接口的類,并且把它們注冊到MBeanServer中就可以了。

package com.test.jmx;

public interface HelloMBean {
? ? public String getName();
? ? public void setName(String name);
? ? public void printHello();
? ? public void printHello(String whoName);
}
1
2
3
4
5
6
7
8
接下來是真正的資源對象,因為命名規范的限制,因此對象名稱必須為Hello.

package com.test.jmx;

public class Hello implements HelloMBean {
? ? private String name;
? ? @Override
? ? public String getName() {
? ? ? ? return name;
? ? }

? ? @Override
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }

? ? @Override
? ? public void printHello() {
? ? ? ? System.out.println("Hello world, "+ name);
? ? }

? ? @Override
? ? public void printHello(String whoName) {
? ? ? ? System.out.println("Hello, "+whoName);
? ? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
接下去創建一個Agent類:

package com.test.jmx;

import com.sun.jdmk.comm.HtmlAdaptorServer;

import javax.management.*;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class HelloAgent {
? ? public static void main(String[] args) throws MalformedObjectNameException,
? ? ? ? ? ? NotCompliantMBeanException, InstanceAlreadyExistsException,
? ? ? ? ? ? MBeanRegistrationException, IOException {
? ? ? ? // 下面這種方式不能再JConsole中使用
// ? ? ?MBeanServer server = MBeanServerFactory.createMBeanServer();
// 首先建立一個MBeanServer,MBeanServer用來管理我們的MBean,通常是通過MBeanServer來獲取我們MBean的信息,間接
// 調用MBean的方法,然后生產我們的資源的一個對象。
? ? ? ? MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

? ? ? ? String domainName = "MyMBean";

//為MBean(下面的new Hello())創建ObjectName實例
? ? ? ? ObjectName helloName = new ObjectName(domainName+":name=HelloWorld");
// 將new Hello()這個對象注冊到MBeanServer上去
? ? ? ? mbs.registerMBean(new Hello(),helloName);

// Distributed Layer, 提供了一個HtmlAdaptor。支持Http訪問協議,并且有一個不錯的HTML界面,這里的Hello就是用這個作為遠端管理的界面
// 事實上HtmlAdaptor是一個簡單的HttpServer,它將Http請求轉換為JMX Agent的請求
? ? ? ? ObjectName adapterName = new ObjectName(domainName+":name=htmladapter,port=8082");
? ? ? ? HtmlAdaptorServer adapter = new HtmlAdaptorServer();
? ? ? ? adapter.start();
? ? ? ? mbs.registerMBean(adapter,adapterName);

? ? ? ? int rmiPort = 1099;
? ? ? ? Registry registry = LocateRegistry.createRegistry(rmiPort);

? ? ? ? JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:"+rmiPort+"/"+domainName);
? ? ? ? JMXConnectorServer jmxConnector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
? ? ? ? jmxConnector.start();
? ? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
編譯運行,在瀏覽器中輸入localhost:8082,這樣我們就可以對程序進行管理,如圖:

可以看到我們注冊的MyMBean域下的”name=HelloWorld”,可以點擊進去,然后可以修改屬性Name和執行2個printHello方法,可以在控制臺看到效果。具體不貼圖贅述,機智的小伙伴一試就知道怎么玩轉了。

上面代碼中還通過RMI(JMXServiceURL, JMXConnectorServer )注冊URL來提供客戶端連接,可以通過JConsole作為客戶端來管理MBean. 打開JConsole工具(%JAVA_HOME%/bin/jconsole.exe),如圖在遠程進程中輸入rmi地址“service:jmx:rmi:///jndi/rmi://localhost:1099/MyMBean”:

點擊“連接”之后就出現:?


這樣就可以像HTML一樣管理MBean了。

注意上面的代碼中:

Registry registry = LocateRegistry.createRegistry(rmiPort);
1
可以在某一特定端口創建名字服務,從而用戶無需再手工啟動rmiregistry,如果不加入這句代碼,就會出現Connection Refused的異常:

Exception in thread "main" java.io.IOException: Cannot bind to URL [rmi://localhost:1099/MyMBean]: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:?
? ? java.net.ConnectException: Connection refused: connect]
? ? at javax.management.remote.rmi.RMIConnectorServer.newIOException(Unknown Source)
? ? at javax.management.remote.rmi.RMIConnectorServer.start(Unknown Source)
? ? at com.test.jmx.HelloAgent.main(HelloAgent.java:44)
Caused by: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:?
? ? java.net.ConnectException: Connection refused: connect]
? ? at com.sun.jndi.rmi.registry.RegistryContext.bind(Unknown Source)
? ? at com.sun.jndi.toolkit.url.GenericURLContext.bind(Unknown Source)
? ? at javax.naming.InitialContext.bind(Unknown Source)
? ? at javax.management.remote.rmi.RMIConnectorServer.bind(Unknown Source)
? ? ... 2 more
Caused by: java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:?
? ? java.net.ConnectException: Connection refused: connect
? ? at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
? ? at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
? ? at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
? ? at sun.rmi.server.UnicastRef.newCall(Unknown Source)
? ? at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
? ? ... 6 more
Caused by: java.net.ConnectException: Connection refused: connect
? ? at java.net.DualStackPlainSocketImpl.connect0(Native Method)
? ? at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
? ? at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
? ? at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
? ? at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
? ? at java.net.PlainSocketImpl.connect(Unknown Source)
? ? at java.net.SocksSocketImpl.connect(Unknown Source)
? ? at java.net.Socket.connect(Unknown Source)
? ? at java.net.Socket.connect(Unknown Source)
? ? at java.net.Socket.<init>(Unknown Source)
? ? at java.net.Socket.<init>(Unknown Source)
? ? at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
? ? at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
? ? ... 11 more
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
當然,這也就其他的解決辦法:運行 %JAVA_HOME%/bin/rmiregistry.exe 1099就有和那行代碼一樣的效果。

我們不僅可以通過JConsole作為客戶端采用rmi的方式來進行管理,我們同樣可以采用自定義程序作為客戶端來連接JMXConnectorServer管理MBean.

package com.test.jmx;

import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class Client {

? ? public static void main(String[] args) throws IOException,
? ? ? ? ? ? MalformedObjectNameException, InstanceNotFoundException,
? ? ? ? ? ? AttributeNotFoundException, InvalidAttributeValueException,
? ? ? ? ? ? MBeanException, ReflectionException, IntrospectionException {
? ? ? ? String domainName = "MyMBean";
? ? ? ? int rmiPort = 1099;
? ? ? ? JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:"+rmiPort+"/"+domainName);
? ? ? ? // 可以類比HelloAgent.java中的那句:
? ? ? ? // JMXConnectorServer jmxConnector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
? ? ? ? JMXConnector jmxc = JMXConnectorFactory.connect(url);
? ? ? ? MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

? ? ? ? //print domains
? ? ? ? System.out.println("Domains:------------------");
? ? ? ? String domains[] = mbsc.getDomains();
? ? ? ? for(int i=0;i<domains.length;i++){
? ? ? ? ? ? System.out.println("\tDomain["+i+"] = "+domains[i]);
? ? ? ? }
? ? ? ? //MBean count
? ? ? ? System.out.println("MBean count = "+mbsc.getMBeanCount());
? ? ? ? //process attribute
? ? ? ? ObjectName mBeanName = new ObjectName(domainName+":name=HelloWorld");
? ? ? ? mbsc.setAttribute(mBeanName, new Attribute("Name","zzh"));//注意這里是Name而不是name
? ? ? ? System.out.println("Name = "+mbsc.getAttribute(mBeanName, "Name"));

? ? ? ? //接下去是執行Hello中的printHello方法,分別通過代理和rmi的方式執行
? ? ? ? //via proxy
? ? ? ? HelloMBean proxy = MBeanServerInvocationHandler.newProxyInstance(mbsc, mBeanName, HelloMBean.class, false);
? ? ? ? proxy.printHello();
? ? ? ? proxy.printHello("jizhi boy");
? ? ? ? //via rmi
? ? ? ? mbsc.invoke(mBeanName, "printHello", null, null);
? ? ? ? mbsc.invoke(mBeanName, "printHello", new String[]{"jizhi gril"}, new String[]{String.class.getName()});

? ? ? ? //get mbean information
? ? ? ? MBeanInfo info = mbsc.getMBeanInfo(mBeanName);
? ? ? ? System.out.println("Hello Class: "+info.getClassName());
? ? ? ? for(int i=0;i<info.getAttributes().length;i++){
? ? ? ? ? ? System.out.println("Hello Attribute:"+info.getAttributes()[i].getName());
? ? ? ? }
? ? ? ? for(int i=0;i<info.getOperations().length;i++){
? ? ? ? ? ? System.out.println("Hello Operation:"+info.getOperations()[i].getName());
? ? ? ? }

? ? ? ? //ObjectName of MBean
? ? ? ? System.out.println("all ObjectName:--------------");
? ? ? ? Set<ObjectInstance> set = mbsc.queryMBeans(null, null);
? ? ? ? for(Iterator<ObjectInstance> it = set.iterator();it.hasNext();){
? ? ? ? ? ? ObjectInstance oi = it.next();
? ? ? ? ? ? System.out.println("\t"+oi.getObjectName());
? ? ? ? }
? ? ? ? jmxc.close();
? ? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
運行結果:

Domains:------------------
? ? Domain[0] = MyMBean
? ? Domain[1] = java.nio
? ? Domain[2] = JMImplementation
? ? Domain[3] = com.sun.management
? ? Domain[4] = java.lang
? ? Domain[5] = java.util.logging
MBean count = 21
Name = zzh
Hello Class: com.test.jmx.Hello
Hello Attribute:Name
Hello Operation:printHello
Hello Operation:printHello
all ObjectName:--------------
? ? java.lang:type=OperatingSystem
? ? java.lang:type=Compilation
? ? java.lang:type=MemoryPool,name=PS Old Gen
? ? java.lang:type=Memory
? ? JMImplementation:type=MBeanServerDelegate
? ? java.lang:type=MemoryPool,name=PS Perm Gen
? ? java.lang:type=Runtime
? ? MyMBean:name=htmladapter,port=8082
? ? java.nio:type=BufferPool,name=direct
? ? java.lang:type=GarbageCollector,name=PS MarkSweep
? ? java.nio:type=BufferPool,name=mapped
? ? java.lang:type=Threading
? ? com.sun.management:type=HotSpotDiagnostic
? ? java.lang:type=GarbageCollector,name=PS Scavenge
? ? MyMBean:name=HelloWorld
? ? java.lang:type=ClassLoading
? ? java.lang:type=MemoryPool,name=PS Survivor Space
? ? java.lang:type=MemoryManager,name=CodeCacheManager
? ? java.lang:type=MemoryPool,name=Code Cache
? ? java.util.logging:type=Logging
? ? java.lang:type=MemoryPool,name=PS Eden Space
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
這是客戶端的運行結果,由于在客戶端調用了服務端的方法,可以在服務端看到打印結果:

Hello world, zzh
Hello, jizhi boy
Hello world, zzh
Hello, jizhi gril
1
2
3
4
上面代碼涉及到輔助原數據的概念:輔助元數據類用來描述管理構件。輔助元數據類不僅被用來內省標準管理構件,也被動態管理構件用來進行自我描述。這些類根據屬性、操作、構建器和通告描述了管理接口。JMX代理通過這些元數據類管理所有管理構件,而不管這些管理構件的類型。部分輔助元類如下:

MBeanInfo–包含了屬性、操作、構建器和通知的信息。
MBeanFeatureInfo–為下面類的超類。
MBeanAttributeInfo–用來描述管理構件中的屬性。
MBeanConstructorInfo–用來描述管理構件中的構建器。
MBeanOperationInfo–用來描述管理構件中的操作。
MBeanParameterInfo–用來描述管理構件操作或構建器的參數。
MBeanNotificationInfo–用來描述管理構件發出的通知。
有關Notication, Dynamic MBean, Model MBean以及Apache Common Modeler由于篇幅限制將后面文章中講述。

參考資料
JMX整理
JMX簡介
http://blog.csdn.net/DryKillLogic/article/category/762777
用Apache的commons-modeler來輔助開發JMX
---------------------?
作者:朱小廝?
來源:CSDN?
原文:https://blog.csdn.net/u013256816/article/details/52800742?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的从零开始玩转JMX(一)——简介和Standard MBean的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜免费小视频 | 美丽的姑娘在线观看 | 久久mm | 91在线观看免费高清完整版在线观看 | 久久午夜无码鲁丝片 | 亚洲午夜一区二区 | 亚洲国产日韩一区无码精品久久久 | 扒下小娇妻的内裤打屁股 | 国产成人精品一区二三区四区五区 | 久草网视频在线观看 | 亚洲av无一区二区三区久久 | 操模特 | 精品午夜福利视频 | 激情欧美一区二区三区 | 午夜精品美女久久久久av福利 | 日韩欧美国产网站 | av国产片 | 人人爽人人爽人人爽 | 国产传媒一区 | 日产精品一区 | av在线网址观看 | 日韩av一区在线观看 | va视频在线 | 香港三日本8a三级少妇三级99 | 久青草视频在线观看 | 国产欧美日韩 | 亚洲特黄一级片 | 亚洲 激情 | 中文字幕在线观看二区 | 一区二区美女视频 | 很色的网站 | 黄页视频在线观看 | 精品国产一区二区三区噜噜噜 | 亚洲经典一区二区 | 欧美片在线观看 | 污在线观看 | 成人写真福利网 | 国产91精品一区 | 国产免费又爽又色又粗视频 | 91手机在线观看 | 一二三区不卡 | 欧美日韩中出 | 欧美黄片一区二区三区 | 奇米精品一区二区三区在线观看一 | 嫩草影院菊竹影院 | 欧美高清视频一区二区三区 | 午夜精品一区二区三区在线播放 | 欧美国产乱视频 | 国产成人精品一区二区三区无码熬 | 亚洲视频免费看 | 男同志毛片特黄毛片 | 欧美国产日韩一区 | 亚洲自拍网站 | 视频国产精品 | 天堂二区| 91香蕉视频在线看 | 中文字幕在线看高清电影 | 96久久精品 | 亚洲视频在线观看一区 | 日韩污视频在线观看 | 色人人| 强侵犯の奶水授乳羞羞漫虐 | 亚洲黄色片网站 | 69xxx免费视频 | 爱上av | 特黄一级片 | 亚洲欧美日韩精品永久在线 | 对白超刺激精彩粗话av | 国产 欧美 日韩 一区 | 美女的奶胸大爽爽大片 | 天天躁日日躁aaaxxⅹ | 日一日干一干 | 久久色网站 | 欧美第一夜 | 理论片高清免费理伦片 | 夜夜爽av | 香蕉视频黄污 | 91九色在线播放 | 亚洲男人的天堂在线 | 中文字幕日韩在线播放 | 欧美无砖区 | 男女午夜爽爽爽 | 黄视频网站在线看 | 亚洲一级片免费 | 我的丝袜美腿尤物麻麻 | a级黄色小视频 | 亚洲国产第一 | 国产精品1区 | 香蕉视频黄污 | 欧美无马| 加勒比伊人 | 欧美特黄 | 亚洲网址在线 | 欧美一区二区视频免费观看 | 欧美激情综合网 | 精品欧美一区二区三区成人 | 夜夜嗨av一区二区三区免费区 | 尹人成人 | 动漫美女被到爽 |