久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Springboot整合Netty實現RPC服務器的示例代碼

瀏覽:3日期:2023-03-30 17:51:24
一、什么是RPC?

RPC(Remote Procedure Call)遠程過程調用,是一種進程間的通信方式,其可以做到像調用本地方法那樣調用位于遠程的計算機的服務。其實現的原理過程如下:

本地的進程通過接口進行本地方法調用。 RPC客戶端將調用的接口名、接口方法、方法參數等信息利用網絡通信發送給RPC服務器。 RPC服務器對請求進行解析,根據接口名、接口方法、方法參數等信息找到對應的方法實現,并進行本地方法調用,然后將方法調用結果響應給RPC客戶端。二、實現RPC需要解決那些問題?1. 約定通信協議格式

RPC分為客戶端與服務端,就像HTTP一樣,我們需要定義交互的協議格式。主要包括三個方面:

請求格式 響應格式 網絡通信時數據的序列化方式

RPC請求

@Datapublic class RpcRequest { /** * 請求ID 用來標識本次請求以匹配RPC服務器的響應 */ private String requestId; /** * 調用的類(接口)權限定名稱 */ private String className; /** * 調用的方法名 */ private String methodName; /** * 方法參類型列表 */ private Class<?>[] parameterTypes; /** * 方法參數 */ private Object[] parameters;}

RPC響應

@Datapublic class RpcResponse { /** * 響應對應的請求ID */ private String requestId; /** * 調用是否成功的標識 */ private boolean success = true; /** * 調用錯誤信息 */ private String errorMessage; /** * 調用結果 */ private Object result;}2. 序列化方式

序列化方式可以使用JDK自帶的序列化方式或者一些第三方的序列化方式,JDK自帶的由于性能較差所以不推薦。我們這里選擇JSON作為序列化協議,即將請求和響應對象序列化為JSON字符串后發送到對端,對端接收到后反序列為相應的對象,這里采用阿里的 fastjson 作為JSON序列化框架。

3. TCP粘包、拆包

TCP是個“流”協議,所謂流,就是沒有界限的一串數據。大家可以想想河里的流水,是連成一片的,其間并沒有分界線。TCP底層并不了解上層業務數據的具體含義,它會根據TCP緩沖區的實際情況進行包的劃分,所以在業務上認為,一個完整的包可能會被TCP拆分成多個包進行發送,也有可能把多個小的包封裝成一個大的數據包發送,這就是所謂的TCP粘包和拆包問題。粘包和拆包需要應用層程序來解決。

我們采用在請求和響應的頭部保存消息體的長度的方式解決粘包和拆包問題。請求和響應的格式如下:

+--------+----------------+ | Length | Content | | 4字節 | Length個字節 | +--------+----------------+4. 網絡通信框架的選擇

出于性能的考慮,RPC一般選擇異步非阻塞的網絡通信方式,JDK自帶的NIO網絡編程操作繁雜,Netty是一款基于NIO開發的網絡通信框架,其對java NIO進行封裝對外提供友好的API,并且內置了很多開箱即用的組件,如各種編碼解碼器。所以我們采用Netty作為RPC服務的網絡通信框架。

三、RPC服務端

RPC分為客戶端和服務端,它們有一個共同的服務接口API,我們首先定義一個接口 HelloService

public interface HelloService { String sayHello(String name);}

然后服務端需要提供該接口的實現類,然后使用自定義的@RpcService注解標注,該注解擴展自@Component,被其標注的類可以被Spring的容器管理。

@RpcServicepublic class HelloServiceImp implements HelloService { @Override public String sayHello(String name) { return 'Hello ' + name; }}

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Componentpublic @interface RpcService { }

RPC服務器類

我們實現了ApplicationContextAware接口,以便從bean容器中取出@RpcService實現類,存入我們的map容器中。

