亚洲成人一区在线观看_天堂网www_国产精品久久9_中文在线播放_伊人天天_久久精品久久久精品美女

當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > gen_server tasting 之超簡(jiǎn)單名稱服務(wù)(續(xù))

gen_server tasting 之超簡(jiǎn)單名稱服務(wù)(續(xù))
2010-01-13 23:16:25  作者:  來(lái)源:
    前幾天寫了篇《gen_server tasting 之超簡(jiǎn)單名稱服務(wù) 》東西,親身體驗(yàn)了 erlang otp 的強(qiáng)悍威力。不過(guò)正所謂“超簡(jiǎn)單”,那個(gè)版本還是很初級(jí)的,所以這兩天邊繼續(xù)研究邊動(dòng)手,開發(fā)迭代版本的名稱服務(wù)。

 

在這個(gè)版本中,需要提供如下功能:

 

  1. 使用 otp 的 supervisor 監(jiān)控樹,保證服務(wù)可靠性。
  2. 添加日志功能,通過(guò)定制 sasl alarm_handler 來(lái)記錄警告事件。
  3. 將名稱服務(wù)打包為 application,暫且叫 vsns 吧,very stabilization name server 呵呵。
  4. 開放 socket 服務(wù) (使用半阻塞的混合模式),使用 vsns://verb /param 自定義協(xié)議對(duì)外提供訪問(wèn)支持。

最終驗(yàn)證性的功能測(cè)試用例如下,主要的測(cè)試代碼位于 test/0 方法中,其上的幾個(gè)方法都用于 socket 通信:

 

Erlang代碼 復(fù)制代碼
  1. -module(vsns_tcp_client).   
  2.   
  3. -author(lzy).   
  4. -email(lzy.dev@gmail.com).   
  5. -date("2009.02.06").   
  6. -vsn(0.11).   
  7.   
  8. -compile(export_all).   
  9.   
  10. conn() ->   
  11.     {ok, Socket} = gen_tcp:connect("localhost"8304,   
  12.         [binary, {packet, 2}, {reuseaddr, true}, {active, once}]),   
  13.     Socket.   
  14.   
  15. eval(Socket, Args, AssertVal) ->   
  16.     ok = gen_tcp:send(Socket, Args),   
  17.     receive   
  18.         {tcp, _, AssertVal} ->   
  19.             io:format("Ok. ~p = ~p.~n", [Args, AssertVal]);   
  20.         {tcp_closed, _} ->   
  21.             case Args of   
  22.                 <<"vsns://kernel_oops">> ->   
  23.                     io:format("Ok. kernel_oops = tcp_closed.~n");   
  24.                 _Other ->   
  25.                     io:format("Connection abort by server.~n")   
  26.             end;   
  27.         Other  ->   
  28.             io:format("Assert faild. ~p != ~p.~n", [Other, AssertVal])   
  29.     end,   
  30.     inet:setopts(Socket, [{active, once}]).   
  31.   
  32. close(Socket) ->   
  33.     gen_tcp:close(Socket).   
  34.   
  35. test() ->   
  36.     S = conn(),   
  37.   
  38.     eval(S, <<"vsns://remove_all">>, <<"ack">>),   
  39.   
  40.     eval(S, <<"vsns://save/abc/123">>, <<"">>),   
  41.     eval(S, <<"vsns://save/abc/456">>, <<"123">>),   
  42.     eval(S, <<"vsns://save/abc/789">>, <<"456">>),   
  43.   
  44.     eval(S, <<"vsns://load_all">>, <<"ack">>),   
  45.   
  46.     eval(S, <<"vsns://remove/abc">>, <<"789">>),   
  47.     eval(S, <<"vsns://remove/not_value">>, <<"">>),   
  48.   
  49.     eval(S, <<"foo">>, <<"unknow">>),   
  50.   
  51.     eval(S, <<"vsns://kernel_oops">>, <<"">>),   
  52.   
  53.     ok = close(S),   
  54.   
  55.     pass.   
  56.   
  57. %% File end.  

 

          實(shí)際實(shí)現(xiàn) supervisor 監(jiān)控樹、日志和警告事件功能的過(guò)程,也是學(xué)習(xí) 《Erlang 程序設(shè)計(jì)》的過(guò)程。

 

          首先,為名稱服務(wù)添加監(jiān)控進(jìn)程。erlang otp 監(jiān)控樹很簡(jiǎn)單,只需要實(shí)現(xiàn)一個(gè) supervisor behaviour module 提供給 otp supervisor 模塊就可以,前面版本的名稱服務(wù)是通過(guò) erlang shell 啟動(dòng)的,在以后將由這個(gè)監(jiān)控進(jìn)程來(lái)啟動(dòng)她,主要的啟動(dòng)代碼在 init/1 方法中,監(jiān)控模塊代碼如下:

 