@Component@Slf4jpublic class RpcServer implements ApplicationContextAware, InitializingBean { // RPC服務實現容器 private Map<String, Object> rpcServices = new HashMap<>(); @Value('${rpc.server.port}') private int port; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map<String, Object> services = applicationContext.getBeansWithAnnotation(RpcService.class); for (Map.Entry<String, Object> entry : services.entrySet()) { Object bean = entry.getValue(); Class<?>[] interfaces = bean.getClass().getInterfaces(); for (Class<?> inter : interfaces) { rpcServices.put(inter.getName(), bean); } } log.info('加載RPC服務數量:{}', rpcServices.size()); } @Override public void afterPropertiesSet() { start(); } private void start(){ new Thread(() -> { EventLoopGroup boss = new NioEventLoopGroup(1); EventLoopGroup worker = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, worker) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new IdleStateHandler(0, 0, 60));pipeline.addLast(new JsonDecoder());pipeline.addLast(new JsonEncoder());pipeline.addLast(new RpcInboundHandler(rpcServices)); } }) .channel(NioServerSocketChannel.class); ChannelFuture future = bootstrap.bind(port).sync(); log.info('RPC 服務器啟動, 監聽端口:' + port); future.channel().closeFuture().sync(); }catch (Exception e){ e.printStackTrace(); boss.shutdownGracefully(); worker.shutdownGracefully(); } }).start(); }}

RpcServerInboundHandler 負責處理RPC請求

@Slf4jpublic class RpcServerInboundHandler extends ChannelInboundHandlerAdapter { private Map<String, Object> rpcServices; public RpcServerInboundHandler(Map<String, Object> rpcServices){ this.rpcServices = rpcServices; } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info('客戶端連接成功,{}', ctx.channel().remoteAddress()); } public void channelInactive(ChannelHandlerContext ctx) { log.info('客戶端斷開連接,{}', ctx.channel().remoteAddress()); ctx.channel().close(); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg){ RpcRequest rpcRequest = (RpcRequest) msg; log.info('接收到客戶端請求, 請求接口:{}, 請求方法:{}', rpcRequest.getClassName(), rpcRequest.getMethodName()); RpcResponse response = new RpcResponse(); response.setRequestId(rpcRequest.getRequestId()); Object result = null; try { result = this.handleRequest(rpcRequest); response.setResult(result); } catch (Exception e) { e.printStackTrace(); response.setSuccess(false); response.setErrorMessage(e.getMessage()); } log.info('服務器響應:{}', response); ctx.writeAndFlush(response); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { log.info('連接異常'); ctx.channel().close(); super.exceptionCaught(ctx, cause); } @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent){ IdleStateEvent event = (IdleStateEvent)evt; if (event.state()== IdleState.ALL_IDLE){ log.info('客戶端已超過60秒未讀寫數據, 關閉連接.{}',ctx.channel().remoteAddress()); ctx.channel().close(); } }else{ super.userEventTriggered(ctx,evt); } } private Object handleRequest(RpcRequest rpcRequest) throws Exception{ Object bean = rpcServices.get(rpcRequest.getClassName()); if(bean == null){ throw new RuntimeException('未找到對應的服務: ' + rpcRequest.getClassName()); } Method method = bean.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParameterTypes()); method.setAccessible(true); return method.invoke(bean, rpcRequest.getParameters()); }}四、RPC客戶端

/** * RPC遠程調用的客戶端 */@Slf4j@Componentpublic class RpcClient { @Value('${rpc.remote.ip}') private String remoteIp; @Value('${rpc.remote.port}') private int port; private Bootstrap bootstrap; // 儲存調用結果 private final Map<String, SynchronousQueue<RpcResponse>> results = new ConcurrentHashMap<>(); public RpcClient(){ } @PostConstruct public void init(){ bootstrap = new Bootstrap().remoteAddress(remoteIp, port); NioEventLoopGroup worker = new NioEventLoopGroup(1); bootstrap.group(worker) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new IdleStateHandler(0, 0, 10)); pipeline.addLast(new JsonEncoder()); pipeline.addLast(new JsonDecoder()); pipeline.addLast(new RpcClientInboundHandler(results)); } }); } public RpcResponse send(RpcRequest rpcRequest) { RpcResponse rpcResponse = null; rpcRequest.setRequestId(UUID.randomUUID().toString()); Channel channel = null; try { channel = bootstrap.connect().sync().channel(); log.info('連接建立, 發送請求:{}', rpcRequest); channel.writeAndFlush(rpcRequest); SynchronousQueue<RpcResponse> queue = new SynchronousQueue<>(); results.put(rpcRequest.getRequestId(), queue); // 阻塞等待獲取響應 rpcResponse = queue.take(); results.remove(rpcRequest.getRequestId()); } catch (InterruptedException e) { e.printStackTrace(); } finally { if(channel != null && channel.isActive()){ channel.close(); } } return rpcResponse; }}

RpcClientInboundHandler負責處理服務端的響應

@Slf4jpublic class RpcClientInboundHandler extends ChannelInboundHandlerAdapter { private Map<String, SynchronousQueue<RpcResponse>> results; public RpcClientInboundHandler(Map<String, SynchronousQueue<RpcResponse>> results){ this.results = results; } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { RpcResponse rpcResponse = (RpcResponse) msg; log.info('收到服務器響應:{}', rpcResponse); if(!rpcResponse.isSuccess()){ throw new RuntimeException('調用結果異常,異常信息:' + rpcResponse.getErrorMessage()); } // 取出結果容器,將response放進queue中 SynchronousQueue<RpcResponse> queue = results.get(rpcResponse.getRequestId()); queue.put(rpcResponse); } @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent){ IdleStateEvent event = (IdleStateEvent)evt; if (event.state() == IdleState.ALL_IDLE){ log.info('發送心跳包'); RpcRequest request = new RpcRequest(); request.setMethodName('heartBeat'); ctx.channel().writeAndFlush(request); } }else{ super.userEventTriggered(ctx, evt); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){ log.info('異常:{}', cause.getMessage()); ctx.channel().close(); }}接口代理

為了使客戶端像調用本地方法一樣調用遠程服務,我們需要對接口進行動態代理。

代理類實現

@Componentpublic class RpcProxy implements InvocationHandler { @Autowired private RpcClient rpcClient; @Override public Object invoke(Object proxy, Method method, Object[] args){ RpcRequest rpcRequest = new RpcRequest(); rpcRequest.setClassName(method.getDeclaringClass().getName()); rpcRequest.setMethodName(method.getName()); rpcRequest.setParameters(args); rpcRequest.setParameterTypes(method.getParameterTypes()); RpcResponse rpcResponse = rpcClient.send(rpcRequest); return rpcResponse.getResult(); }}

實現FactoryBean接口,將生產動態代理類納入 Spring 容器管理。

public class RpcFactoryBean<T> implements FactoryBean<T> { private Class<T> interfaceClass; @Autowired private RpcProxy rpcProxy; public RpcFactoryBean(Class<T> interfaceClass){ this.interfaceClass = interfaceClass; } @Override public T getObject(){ return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass}, rpcProxy); } @Override public Class<?> getObjectType() { return interfaceClass; }}

自定義類路徑掃描器,掃描包下的RPC接口,動態生產代理類,納入 Spring 容器管理

public class RpcScanner extends ClassPathBeanDefinitionScanner { public RpcScanner(BeanDefinitionRegistry registry) { super(registry); } @Override protected Set<BeanDefinitionHolder> doScan(String... basePackages) { Set<BeanDefinitionHolder> beanDefinitionHolders = super.doScan(basePackages); for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) { GenericBeanDefinition beanDefinition = (GenericBeanDefinition)beanDefinitionHolder.getBeanDefinition(); beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(beanDefinition.getBeanClassName()); beanDefinition.setBeanClassName(RpcFactoryBean.class.getName()); } return beanDefinitionHolders; } @Override protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException { return true; } @Override protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { return beanDefinition.getMetadata().isInterface() && beanDefinition.getMetadata().isIndependent(); }}