Erlang代碼 復(fù)制代碼
  1. -module(name_server_sup).   
  2.   
  3. -author(lzy).   
  4. -email(lzy.dev@gmail.com).   
  5. -date("2009.02.04").   
  6. -vsn(0.1).   
  7.   
  8. -behaviour(supervisor).   
  9.   
  10. %% gen_supervisor behaviour callback functions.   
  11. -export([init/1]).   
  12.   
  13. %% Interface functions.   
  14. -export([start/0, start_in_shell/0, start_link/1]).   
  15.   
  16. start() ->   
  17.     spawn(fun() -> supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []) end).   
  18.   
  19. start_in_shell() ->   
  20.     {ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []),   
  21.     unlink(Pid).   
  22.   
  23. start_link(Args) ->   
  24.     supervisor:start_link({local, ?MODULE}, ?MODULE, Args).   
  25.   
  26. init([]) ->   
  27.     gen_event:swap_handler(alarm_handler, {alarm_handler, swap}, {vsns_alarm_handler, foo}),   
  28.   
  29.     {ok, {   
  30.             {one_for_one, 310},   
  31.             [{   
  32.                 vsns_name_server,   
  33.                 {name_server, start_link, []},   
  34.                 permanent,   
  35.                 1,   
  36.                 worker,   
  37.                 [name_server]   
  38.             }]         
  39.     }}.   
  40.   
  41. %% File end.  

 

          有了這個(gè) name_server_sup 就不怕 name_server 崩潰了,supervisor 進(jìn)程會(huì)負(fù)責(zé)重新啟動(dòng),對(duì)于描述監(jiān)控策略的數(shù)據(jù)結(jié)構(gòu)可參考 erlang doc。其中的 vsns_alarm_handler 是定制的警告事件處理模塊,負(fù)責(zé)將服務(wù)中的報(bào)警記錄到 erlang sasl 日志中,后期可以使用 rb 工具來(lái)查看處理。接下來(lái)就是警告日志處理模塊代碼:

 

Erlang代碼 復(fù)制代碼
  1. -module(vsns_alarm_handler).   
  2.   
  3. -author(lzy).   
  4. -email(lzy.dev@gmail.com).   
  5. -date("2009.02.04").   
  6. -vsn(0.11).   
  7.   
  8. -behaviour(gen_event).   
  9.   
  10. %% gen_event behaviour callback functions.   
  11. -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]).   
  12.   
  13. init(Args) ->   
  14.     io:format("vsns_alarm_handler init : ~p.~n", [Args]),   
  15.     {ok, Args}.   
  16.   
  17. handle_event({set_alarm, {remove_all, From}}, _State) ->   
  18.     error_logger:error_msg("vsns depot clear by ~p started.~n.", [From]),   
  19.     {ok, _State};   
  20.   
  21. handle_event({clear_alarm, {remove_all, From}}, _State) ->   
  22.     error_logger:error_msg("vsns depot clear by ~p done.~n.", [From]),   
  23.     {ok, _State};   
  24.   
  25. handle_event(Event, State) ->   
  26.     error_logger:error_msg("unmatched event: ~p.~n", [Event, State]),   
  27.     {ok, State}.   
  28.   
  29. handle_call(_Req, State) ->   
  30.     {ok, State, State}.   
  31.        
  32. handle_info(_Info, State) ->   
  33.     {ok, State}.   
  34.   
  35. terminate(_Reason, _State) ->   
  36.     ok.   
  37.   
  38. code_change(_OldVsn, State, _Extra) ->   
  39.     {ok, State}.   
  40.   
  41. %% File end.  
 

          歸根到底,就是通過(guò) error_logger:error_msg 調(diào)用來(lái)記錄日志。當(dāng)然還涉及到 erlang sasl 的配置:

 

Config代碼 復(fù)制代碼
  1. %% file name: sasl_log.config   
  2. %% auther: lzy   
  3. %% email: lzy.dev@gmail.com   
  4. %% date: 2009.02.04  
  5. %% version: 0.1  
  6.   
  7. [{sasl, [   
  8.     {sasl_error_logger, false},    
  9.     {errlog_type, error},   
  10.     {error_logger_mf_dir, "./logs"},   
  11.     %% 10M per log file.   
  12.     {error_logger_mf_maxbytes, 1048760},   
  13.     {error_logger_mf_maxfiles, 5}   
  14. ]}].   
  15.   
  16. %% File end.  
 

          該配置文件可以通過(guò) erlang shell 的 啟動(dòng)啟動(dòng)參數(shù)指定。-boot start_sasl -config .\sasl_log。再接下來(lái)就是打包 vsns application,這需要一個(gè) application 描述文件和一個(gè) application behavior 模塊,很簡(jiǎn)單具體配置參數(shù)語(yǔ)意可參考 erlang doc。

 

App代碼 復(fù)制代碼
  1. %% file name: vsns.app   
  2. %% auther: lzy   
  3. %% email: lzy.dev@gmail.com   
  4. %% date: 2009.02.05  
  5. %% version: 0.1  
  6.   
  7. {   
  8.     application, vsns,   
  9.     [   
  10.         {description, "very stabilization name service."},   
  11.         {vsn, "1.0a"},   
  12.         {modules, [vsns_app, vsns_supervisor, name_server, vsns_alarm_handler]},   
  13.         {registered, [vsns_supervisor, name_server]},   
  14.         {applications, [kernel, stdlib]},   
  15.         {mod, {vsns_app, []}},   
  16.         {start_phases, []}   
  17.     ]   
  18. }.   
  19.   
  20. %% File end.  
 
Erlang代碼 復(fù)制代碼
  1. -module(vsns_app).   
  2.   
  3. -author(lzy).   
  4. -email(lzy.dev@gmail.com).   
  5. -date("2009.02.05").   
  6. -vsn(0.1).   
  7.   
  8. -behavior(application).   
  9.   
  10. -export([start/2, stop/1]).   
  11.   
  12. start(_Type, Args) ->   
  13.     name_server_sup:start_link(Args).   
  14.   
  15. stop(_State) ->   
  16.     void.   
  17.   
  18. %% File end.  

 

          經(jīng)過(guò)這樣的包裝,就可以通過(guò) application:start(vsns) 調(diào)用來(lái)啟動(dòng) vsns 服務(wù)。通過(guò) appmon 工具可以看到如下進(jìn)程樹:

 

vsns 進(jìn)程樹

 

到這里,我們就可以通過(guò) erlang 來(lái)使用 vsns 了。

 

Erlang代碼 復(fù)制代碼
  1. C:\Program Files\erl5.6.4\usr\lzy_app\vsns>..\..\..\bin\erl.exe -sname vsns +P 1  
  2. 02400 -smp enable +S 1 -boot start_sasl -config sasl_log   
  3. Eshell V5.6.4  (abort with ^G)   
  4. (vsns@srclzy)1> application:start(vsns).   
  5. vsns_alarm_handler init : {foo,{alarm_handler,[]}}.   
  6. name_server starting.   
  7. ok   
  8. (vsns@srclzy)2> name_server:save(abc, 123).   
  9. undefined   
  10. (vsns@srclzy)3> name_server:load_all().   
  11. [{abc,123}]  
 

          最后還需要一個(gè) socket tcp 服務(wù)器,來(lái)將 vsns 暴露出來(lái),允許其它 client 來(lái)使用服務(wù)。otp 中沒(méi)有類似的 socket server behavior,但可以通過(guò) gen_server 來(lái)實(shí)現(xiàn),當(dāng)然甚至可以實(shí)現(xiàn)一個(gè)非 otp 相關(guān)的 socket 服務(wù)器。這里 Serge Aleynikov 實(shí)現(xiàn)了一個(gè)很好 tcp 服務(wù)器,基于有限狀態(tài)機(jī)模式來(lái)處理請(qǐng)求,在此做了很好的闡述:Building a Non-blocking TCP server using OTP principles ,不過(guò)恐怕需要代理來(lái)打開連接。在他給出的代碼中,我添加了幾行代碼,將 socket server 提供的服務(wù)是做為可配置的,通過(guò) application 環(huán)境來(lái)配置 socket server 使用的 gen_fsm behaviour module,大約位于 tcp_server_app 模塊的 15 和 27 行。

 

Erlang代碼 復(fù)制代碼
  1. -module(tcp_server_app).   
  2.   
  3. ... ...   
  4.   
  5. -define(DEF_SERVICE, tcp_echo_fsm).   
  6.   
  7. ... ...   
  8.   
  9. start(_Type,  _Args) ->   
  10.     ListenPort = get_app_env(listen_port, ?DEF_PORT),    
  11.     ServiceMod = get_app_env(service_mod, ?DEF_SERVICE),    
  12.     supervisor:start_link({local, ?MODULE}, ?MODULE, [ListenPort, ServiceMod]).   
  13.   
  14. ... ...  
 

          在 saleyn_tcp_server 中提供的是 echo 服務(wù)。為了將 saleyn_tcp_server 服務(wù)指定成 vsns,除了上面的修改外,剩下就只需要實(shí)現(xiàn)一個(gè)調(diào)用 vsns 的 gen_fsm behaviour module 了,代碼很簡(jiǎn)單,是基于 tcp_echo_fsm 修改得來(lái)的,呵呵。

 