@Componentpublic class RpcBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { RpcScanner rpcScanner = new RpcScanner(registry); // 傳入RPC接口所在的包名 rpcScanner.scan('com.ygd.rpc.common.service'); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }}

JSON編解碼器

/** * 將 RpcRequest 編碼成字節序列發送 * 消息格式: Length + Content * Length使用int存儲,標識消息體的長度 * * +--------+----------------+ * | Length | Content | * | 4字節 | Length個字節 | * +--------+----------------+ */public class JsonEncoder extends MessageToByteEncoder<RpcRequest> { @Override protected void encode(ChannelHandlerContext ctx, RpcRequest rpcRequest, ByteBuf out){ byte[] bytes = JSON.toJSONBytes(rpcRequest); // 將消息體的長度寫入消息頭部 out.writeInt(bytes.length); // 寫入消息體 out.writeBytes(bytes); }}

/** * 將響應消息解碼成 RpcResponse */public class JsonDecoder extends LengthFieldBasedFrameDecoder { public JsonDecoder(){ super(Integer.MAX_VALUE, 0, 4, 0, 4); } @Override protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { ByteBuf msg = (ByteBuf) super.decode(ctx, in); byte[] bytes = new byte[msg.readableBytes()]; msg.readBytes(bytes); RpcResponse rpcResponse = JSON.parseObject(bytes, RpcResponse.class); return rpcResponse; }}

測試我們編寫一個Controller進行測試

@RestController@RequestMapping('/hello')public class HelloController { @Autowired private HelloService helloService; @GetMapping('/sayHello') public String hello(String name){ return helloService.sayHello(name); }}

通過 PostMan調用 controller 接口 http://localhost:9998/hello/sayHello?name=小明

響應: Hello 小明

總結

本文實現了一個簡易的、具有基本概念的RPC,主要涉及的知識點如下:

網絡通信及通信協議的編碼、解碼 Java對象的序列化及反序列化 通信鏈路心跳檢測 Java反射 JDK動態代理

項目完整代碼詳見:https://github.com/yinguodong/netty-rpc

到此這篇關于Springboot整合Netty實現RPC服務器的示例代碼的文章就介紹到這了,更多相關Springboot RPC服務器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 精品国产欧美一区二区三区不卡 | 国产婷婷在线视频 | 极品白嫩少妇无套内谢 | 国产91色在线 | 亚洲 | 黄免费看 | 午夜国产一级片 | 国产一区二区三区免费视频 | 久久99精品久久久久久琪琪 | 国产福利视频 | 日韩www | 欧美日韩亚洲在线 | 欧美成人免费在线视频 | 国产精品亚洲一区二区三区在线 | 久久国产精品99久久久久久老狼 | 在线观看 亚洲 | 狠狠艹夜夜艹 | 中国毛片基地 | av一区在线观看 | 精品九九九 | 在线精品国产一区二区三区 | 日日夜夜狠狠 | 国产精品一区二区在线观看 | 蜜桃臀一区二区三区 | 亚洲精品视频在线播放 | 亚洲一区二区中文字幕 | 久草中文在线 | 天天操网 | 欧美视频在线一区 | 国产天堂网 | 亚洲成人av一区二区三区 | 国产成人精品免高潮在线观看 | 琪琪午夜伦伦电影福利片 | 午夜免费小视频 | 久久久久久久久久久久久九 | 欧美精品综合 | 人人澡人人射 | 日韩免费一区 | 99re6热在线精品视频播放 | 蜜桃视频一区 | 成人高清在线 | 一级在线观看 | 一区二区三区在线免费看 | 亚洲最新av | 欧美激情欧美激情在线五月 | 午夜视频网| 国产精品久久久久一区二区三区 | 午夜精品久久久久 | 一区二区三区在线免费看 | 亚洲91精品 | 亚洲乱码国产乱码精品精的特点 | 欧美黄色片免费观看 | 久久久久久国产精品高清 | 久久成人精品 | 91精品国产91久久久久久久久久久久 | 黄色免费视频 | 久久精品色欧美aⅴ一区二区 | 黄色一级毛片 | 一级日批片 | 毛片免费观看 | 欧美日韩一区二区在线 | 久久av网| 99久久久久久久久 | 欧美日韩精品一区二区三区在线观看 | 国产日韩精品视频 | 欧美1区2区3区 | 国产精品一区二区三区av | 美国一级黄色片 | 亚洲自啪 | 99视频在线免费观看 | 欧美一级欧美三级在线观看 | 天天躁日日躁aaaaxxxx | 神马久久久久久 | www视频在线观看 | 国产91成人在在线播放 | 三级色黄 | 九色91在线 | 午夜在线视频 | 亚洲激情在线 | 久久久久久久久久久久久久久久久久久 | 成人欧美一区二区三区在线观看 | 六月丁香在线观看 | 男女视频在线观看 | www.久久 | 国产成人免费在线 | 欧美在线观看免费观看视频 | 亚洲欧美日韩另类一区二区 | 国产欧美久久久久久 | 一级毛片一级毛片一级毛片 | 国产成人一区 | 99热在线观看免费 | 日韩视频一区二区三区在线观看 | 国产精品免费在线 | 午夜专区| 日韩欧美国产精品 | 毛片毛片毛片毛片毛片毛片 | 综合婷婷| 美女久久久久 | 香蕉大人久久国产成人av | 亚洲中午字幕 | 日本欧美久久久久免费播放网 | 密室大逃脱第六季大神版在线观看 | 99综合| 日韩精品一二三区 | 成人高清在线 | 欧美精品成人在线视频 | 青青草人人 | 中文一区| 欧美视频免费 | 中文字幕精品三区 | 97精品国产 | 四虎影视免费在线观看 | 国产成人精品久久二区二区 | 免费v片 | 九九热这里只有精品8 | 香蕉视频在线看 | 九九热欧美 | 日本中文一区二区 | 五月婷婷中文 | 日日射天天干 | 国产成人精品午夜视频免费 | 激情久久久久 | 午夜欧美一区二区三区在线播放 | av免费在线观看网站 | 亚洲精品午夜视频 | 日韩一级二级三级 | 久久久久久网址 | 成人免费在线网址 | 精品无人乱码一区二区三区的优势 | 91在线精品一区二区 | 伊人av在线免费观看 | 免费在线观看av | 久久精品欧美一区二区三区麻豆 | 国产九九九 | 免费三级黄色 | 99热少妇 | a久久久久久 | 日韩精品在线观看视频 | avsex国产 | 欧美,日韩,国产精品免费观看 | 国产伦精品一区二区三区在线 | 黄色一级片视频播放 | 国产精品久久久久无码av | 国产精品久久久久久久午夜 | 久久久男人天堂 | 毛片入口| 天天射天天| 99精品一区二区三区 | 久久99久久久久 | 色欧美视频 | 中文字幕免费在线观看视频 | 丝袜美腿一区二区三区 | 日本一区二区三区免费观看 | 男人天堂网av | 欧美一区二区三区久久精品 | av在线播放国产 | 99精品久久 | 国产黄色网址在线观看 | 日韩99| www.色综合| 日狠狠| 激情五月婷婷综合 | 中文字幕视频网站 | 在线视频 中文字幕 | 日韩高清在线播放 | 久久99精品久久久久久园产越南 | 日韩精品一区二区三区老鸭窝 | 国产97在线 | 免费 | 三区免费视频 | 日韩在线小视频 | 999久久久 | 水卜樱一区二区av | 国产激情久久久久久 | 久久国产一区 | 久久精美视频 | 久久久久久久99精品免费观看 | av片网站 | 99精品网站 | 国产在线免费 | 国产a视频 | 亚洲国产成人在线 | 伊人网在线视频观看 | 国产亚洲欧美一区二区 | 国产a视频 | 国产精品对白一区二区三区 | 免费精品视频 | 久久综合久 | 欧美成年视频 | 欧洲另类交 | 日日草夜夜草 | 精品久久久久久久久久久 | 中文字幕在线观看精品视频 | 欧美天堂在线观看 | 国产51人人成人人人人爽色哟哟 | 国产视频一视频二 | 国产一区2区| 久久久久久国产精品高清 | 亚洲欧美综合一区 | 拍真实国产伦偷精品 | 久久伊人免费视频 | 一区二区三区国产在线观看 | 免费午夜视频 | 成人免费毛片aaaaaa片 | 中文字幕精品三区 | 一区二区三区四区视频 | 久久久国产视频 | 男女全黄一级一级高潮免费看 | 国产欧美日韩综合精品 | 成av人片在线观看www | 91在线高清 | 伊人网站| 欧美成人精品一区二区三区在线看 | 久久久国产精品视频 | 国产精品福利视频 | 色精品视频 | 亚洲精品网址 | 日韩精品一区二区三区中文在线 | 亚洲中午字幕 | 国产精品久久久久久吹潮 | 精品久久国产 | 国产亚洲精品精品国产亚洲综合 | 噜噜噜在线观看免费视频日本 | 国产欧美综合在线 | 国产精品久久av | 欧美精品激情 | 精品一区二区三区免费 | 黄色大片网站在线观看 | 夜本色 | 一色桃子av一区二区免费 | 成年人在线视频播放 | 亚洲综合首页 | 国产中文字幕一区 | 91精品国产一区二区 | 国产精品久久av | 国产在线一区二区 | 免费国产一区 | ririsao久久精品一区 | 亚洲一区视频在线 | 国产精品成人3p一区二区三区 | 亚洲成人日本 | 午夜视频免费 | 色玖玖综合 | 东京久久久 | 亚洲精品一区二三区不卡 | 狠狠视频 | 久久久久久精 | 日韩高清国产一区在线 | 成人情趣视频 | 九九亚洲精品 | 欧美日韩综合在线 | 黄色最新网站 | 欧美日韩中文在线 | 日韩精品一区二区三区老鸭窝 | 欧美日韩国产精品久久久久 | 国产精品久久国产精品 | 欧美日韩在线观看视频 | www.44181com| 日韩精品一区二区三区在线观看 | 久久9热| 欧美成年黄网站色视频 | 欧美日韩国产在线播放 | 欧美极品视频 | 国产91网址 | 国产精品中文字幕在线 | 91综合网 | 精品视频一区二区三区四区 | www在线观看国产 | 成人午夜精品久久久久久久蜜臀 | 看毛片网站 | 在线视频 中文字幕 | 亚洲精品91 | 久久成人综合网 | 国产精品一二三区 | 国产成人高清在线 | 国产精品高潮呻吟 | 国产精品久久久久久久久久东京 | 久久在线播放 | 爱操av| 羞羞视频在线网站观看 | 久久久久黄 | 久久国产精品一区二区 | 狠狠干av | 欧美午夜三级视频 | 婷婷亚洲综合 | 国产精品国产三级国产aⅴ中文 | 色偷偷888欧美精品久久久 | 黄色片网站在线看 | 亚洲成人首页 | 在线一区 | 亚洲久草在线 | 精一区二区 | 国产精品免费av | 亚洲热在线观看 | 久久久久国产精品一区二区三区 | 欧美日韩在线视频一区二区 | 日本成片视频 | 中文字幕亚洲区 | 亚洲伦理一区 | 国产福利在线观看视频 | 亚洲欧美激情精品一区二区 | 久久久成人精品视频 | 成人一区二区三区在线观看 | 欧美日韩精品一区二区在线观看 | 中文字幕影院 | 日本黄色a视频 | 伊人av超碰久久久麻豆 | 午夜在线观看 | 91精品视频一区 | 色橹橹欧美在线观看视频高清 | 日韩精品视频免费看 | 日韩成人在线视频 | 日韩欧美国产一区二区三区 | 亚洲欧美日韩另类精品一区二区三区 | 亚洲一区在线观看视频 | 欧美第8页| 欧美日韩黄色一级片 | 国产不卡在线观看 | 在线观看毛片网站 | 亚洲精品福利 | 青娱乐国产精品视频 | 蜜桃免费一区二区三区 | 久草 在线 | 久久久精品综合 | 欧美三区视频 | 岛国伊人| the蜜臀av入口 | 久久综合九色综合欧美狠狠 | 伊人久久视频 | 亚洲成年人影院 | 亚洲一区二区三区蜜桃 | 国产1区2区3区 | 美女久久 | 亚洲艹| 日韩欧美国产精品一区二区三区 | 狠狠搞狠狠搞 | 国产精品久久久久久久久久久久冷 | 久久国产成人 | 午夜视频在线免费观看 | 国产传媒在线观看 | 欧美精品一区二区三区中文字幕 | 国产精品久久久久久久久 | 国产视频一视频二 | 欧美日韩成人在线观看 | 国产高清一级毛片在线不卡 | 成人日韩 | 天天拍天天干天天操 | 免费激情网站 | 国产主播久久 | 国产精品一区二区视频 | 一区二区三区在线不卡 | 天天操天天干天天插 | 日韩免费在线观看视频 | 成人免费小视频 | 在线观看毛片视频 | 不卡的一区二区 | 午夜视频福利 | 毛片链接| 一区二区三区不卡视频 | 91精品国产综合久久婷婷香蕉 | 免费一级欧美在线观看视频 | 一级黄色片网站 | 日韩中文字幕无码一区二区三区 | 亚洲精品在线播放 | 久久美女 | 日韩一区二区三区视频 | 亚洲精品高清视频 | 欧美在线视频一区 | 中文字幕av亚洲精品一部二部 | 狠狠操天天干 | 成人精品一区二区三区中文字幕 | 黑人精品xxx一区一二区 | 国产精品777 | 成人久久久 | 在线成人av| 日韩在线视频观看 | 亚洲欧洲一区二区三区 | 在线色网站 | 日韩高清在线一区 | 久在线视频播放免费视频 | 国产精品久久久久久久娇妻 | 999视频| 国产一级免费 | 精品一区二区三区视频 | 一级黄免费看 | 成人精品 | 欧美日韩在线第一页 | 日韩二区精品 | 久久精品久久久 | 91欧美激情一区二区三区成人 | 免费成人在线视频网站 | 欧美成人激情视频 | japan国产精选videos | 国产精品永久免费 | 91麻豆精品久久久久蜜臀 | 国产高清在线视频 | 青青草久久爱 | 日韩精品av一区二区三区 | 日韩在线视频中文字幕 | 亚洲天天干 | 91免费观看视频 | 亚洲狠狠爱 | 日韩www| 成人影视网 | 91在线播放视频 | 久久久久亚洲精品国产 | 欧美一级在线观看视频 | 日韩一区在线播放 | 欧美日韩在线播放 | 久久久久久艹 | 久久精品美女 | 久久久久无码国产精品一区 | 91日韩精品一区二区三区 | 成人精品免费视频 | 国产精品毛片久久久久久久 | 欧美一区二区三 | wwwjizz日本| 久久综合久久综合久久 | 午夜在线电影 | 天堂亚洲网 | 中文字幕免费观看 | 欧美一区二区三区久久精品 | 国产欧美精品一区二区三区四区 | chinese中国真实乱对白 | 欧美精品一区三区 | 国产精品二区一区 | 91小视频| 精品国产精品三级精品av网址 | 黄色片网站视频 | 精品无码三级在线观看视频 | 国产一区亚洲 | 一区二区三区四区在线视频 | 成人免费视频观看视频 | 欧美精品一 | 无毒黄网 | 欧美午夜一区 | 欧美人成在线视频 | 欧美一区二区三区精品 | 免费成人一级片 | 日韩在线资源 | 国产永久免费 | 欧美极品视频 | 国产成人精品久久 | 国产视频精品自拍 | 91成人在线免费视频 | 一级电影免费在线观看 | 久久久久久99精品 | 欧美精品三区 | 狠狠干狠狠干 | 亚洲欧美日韩电影 | 国产日韩在线视频 | 国产综合视频在线播放 | 成人av电影网址 | 日本久久精品视频 | 亚洲成人av在线 | 久久久久国产一区二区三区 | 国产精品国产三级国产aⅴ原创 | 一区二区三区亚洲 | 日韩超级毛片 | 久久久久一区二区 | 91精品在线播放 | 国产成人久久精品麻豆二区 | 久久亚洲一区 | 天天干天天爽 | 国产精品九九久久99视频 | 国产精品一级 | www.久草.com| 中文字幕亚洲二区 | 日韩精品一区二区三区在线 | 日韩精品一区二区三区在线 | 国产免费一区 | 国产在线观看二区 | 国产精品国产三级国产aⅴ入口 | 国产天堂在线 | 日本综合久久 | 欧美一区二区三区视频在线观看 | 中文字幕亚洲欧美日韩在线不卡 | 99久久免费观看 | 视频一区 日韩 | 日韩中文字幕免费在线播放 | 青草视频在线免费观看 | 欧美视频在线免费 | 青青草av电影 | 三级日韩 | 免费黄色网址在线播放 | 9久久精品| 国产精品视频一二三区 | 亚洲一区二区视频在线播放 | 亚洲高清av| 久久一二三四 | www.久久久久久久 | 成人在线一区二区 | 久久这里只有精品首页 | 久久精品视频网 | 日本一区二区精品 | 国产在线观看一区 | 极品白嫩少妇无套内谢 | 免费观看黄色一级大片 | 91精品久久久久 | 超碰在线播 | 久久91久久久久麻豆精品 | 日韩视频免费在线播放 | 在线不卡a资源高清 | 久久大陆 | av影音| 日韩 国产 在线 | 视频一区二区三区中文字幕 | 国产精品久久久久久久午夜 | 久久精品一区二区三区四区 | 成人免费视频网址 | 亚洲美女av在线 | 免费激情小视频 | 国产一级一级国产 | 亚洲专区中文字幕 | 国产成人精品一区二区三区视频 | 国产精品免费久久 | 在线视频日韩 | 色十八| 精品久久久久久久久久久下田 | 欧美一区二区三区在线观看视频 | 中文字幕免费看 | 婷婷色5月 | 欧美激情自拍偷拍 | 五月婷婷丁香 | 亚洲一区二区三区 | 欧美一级二级三级 | 久久一本 | 久久精品成人一区二区三区蜜臀 | 九九综合| 伊人午夜 | 日韩在线免费 | 亚洲精品久久 | 一级毛片网 | 欧美成人精品一区 | 欧美日一区二区 | 国内精品一区二区 | 欧美一级日韩片 | 国产性猛交xxxx免费看久久 | 色猫猫国产区一区二在线视频 | 国产综合视频在线观看 | 欧美另类综合 | 美女视频一区 | av在线免费播放 | www.久草.com| 欧美天天| 国产人成精品一区二区三 | 中文字幕2021 | 亚洲国产精品久久久久 | 2018天天操夜夜操 | 日韩在线精品视频 | 中国一级大毛片 | 日韩视频中文字幕 | 欧美日韩精品久久久 | 天堂一区 | 欧美国产日本一区 | 国产精品久久久久久久久软件 | 999热在线| 国产资源在线观看 | 亚洲免费国产视频 | 亚洲大奶网 | 久久国产精品无码网站 | 伊人精品影院 | 国产日韩精品久久 | a在线免费 | 最新国产成人 | 国产美女久久久 | 国产免费自拍 | 久久在线视频 | 中文字幕在线精品 | 日韩欧美一区二区在线 | 精品国产91乱码一区二区三区 | 不卡日韩在线 | 亚洲一区二区三区 | 国产电影一区二区三区图片 | 亚洲在线观看免费视频 | 久久亚洲一区二区 | 日韩1| 久久久久综合狠狠综合日本高清 | 91婷婷射 | 欧美a网站 | 在线观看免费视频a | www久久九| 久国产 | 日本亚洲最大的色成网站www | 亚洲 欧美 在线 一区 | 日韩资源 | 一级欧美在线 | 成年人黄色一级片 | 亚洲精品在线播放 | 麻豆乱码国产一区二区三区 | 老司机深夜福利在线观看 | 欧日韩不卡在线视频 | 精品久 | 国产成人在线一区二区 | 亚洲免费观看视频 | 免费国产黄网站在线观看视频 | 国产高清av在线一区二区三区 | 国产成在线观看免费视频 | 日日精品| 日本久久久久久久 | 亚洲国产精品免费 | 欧美日韩午夜精品 | 国产一区二区成人 | 欧美亚洲天堂 | 国产美女久久久 | 野狼在线社区2017入口 | 欧美黄色一级毛片 | 天天精品 | 国产精品视频一二三区 | 黄色一级视频 | 黄色在线观看网址 | 欧洲成人在线 | 国产一区二区三区在线免费观看 | 亚洲国产精品久久久男人的天堂 | 一区二区视频 | 爱爱视频免费 | 日韩精品免费在线观看 |