Erlang代碼 復(fù)制代碼
  1. -module(vsns_tcp_fsm).   
  2.   
  3. -author(lzy).   
  4. -email(lzy.dev@gmail.com).   
  5. -date("2009.02.06").   
  6. -vsn(0.1).   
  7. -remark("vsns_tcp_fsm used by saleyn_tcp_server appliction to support vsns socket server.").   
  8. -remark("It referenced from saleyn_tcp_server/tcp_echo_fsm module.").   
  9.   
  10. -behaviour(gen_fsm).   
  11.   
  12. -export([start_link/0, set_socket/2]).   
  13.   
  14. %% gen_fsm callbacks   
  15. -export([init/1, handle_event/3,   
  16.          handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).   
  17.   
  18. %% FSM States   
  19. -export([   
  20.     'WAIT_FOR_SOCKET'/2,   
  21.     'WAIT_FOR_DATA'/2  
  22. ]).   
  23.   
  24. -record(state, {   
  25.                 socket,    % client socket   
  26.                 addr       % client address   
  27.                }).   
  28.   
  29. -define(TIMEOUT, 120000).   
  30.   
  31. %%%------------------------------------------------------------------------   
  32. %%% API   
  33. %%%------------------------------------------------------------------------   
  34.   
  35. %%-------------------------------------------------------------------------   
  36. %% @spec (Socket) -> {ok,Pid} | ignore | {error,Error}   
  37. %% @doc To be called by the supervisor in order to start the server.   
  38. %%      If init/1 fails with Reason, the function returns {error,Reason}.   
  39. %%      If init/1 returns {stop,Reason} or ignore, the process is   
  40. %%      terminated and the function returns {error,Reason} or ignore,   
  41. %%      respectively.   
  42. %% @end   
  43. %%-------------------------------------------------------------------------   
  44. start_link() ->   
  45.     gen_fsm:start_link(?MODULE, [], []).   
  46.   
  47. set_socket(Pid, Socket) when is_pid(Pid), is_port(Socket) ->   
  48.     gen_fsm:send_event(Pid, {socket_ready, Socket}).   
  49.   
  50. %%%------------------------------------------------------------------------   
  51. %%% Callback functions from gen_server   
  52. %%%------------------------------------------------------------------------   
  53.   
  54. %%-------------------------------------------------------------------------   
  55. %% Func: init/1  
  56. %% Returns: {ok, StateName, StateData}          |   
  57. %%          {ok, StateName, StateData, Timeout} |   
  58. %%          ignore                              |   
  59. %%          {stop, StopReason}   
  60. %% @private   
  61. %%-------------------------------------------------------------------------   
  62. init([]) ->   
  63.     process_flag(trap_exit, true),   
  64.     {ok, 'WAIT_FOR_SOCKET', #state{}}.   
  65.   
  66. %%-------------------------------------------------------------------------   
  67. %% Func: StateName/2  
  68. %% Returns: {next_state, NextStateName, NextStateData}          |   
  69. %%          {next_state, NextStateName, NextStateData, Timeout} |   
  70. %%          {stop, Reason, NewStateData}   
  71. %% @private   
  72. %%-------------------------------------------------------------------------   
  73. 'WAIT_FOR_SOCKET'({socket_ready, Socket}, State) when is_port(Socket) ->   
  74.     % Now we own the socket   
  75.     inet:setopts(Socket, [binary, {packet, 2}, {reuseaddr, true}, {active, once}]),   
  76.     {ok, {IP, _Port}} = inet:peername(Socket),   
  77.     {next_state, 'WAIT_FOR_DATA', State#state{socket=Socket, addr=IP}, ?TIMEOUT};   
  78.   
  79. 'WAIT_FOR_SOCKET'(Other, State) ->   
  80.     error_logger:error_msg("State: 'WAIT_FOR_SOCKET'. Unexpected message: ~p\n", [Other]),   
  81.     %% Allow to receive async messages   
  82.     {next_state, 'WAIT_FOR_SOCKET', State}.   
  83.   
  84. %% Notification event coming from client   
  85. 'WAIT_FOR_DATA'({data, Data}, #state{socket=S} = State) ->   
  86.     ok = handle_data(S, string:tokens(binary_to_list(Data), "/")),   
  87.     inet:setopts(S, [{active, once}]),   
  88.     {next_state, 'WAIT_FOR_DATA', State, ?TIMEOUT};   
  89.   
  90. 'WAIT_FOR_DATA'(timeout, State) ->   
  91.     error_logger:error_msg("~p Client connection timeout - closing.\n", [self()]),   
  92.     {stop, normal, State};   
  93.   
  94. 'WAIT_FOR_DATA'(Data, State) ->   
  95.     io:format("~p Ignoring data: ~p\n", [self(), Data]),   
  96.     {next_state, 'WAIT_FOR_DATA', State, ?TIMEOUT}.   
  97.   
  98. %%-------------------------------------------------------------------------   
  99. %% Func: handle_event/3  
  100. %% Returns: {next_state, NextStateName, NextStateData}          |   
  101. %%          {next_state, NextStateName, NextStateData, Timeout} |   
  102. %%          {stop, Reason, NewStateData}   
  103. %% @private   
  104. %%-------------------------------------------------------------------------   
  105. handle_event(Event, StateName, StateData) ->   
  106.     {stop, {StateName, undefined_event, Event}, StateData}.   
  107.   
  108. %%-------------------------------------------------------------------------   
  109. %% Func: handle_sync_event/4  
  110. %% Returns: {next_state, NextStateName, NextStateData}            |   
  111. %%          {next_state, NextStateName, NextStateData, Timeout}   |   
  112. %%          {reply, Reply, NextStateName, NextStateData}          |   
  113. %%          {reply, Reply, NextStateName, NextStateData, Timeout} |   
  114. %%          {stop, Reason, NewStateData}                          |   
  115. %%          {stop, Reason, Reply, NewStateData}   
  116. %% @private   
  117. %%-------------------------------------------------------------------------   
  118. handle_sync_event(Event, _From, StateName, StateData) ->   
  119.     {stop, {StateName, undefined_event, Event}, StateData}.   
  120.   
  121. %%-------------------------------------------------------------------------   
  122. %% Func: handle_info/3  
  123. %% Returns: {next_state, NextStateName, NextStateData}          |   
  124. %%          {next_state, NextStateName, NextStateData, Timeout} |   
  125. %%          {stop, Reason, NewStateData}   
  126. %% @private   
  127. %%-------------------------------------------------------------------------   
  128. handle_info({tcp, Socket, Bin}, StateName, #state{socket=Socket} = StateData) ->   
  129.     % Flow control: enable forwarding of next TCP message   
  130.     inet:setopts(Socket, [{active, once}]),   
  131.     ?MODULE:StateName({data, Bin}, StateData);   
  132.   
  133. handle_info({tcp_closed, Socket}, _StateName,   
  134.             #state{socket=Socket, addr=Addr} = StateData) ->   
  135.     error_logger:info_msg("~p Client ~p disconnected.\n", [self(), Addr]),   
  136.     {stop, normal, StateData};   
  137.   
  138. handle_info(_Info, StateName, StateData) ->   
  139.     {noreply, StateName, StateData}.   
  140.   
  141. %%-------------------------------------------------------------------------   
  142. %% Func: terminate/3  
  143. %% Purpose: Shutdown the fsm   
  144. %% Returns: any   
  145. %% @private   
  146. %%-------------------------------------------------------------------------   
  147. terminate(_Reason, _StateName, #state{socket=Socket}) ->   
  148.     (catch gen_tcp:close(Socket)),   
  149.     ok.   
  150.   
  151. %%-------------------------------------------------------------------------   
  152. %% Func: code_change/4  
  153. %% Purpose: Convert process state when code is changed   
  154. %% Returns: {ok, NewState, NewStateData}   
  155. %% @private   
  156. %%-------------------------------------------------------------------------   
  157. code_change(_OldVsn, StateName, StateData, _Extra) ->   
  158.     {ok, StateName, StateData}.   
  159.   
  160. handle_data(S, ["vsns:""save", Key, Value]) ->   
  161.     gen_tcp:send(S, list_to_binary(swap_undefined(name_server:save(Key, Value))));   
  162.   
  163. handle_data(S, ["vsns:""load", Key]) ->   
  164.     gen_tcp:send(S, list_to_binary(swap_undefined(name_server:load(Key))));   
  165.   
  166. handle_data(S, ["vsns:""load_all"]) ->   
  167.     name_server:load_all(),   
  168.     gen_tcp:send(S, <<"ack">>); % list_to_binary(name_server:load_all())   
  169.   
  170. handle_data(S, ["vsns:""remove", Key]) ->   
  171.     gen_tcp:send(S, list_to_binary(swap_undefined(name_server:remove(Key))));   
  172.   
  173. handle_data(S, ["vsns:""remove_all"]) ->   
  174.     name_server:remove_all(),   
  175.     gen_tcp:send(S, <<"ack">>); % list_to_binary(name_server:remove_all())   
  176.   
  177. handle_data(S, ["vsns:""kernel_oops"]) ->   
  178.     gen_tcp:send(S, list_to_binary(name_server:kernel_oops()));   
  179.   
  180. handle_data(S, _Data) ->   
  181.     gen_tcp:send(S, <<"unknow">>).   
  182.   
  183. swap_undefined(undefined) ->   
  184.     "";   
  185.   
  186. swap_undefined(Other) ->   
  187.     Other.   
  188.   
  189. %   File end.  
主站蜘蛛池模板: 免费一级 国产 | 国产在线视频一区二区 | 国产亚洲一区二区三区在线观看 | 色综合免费视频 | 日韩在线国产 | 91亚洲精品在线观看 | 狠狠干美女 | 欧美日韩在线第一页 | 成人av影片在线观看 | 国产一区二区视频在线 | 中文字幕国产一区 | 国产精品视频导航 | 色欧美日韩 | 精品国产一区二区三区在线观看 | 日韩精品中文字幕在线观看 | 人人人射 | 亚洲欧美aa | 日韩一区二区在线免费 | 欧美亚洲一 | 日本欧美久久久久 | 免费一区 | 九色av | 黄色一级网址 | 日韩视频精品在线 | 久久精品日 | 国精产品一区二区三区 | 国产伦精品一区二区三区四区视频 | 精品一区二区视频 | 精品视频在线免费观看 | 国产一级视频在线播放 | 欧美日韩国产一级片 | 国产美女高潮 | 麻豆毛片| 久草新视频在线观看 | 91久久夜色精品国产九色 | 精品视频一区二区在线观看 | 呦呦在线观看 | 亚洲一区中文字幕 | 国产欧美专区 | 午夜日韩 | a欧美| 国产精品久久久久久久岛一牛影视 | 日韩在线1 | 国产欧美网址 | 黄网免费 | 污片在线免费看 | 99国产精品 | 91久久综合亚洲鲁鲁五月天 | 91小视频| 国产精品久久久久久 | 欧美日韩在线第一页 | 中文字幕日韩一区二区不卡 | 91在线视频福利 | 九九天堂 | av在线免费播放 | 成人黄色一级片 | 日本在线免费 | 欧美性v| 成人在线视频播放 | 国产欧美日韩在线观看 | 国产高清视频在线观看 | 成年人精品视频在线观看 | 国产亚州av | 欧美精品网站 | 国产一区二区av | 人妖一区 | 中国一级大黄大黄大色毛片 | 日韩在线观看高清 | 日本在线观看一区二区 | 欧美在线小视频 | 激情91| 国产亚洲精品久久久久动 | 久久久久久久久久久亚洲 | 国产欧美日韩综合精品一区二区 | 一区二区精品 | 三级视频在线 | 日韩欧美视频 | 国产精品网站在线看 | 久久精品小视频 | 男女啪啪高清无遮挡 | 一级片在线观看 | 在线观看免费黄色小视频 | 青青草一区| 一区二区免费在线观看 | h在线免费| 黄色小视频在线观看 | 久久亚洲一区二区 | 国产黄色大片网站 | 久草一区| 精品亚洲视频在线 | 亚洲精品字幕 | 中文字幕av第一页 | 成人av一区二区三区 | 国产精品久久久久久吹潮 | 亚洲免费a| www.男人天堂 | 在线观看国产wwwa级羞羞视频 | 久久极品 | 亚洲丶国产丶欧美一区二区三区 | 国产富婆一级全黄大片 | 亚洲精品视频一区 | 亚洲精品久久久久久久久久久 | a毛片毛片av永久免费 | 久久久久国| 久久精品99国产精品日本 | 亚洲一区av在线 | 亚洲精品久久久一区二区三区 | www午夜| 最新av片| 中文字幕一区在线观看视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 免费视频一区 | 羞羞视频免费网站 | www九九热 | 精品国产色 | 久久综合中文字幕 | 精品久久久久一区二区国产 | 欧美日韩一区二区视频在线观看 | 一级片免费在线 | 国产免费一区二区 | 日韩中文字幕在线视频 | 国产一区精品电影 | 亚洲精品一二三四五区 | 成人不卡| 黄色一级毛片在线观看 | 亚洲第一性理论片 | 草久在线视频 | 亚洲精选久久 | 国产女人爽到高潮免费视频 | 午夜精品久久久久久久久 | 蜜桃视频一区二区 | 久久这里有精品 | 亚洲高清视频网站 | 超碰精品在线观看 | 久久91视频 | 五月天电影网 | 国产91久久精品一区二区 | 黄色片免费看. | 亚洲精品免费观看 | 91精品国产综合久久久久久丝袜 | 日韩在线观看中文字幕 | 丰满少妇久久久久久久 | 国产一区二区三区久久久久久久久 | 精品一区二区三区免费视频 | 日韩欧美在线不卡 | 国产情侣一区二区三区 | 成年免费a级毛片 | 欧美日韩精品一区 | 欧美激情综合五月色丁香小说 | 国产一区二区三区视频在线观看 | 亚洲一区二区三区中文字幕 | 日本久久久久久久久久久久 | 国产精品无码专区在线观看 | 欧美精品一区二区三区视频 | 精品视频免费在线 | 欧美自拍视频一区 | 久久99深爱久久99精品 | ww8888免费视频 | 天堂亚洲 | 涩涩视频在线看 | 日韩av在线一区 | 久久久久无码国产精品一区 | 久久久亚洲一区二区三区 | 亚洲国产精品自拍 | 日韩成人一区 | 国产精品毛片久久久久久 | 三区在线 | 精品国产不卡一区二区三区 | 亚洲一二三区在线观看 | 日韩在线观看 | 国产精品久久免费视频 | 台湾av在线 | 男人天堂中文字幕 | 国产三级一区二区 | 日韩一区二区视频在线 | 午夜精品一区二区三区免费视频 | 欧美激情视频一区二区三区在线播放 | 日本一二三区视频 | 亚洲欧美日韩电影 | 精品久久不卡 | 日韩欧美在线观看一区 | 国产精品99久久久久久久vr | 亚洲+变态+欧美+另类+精品 | a∨在线观看 | 亚洲精品在线视频 | 91高清在线观看 | 亚洲一区二区在线播放 | 国产精品视频网 | 1区2区免费视频 | 日日干夜夜操 | 亚洲视频免费观看 | 精品一区二区三区久久久 | 国内久久精品 | 亚洲精品在线播放 | 久久久久久久久国产 | 成人免费crm在线观看 | 中国黄色毛片 大片 | 亚洲毛片网站 | 国产精品美女 | 精品在线一区二区 | 久久艹久久| 欧美视频一区二区 | 亚洲视频中文字幕 | 国产传媒毛片精品视频第一次 | 日韩3级在线观看 | 在线a视频 | 在线观看国产www | 亚洲欧洲一区 | 99热这里有精品 | 久久久久中文 | 久久久久国产精品免费免费搜索 | 国产精品免费一区二区三区四区 | 久草青青 | 最新高清无码专区 | 欧美精品一区三区 | 国产精品一二三四区 | 欧美一级特黄aaaaaa大片在线观看 | 久久91精品 | 国产成人免费在线观看 | 欧美日韩国产一区二区 | 欧美天天| 国产精品久久久久无码av | 亚洲永久免费 | 日韩成人在线视频 | 成人欧美一区二区三区视频xxx | av在线干 | 成人免费一区二区三区视频网站 | 成人午夜毛片 | 欧一区二区 | 精品欧美一区二区在线观看视频 | 天天综合网91 | 精品久久99 | 亚洲久久久 | 色综合免费视频 | 毛片链接 | 操操操操操操操操操操操操操操 | 成人午夜网| 91精品国产99久久久久久红楼 | 亚洲精品aaa | 国产精品极品美女在线观看免费 | 国产精品久久影院 | 日本网站在线免费观看 | 99福利视频 | 久久国产欧美日韩精品 | 久久久久久99| 午夜精品成人一区二区 | 美女黄网| 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 天天干天天操 | 国产成人在线视频 | 91免费版在线观看 | 欧美黄色片免费观看 | 国产美女一区二区 | 欧美美女黄色网 | 羞羞视频免费观看入口 | 成人免费在线播放 | 欧美一级内谢 | 欧美激情视频一区二区三区 | 日韩一区二区在线播放 | 一区二区欧美在线 | 亚洲一区二区在线视频 | 免费福利视频一区 | 久久国产精品免费一区二区三区 | 吴梦梦到粉丝家实战华中在线观看 | 亚洲国产精品一区二区久久 | 欧美精品一二三区 | 91久久夜色精品国产网站 | 免费视频一区二区 | 男人的天堂视频网站 | 91看片 | 一级毛片中国 | 自拍偷拍一区二区三区 | 亚洲精品视频在线 | 精品国产黄a∨片高清在线 99热婷婷 | 欧美日韩一区二区在线观看 | 国产精品国产成人国产三级 | 日本中文字幕在线视频 | 99re视频在线播放 | 中文字幕爱爱视频 | 国内精品99 | 九九综合九九 | 精品无人乱码一区二区三区 | 久久在线视频 | 国产日韩一区二区三免费高清 | 可以免费在线观看av的网站 | 国产日本韩国在线 | 久久久久久免费免费 | 欧美一区二区三区 | 无码日韩精品一区二区免费 | 欧美激情视频一区二区三区在线播放 | 久久se精品一区精品二区 | 蜜桃视频一区二区 | 亚洲精品九九 | 日韩欧美在线视频 | 欧美日韩精品一区二区在线播放 | 人人草人人 | 91久久国产 | 国产目拍亚洲精品99久久精品 | 国产精品久久精品 | 国产三级久久久久 | 99国产精品久久久久久久 | 亚洲视频自拍 | 久久av一区二区三区亚洲 | 99re在线 | 在线视频91| 国产96在线观看 | 香蕉夜色 | 国产精品第一国产精品 | 国产精品第一国产精品 | 日韩一级免费观看 | 免费亚洲成人 | 国产精品久久国产精麻豆99网站 | 91在线入口 | 久久久天堂 | 成人免费网站 | 日韩一区二区在线观看 | 免费午夜电影 | 亚洲另类视频 | 国产精品一区三区 | 成人激情视频在线观看 | 日韩在线视频免费看 | 97色婷婷成人综合在线观看 | 婷婷毛片 | 亚洲精品国产第一综合99久久 | 免费看国产一级片 | 亚洲久久久 | 国产精品日韩精品 | 狠狠操综合网 | 欧美日韩一区二区三区在线观看 | 日韩欧美综合 | 国产一区二区三区久久 | 国产一区二区三区欧美 | www.9191 | 国产精品一区二区在线观看 | 国产伦精品一区二区三区四区视频 | 国产成人一区二区 | 欧美国产精品一区 | av黄色在线 | 国产激情在线 | 亚洲乱码国产乱码精品精的特点 | 国产一级色 | 日韩av一区二区三区在线观看 | 国产91精品一区二区绿帽 | 国产一区二区av | 中文字幕免费在线观看视频 | 国产精品欧美一区二区 | 在线观看亚洲 | 成人国产精品久久 | 亚洲女人天堂成人av在线 | 成人超碰在线 | 综合久久久 | 日韩中文一区二区 | 大香伊蕉在人线视频777 | 三级黄色视频毛片 | 午夜精品福利在线观看 | 国产亚洲精品久久久456 | 婷婷五月色综合 | 亚洲天堂一区 | 高清国产一区二区三区四区五区 | 自拍偷拍亚洲欧美 | 久久精品国产一区 | 欧美日本韩国一区二区三区 | 久久中文字幕一区 | 亚洲午夜在线 | 精品国产91亚洲一区二区三区www | 在线观看成人小视频 | 亚洲电影二区 | 99re在线观看| 国产精品美女www爽爽爽软件 | 亚洲视频在线免费观看 | 日本福利网站 | 射久久 | 来个毛片 | 亚洲三级网站 | 亚洲国产高清视频 | 午夜激情视频在线观看 | 91免费看片神器 | av一区在线 | 日本在线视频中文字幕 | 成人免费视频网址 | 91一区二区在线 | 男女羞羞网站 | 中文字幕亚洲一区二区三区 | 中文字幕_第2页_高清免费在线 | 欧美一级片在线观看 | 99精品不卡| 久热免费在线观看 | 久久成| 青青草99 | av久久 | av网站免费看 | 欧美精品久 | 天天天干天天天操 | 国产一区二区三区在线视频 | 国产精品亚洲精品久久 | 国产精品成人在线观看 | 草草网站 | 欧美午夜视频 | 亚洲婷婷综合网 | 盗摄精品av一区二区三区 | 91最新| 一级毛片在线播放 | 精品国产一级毛片 | 亚洲www视频 | 激情一区二区三区 | 日本黄色毛片 | 午夜不卡福利视频 | 91观看在线视频 | 日韩欧美视频一区二区三区 | 999精品视频 | 国产午夜精品久久久久久久 | 国产精品午夜在线观看 | 亚洲欧美高清 | 国产日韩精品视频 | 亚洲精品国产第一综合99久久 | 日本aa级毛片免费观看 | 国产欧美日韩一区 | 一级片在线观看免费 | 粉嫩高清一区二区三区 | 欧美精品久久久 | 草草久久久 | 欧美男人天堂 | 日韩三级电影在线免费观看 | 亚洲成人久久久久 | 91精品久久久久久久久久 | 91碰碰 | 久草网在线视频 | 国产毛片在线看 | 69av片| 一区二区精品在线 | 成年人视频在线观看免费 | 中文字幕在线看 | 欧美午夜在线观看 | 久久精品色欧美aⅴ一区二区 | 91免费版在线看 | 黄色91| 亚洲精品毛片一区二区 | 亚洲一级黄色 | 中文字幕一区二区在线观看 | 18久久久久久 | 久久久久女人精品毛片九一韩国 | 激情久久av一区av二区av三区 | 日韩精品1区 | 亚洲欧美日韩在线一区 | 日韩一区二区三区福利视频 | 国产高清视频在线观看 | 午夜草逼| 日韩成人免费中文字幕 | 精品国产一区二区三区久久久久久 | 91精品免费| 日韩不卡一区二区 | 日韩大尺度在线观看 | 亚州国产精品视频 | 69av.com| 午夜视频网 | www.欧美日韩 | 不卡久久| www日本高清 | 亚洲精品一区二区三区中文字幕 | 一级黄免费看 | 国产999久久 | 久久性| 亚洲精品视频免费看 | 欧美乱码久久久久久蜜桃 | 91社区在线观看 | 日韩国产| 日韩欧美综合在线 | 少妇性l交大片免费一 | 欧美性www | 国产精品一区av | 日本高清中文字幕 | 91精品久久久久久久 | 在线观看黄免费 | 91在线免费看 | 人人人人人你人人人人人 | 国产午夜精品美女视频明星a级 | 成人v片 | 天天狠狠操 | 老司机福利在线观看 | 能在线观看的黄色网址 | 国产 欧美 日韩 一区 | 日本超碰 | 久久久久久久国产精品 | av大片| 一区二区免费视频观看 | 免费一级 国产 | 久久久一区二区三区 | 奇米成人 | 免费av在线播放 | 亚洲欧美在线观看 | 91社区影院| 在线观看国产 | 国产精品美女www爽爽爽动态图 | 九色91视频 | 啪啪tv网站免费入口 | 午夜视频免费 | 国产成人一区 | 国产成人综合av | 久久免费视频3 | 久久久国产一区二区三区四区小说 | 在线免费中文字幕 | 国产精品国产成人国产三级 | 国产一区二区影院 | 亚洲性在线 | 黑人巨大精品欧美一区二区三区 | 日韩精品一区二区三区 | 欧美精品一区二区三区在线 | 伊人狠狠| www.久| 欧美一级免费 | 国产精品18久久久久久久久 | 亚洲一区二区在线播放 | 亚洲黄色一区二区 | 久久国产精品99精国产 | 国产在线精品一区 | 中文字幕本久久精品一区 | 久草视频在线观 | 色综合久 | 狠狠的日 | 成人看片在线 | 91精品国产综合久久久久久漫画 | 大陆一级毛片免费视频观看 | 久久精品久久久 | 一区久久 | 丁香久久 | 日韩视频在线播放 | 波多野结衣一区二区三区高清 | 久久精品欧美一区二区三区不卡 | 日韩性猛交| 日韩成人不卡 | 亚洲aaaaaa特级 | 成人欧美 | 色橹橹欧美在线观看视频高清 | 国产精品久久久久久久久 | 欧美成人精品一区二区三区在线看 | 在线观看的av | 成人h动漫在线看 | 亚洲视频在线一区 | 久久精品色欧美aⅴ一区二区 | 免费观看一区二区三区毛片 | 男人亚洲天堂网 | 亚洲精品乱码久久久久久金桔影视 | 欧美久久视频 | 日韩免费片 | 成人一区二区三区 | 国产精品三级久久久久久电影 | 一区二区三区免费在线观看 | 亚洲国产免费 | 超碰在线99 | 99精品久久精品一区二区爱城 | 国产精国产精品 | 亚洲国产视频精品 | 亚洲综合欧美日韩 | 亚洲动漫在线观看 | 国产精品第一国产精品 | 中文字幕成人网 | 免费看性生交大片 | 精品久久久久久久 | 久久999| 日韩中文一区二区三区 | 欧美视频一二 | 色婷婷亚洲一区二区三区 | www.99热这里只有精品 | 成人一区二区电影 | 亚洲精品乱码久久久久久蜜糖图片 | 一级黄色片美国 | 国产女人网 | 看a网址| 日本精品免费在线观看 | 综合久久综合久久 | 日韩视频久久 | 国产精品久久久久久久久久99 | 婷婷午夜激情网 | 一级特黄| 国产精品久久久久国产精品 | 精品国产一区二区三区久久久蜜月 | 欧美黑人一区 | 99久久免费视频在线观看 | 精品久久久久久国产 | 国产一区二区免费视频 | 九九天堂网 | 国产精品久久久久久久久久久久午夜片 | 亚洲激情av | 99爱在线观看 | 亚洲高清网 | 夜夜操天天干, | 韩国一区二区视频 | www国产在线观看 | 成人在线免费观看 | 2018国产大陆天天弄 | 爱爱视频网站 | 亚洲福利片| 欧美亚洲三级 | 国产成人久久精品麻豆二区 | 在线免费色视频 | 君岛美绪一区二区三区 | 亚洲精品中文字幕中文字幕 | 国产精品自拍av | 国产精品美女av | 在线欧美亚洲 | 日韩视频在线观看 | 色综合激情 | 在线碰 | 黄版视频在线观看 | 久久久久久久久久久久99 | 欧美一级在线 | 成人免费视屏 | 国产女人爽到高潮免费视频 | 午夜精品一区二区三区免费视频 | 亚洲一区二区在线 | 一区二区三区精品视频 | 亚洲精品一二三区 | 亚洲色图p | 成人国产精品视频 | 欧美激情在线精品一区二区三区 |