范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Netty基础介绍(使用场景组件模型代码示例等)

  Netty简介
  Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等问题。且Netty拥有高性能、 吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。Netty 现在都在用的是4.x,5.x版本已经废弃,Netty 4.x 需要JDK 6以上版本支持。 Netty的使用场景
  1)互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。典型的应用有:阿里分布式服务框架 Dubbo 的RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现。各进程节点之间的内部通信。Rocketmq底层也是用的Netty作为基础通信组件。
  2)游戏行业:无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈。
  3)大数据领域:经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨界点通信,它的 Netty Service 基于 Netty 框架二次封装实现。
  netty相关开源项目: https://netty.io/wiki/related-projects.html Netty示例
  Netty示例idea中代码结构:
  示例代码结构
  pom文件中添加Netty的maven依赖:      io.netty     netty-all     4.1.35.Final 
  Netty服务端示例代码:import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel;  public class NettyServer {     public static void main(String[] args) throws Exception {         // 创建两个线程组bossGroup和workerGroup, 含有的子线程NioEventLoop的个数默认为cpu核数的两倍         // bossGroup只是处理连接请求 ,真正的和客户端业务处理,会交给workerGroup完成         EventLoopGroup bossGroup = new NioEventLoopGroup(3);         EventLoopGroup workerGroup = new NioEventLoopGroup(8);         try {             // 创建服务器端的启动对象             ServerBootstrap bootstrap = new ServerBootstrap();             // 使用链式编程来配置参数             bootstrap.group(bossGroup, workerGroup) //设置两个线程组                     // 使用NioServerSocketChannel作为服务器的通道实现                     .channel(NioServerSocketChannel.class)                     // 初始化服务器连接队列大小,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。                     // 多个客户端同时来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理                     .option(ChannelOption.SO_BACKLOG, 1024)                     .childHandler(new ChannelInitializer() {//创建通道初始化对象,设置初始化参数,在 SocketChannel 建立起来之前执行                          @Override                         protected void initChannel(SocketChannel ch) throws Exception {                             //对workerGroup的SocketChannel设置处理器,Handler示例见下面                             ch.pipeline().addLast(new NettyServerHandler());                         }                     });             System.out.println("netty server start…");             // 绑定一个端口并且同步, 生成了一个ChannelFuture异步对象,通过isDone()等方法可以判断异步事件的执行情况             // 启动服务器(并绑定端口),bind是异步操作,sync方法是等待异步操作执行完毕             ChannelFuture cf = bootstrap.bind(9000).sync();             // 给cf注册监听器,监听我们关心的事件             cf.addListener(new ChannelFutureListener() {                 @Override                 public void operationComplete(ChannelFuture future) throws Exception {                     if (cf.isSuccess()) {                         System.out.println("监听端口9000成功");                     } else {                         System.out.println("监听端口9000失败");                     }                 }             });             // 等待服务端监听端口关闭,closeFuture是异步操作             // 通过sync方法同步等待通道关闭处理完毕,这里会阻塞等待通道关闭完成,内部调用的是Object的wait()方法             cf.channel().closeFuture().sync();         } finally {             bossGroup.shutdownGracefully();             workerGroup.shutdownGracefully();         }     } }import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.CharsetUtil;  /**  * 自定义Handler需要继承netty规定好的某个HandlerAdapter(规范)  */ public class NettyServerHandler extends ChannelInboundHandlerAdapter {      /**      * 当客户端连接服务器完成就会触发该方法      *      * @param ctx      * @throws Exception      */     @Override     public void channelActive(ChannelHandlerContext ctx) {         System.out.println("客户端连接通道建立完成");     }      /**      * 读取客户端发送的数据      *      * @param ctx 上下文对象, 含有通道channel,管道pipeline      * @param msg 就是客户端发送的数据      * @throws Exception      */     @Override     public void channelRead(ChannelHandlerContext ctx, Object msg) {         //Channel channel = ctx.channel();         //ChannelPipeline pipeline = ctx.pipeline(); //本质是一个双向链接, 出站入站         //将 msg 转成一个 ByteBuf,类似NIO 的 ByteBuffer         ByteBuf buf = (ByteBuf) msg;         System.out.println("收到客户端的消息:" + buf.toString(CharsetUtil.UTF_8));     }      /**      * 数据读取完毕处理方法      *      * @param ctx      * @throws Exception      */     @Override     public void channelReadComplete(ChannelHandlerContext ctx) {         ByteBuf buf = Unpooled.copiedBuffer("HelloClient".getBytes(CharsetUtil.UTF_8));         ctx.writeAndFlush(buf);     }      /**      * 处理异常, 一般是需要关闭通道      *      * @param ctx      * @param cause      * @throws Exception      */     @Override     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {         ctx.close();     } }
  Netty客户端示例代码:import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;  public class NettyClient {     public static void main(String[] args) throws Exception {         //客户端需要一个事件循环组         EventLoopGroup group = new NioEventLoopGroup();         try {             //创建客户端启动对象             //注意客户端使用的不是ServerBootstrap而是Bootstrap             Bootstrap bootstrap = new Bootstrap();             //设置相关参数             bootstrap.group(group) //设置线程组                     .channel(NioSocketChannel.class) // 使用NioSocketChannel作为客户端的通道实现                     .handler(new ChannelInitializer() {                         @Override                         protected void initChannel(SocketChannel ch) throws Exception {                             //加入处理器,Handler代码见下面                             ch.pipeline().addLast(new NettyClientHandler());                         }                     });              System.out.println("netty client start…");             //启动客户端去连接服务器端             ChannelFuture cf = bootstrap.connect("127.0.0.1", 9000).sync();             //对通道关闭进行监听             cf.channel().closeFuture().sync();         } finally {             group.shutdownGracefully();         }     } }import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.CharsetUtil;  public class NettyClientHandler extends ChannelInboundHandlerAdapter {      /**      * 当客户端连接服务器完成就会触发该方法      *      * @param ctx      * @throws Exception      */     @Override     public void channelActive(ChannelHandlerContext ctx) {         ByteBuf buf = Unpooled.copiedBuffer("HelloServer".getBytes(CharsetUtil.UTF_8));         ctx.writeAndFlush(buf);     }      //当通道有读取事件时会触发,即服务端发送数据给客户端     @Override     public void channelRead(ChannelHandlerContext ctx, Object msg) {         ByteBuf buf = (ByteBuf) msg;         System.out.println("收到服务端的消息:" + buf.toString(CharsetUtil.UTF_8));     }      @Override     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {         cause.printStackTrace();         ctx.close();     } }Netty线程模型
  Netty的线程模型如下图所示:
  线程模型
  模型解释 :
  1) Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写
  2) BossGroup和WorkerGroup类型都是NioEventLoopGroup
  3) NioEventLoopGroup 相当于一个事件循环 线程组 , 这个组中含有多个事件循环线程 , 每一个事件循环线程是NioEventLoop
  4) 每个NioEventLoop都有一个selector , 用于监听注册在其上的socketChannel的网络通讯
  5) 每个Boss NioEventLoop线程内部循环执行的步骤有 3 步:
  处理accept事件 , 与client 建立连接 , 生成 NioSocketChannel
  将NioSocketChannel注册到某个worker NIOEventLoop上的selector
  处理任务队列的任务 , 即runAllTasks
  6) 每个worker NIOEventLoop线程循环执行的步骤:
  轮询注册到自己selector上的所有NioSocketChannel 的read, write事件
  处理 I/O 事件, 即read , write 事件, 在对应NioSocketChannel 处理业务
  runAllTasks处理任务队列TaskQueue的任务 ,一些耗时的业务处理一般可以放入
  TaskQueue中慢慢处理,这样不影响数据在 pipeline 中的流动处理
  7) 每个worker NIOEventLoop处理NioSocketChannel业务时,会使用 pipeline (管道),管道中维护了很多 handler处理器用来处理 channel 中的数据 Netty模块组件
  【Bootstrap、ServerBootstrap】:
  Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类。
  【Future、ChannelFuture】:
  正如前面介绍,在 Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过 Future 和 ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发注册的监听事件。
  【Channel】:
  Netty 网络通信的组件,能够用于执行网络 I/O 操作。Channel 为用户提供:
  1)当前网络连接的通道的状态(例如是否打开?是否已连接?)
  2)网络连接的配置参数 (例如接收缓冲区大小)
  3)提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成。
  4)调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方。
  5)支持关联 I/O 操作与对应的处理程序。
  不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应。
  下面是一些常用的 Channel 类型:   NioSocketChannel,异步的客户端  TCP  Socket 连接。   NioServerSocketChannel,异步的服务器端  TCP  Socket 连接。   NioDatagramChannel,异步的  UDP  连接。   NioSctpChannel,异步的客户端 Sctp 连接。   NioSctpServerChannel,异步的 Sctp 服务器端连接。   这些通道涵盖了  UDP  和  TCP  网络  IO  以及文件  IO 。
  【Selector】:
  Netty 基于 Selector 对象实现 I/O 多路复用,通过 Selector 一个线程可以监听多个连接的 Channel 事件。当向一个 Selector 中注册 Channel 后,Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel 是否有已就绪的 I/O 事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个 Channel 。
  【NioEventLoop】:
  NioEventLoop 中维护了一个线程和任务队列,支持异步提交执行任务,线程启动时会调用 NioEventLoop 的 run 方法,执行 I/O 任务和非 I/O 任务:
  I/O 任务,即 selectionKey 中 ready 的事件,如 accept、connect、read、write 等,由 processSelectedKeys 方法触发。
  非 IO 任务,添加到 taskQueue 中的任务,如 register0、bind0 等任务,由 runAllTasks 方法触发。
  【NioEventLoopGroup】:
  NioEventLoopGroup,主要管理 eventLoop 的生命周期,可以理解为一个线程池,内部维护了一组线程,每个线程(NioEventLoop)负责处理多个 Channel 上的事件,而一个 Channel 只对应于一个线程。
  【ChannelHandler】:
  ChannelHandler 是一个接口,处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。
  ChannelHandler 本身并没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以继承它的子类: ChannelInboundHandler 用于处理入站  I / O  事件。 ChannelOutboundHandler 用于处理出站  I / O  操作。
  或者使用以下适配器类: ChannelInboundHandlerAdapter 用于处理入站  I / O  事件。   ChannelOutboundHandlerAdapter 用于处理出站  I / O  操作。
  【ChannelHandlerContext】:
  保存 Channel 相关的所有上下文信息,同时关联一个 ChannelHandler 对象。
  【ChannelPipline】:
  保存 ChannelHandler 的 List,用于处理或拦截 Channel 的入站事件和出站操作。ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互。
  在 Netty 中每个 Channel 都有且仅有一个 ChannelPipeline 与之对应,它们的组成关系如下图:
  ChannelPipeline
  一个 Channel 包含了一个 ChannelPipeline,而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler。read事件(入站事件)和write事件(出站事件)在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰。 ByteBuf详解
  从结构上来说,ByteBuf 由一串字节数组构成。数组中每个字节用来存放信息。ByteBuf 提供了两个索引,一个用于读取数据,一个用于写入数据。这两个索引通过在字节数组中移动,来定位需要读或者写信息的位置。当从 ByteBuf 读取时,它的 readerIndex(读索引)将会根据读取的字节数递增。同样,当写 ByteBuf 时,它的 writerIndex 也会根据写入的字节数进行递增。
  需要注意的是极限的情况是 readerIndex 刚好读到了 writerIndex 写入的地方。如果 readerIndex 超过了 writerIndex 的时候,Netty 会抛出 IndexOutOf-BoundsException 异常。 声明
  本文来自于图灵学院课堂讲义。

iPhone14ProMax全球首拆A16芯片尺寸更大,灵动岛和相机都变了iPhone14ProMax可以称得上是当前性能最强的iPhone,而且发售之后就供不应求,想要第一时间拿到现货,还需要加价购买。那么作为苹果当前最新的旗舰手机,iPhone14P余承东华为把全球设计结合起来在上海最终走向商业化产品9月15日,华为常务董事终端业务CEO智能汽车解决方案事业群CEO余承东在世界设计之都大会做主题演讲。9月15日,世界设计之都大会,华为常务董事终端业务CEO智能汽车解决方案事业群詹姆斯谈太阳老板处罚结果他的行为不该有容身之所北京时间9月14日,NBA官方公布来了对菲尼克斯太阳队及水星队(WNBA球队)老板萨沃的处罚结果,他被禁止参与球队一切事务一年,并罚款1000万美元。此前他曾因种族歧视及厌女症等指10!中国队创纪录,00后国脚闪耀全场,国足官方发声,双线奏凯国足早已经结束了2022年所有的比赛任务,中超联赛也在如火如荼进行当中。与此同时,各年龄段国字号球队都没闲着,或是有大赛任务,或是在欧洲拉练。比如U19国足正在冲击亚青赛正赛,他们58年来首位!这个十堰女孩太牛了日前在英国围棋锦标赛中十堰27岁女博士王高歌获得冠军这也是该赛事举办58年来诞生的首位女性冠军27岁的十堰女孩王高歌获得2022年英国围棋锦标赛冠军十堰女孩成英国围棋锦标赛首位女性2006年,泰森来到中国参观毛主席遗体,临走时叹称我很渺小在阅读此文前,麻烦您点击一下关注,既方便您进行讨论与分享,又可以让您下次继续阅读相关文章,感谢您的支持。2006年,已经宣布退役的拳王泰森来到中国,特意前往毛主席纪念堂参观。他在毛郎平携71岁教授美国养老!与手球名将9年之痒,为女排拒美国人求婚9月14日消息,61岁的原中国女排主教练郎平有过两段婚姻,曾经还有过一位美国白人男友,如今和71岁的教授老公王育成一起在美国安享晚年,十分幸福。1987年,郎平退役后与前八一手球队谢里夫VS曼联欧会杯E组第二轮比赛,主队谢里夫是上赛季的欧冠黑马,历史性的打入欧冠小组赛并爆冷击败了西甲豪门皇家马德里,创造了摩尔多瓦足球的历史,不过在本赛季的欧冠资格赛中他们被比尔森淘汰无缘正只差官宣!抛售洛杉矶2亿豪宅,名记威少已经被通知离开如果说这个休赛期,谁是NBA上新闻最多的球员和球队,那毫无疑问就是湖人和他的后卫球员韦斯特布鲁克。从之前和篮网的交易谈判,再到后来和步行者的谈判,到如今持续进行的与爵士的谈判。威少杜锋摊牌了,叫停和深圳队的热身赛,宏远三少未回归,月底再战杜锋未归队的时候,广东宏远就和深圳男篮,约好了在本周进行热身赛。球迷也在翘首以盼,毕竟,广东男篮没参加夏季联赛,一场热身赛都没打。考虑到广东有三支CBA球队,不想长途跋涉,最终决定看不懂的嵩山龙门,回不来的河南建业01,当休息了两周之后,我们再一次通过直播看到河南嵩山龙门的比赛的时候,对手是一周双赛五轮不胜的天津津门虎,哈维尔这一次送温暖,可以说很到位这真的不是我熟悉的那支河南建业,随着名字光伏发电是不是21世纪以来最大的骗局?光伏本来不是骗局,但是因为中国入局且垄断了这个行业并获利了,他就变成了西方宣传中的骗局十年前,提到碳排放,中国人都知道这是西方的阴谋,是先富压制后富的手段,5年前,中国大力发展光伏收评创业板指跌3。18创阶段新低,两市超4100股下跌,房地产板块逆市爆发金融界9月15日消息隔夜美股反弹,周四A股三大指数集体高开,早盘市场单边下挫,创业板指跌近3再创本轮调整新低午后一小时A股跌幅进一步扩大,创业板指一度跌近4,尾盘市场止跌有所反弹。A股大变盘很可能会在明天出现前面一直再给大家说,空头的做空套路,就是永远不会直接大幅下跌,总是喜欢大跌以后,立刻假反弹,然后给人希望,最后当大家都满怀希望的时候,再迅速大跌,让大家的希望全部破灭。大家去分析最油价调整今天9月15日92号95号汽油价格,国内油价或大幅下调今天是9月15日,距离下一次国内成品油价格调整窗口的开启时间9月21日,也只有5个工作日了。上一次国内成品油价格迎来了一次上涨,但是整体的涨幅不大,近些天国际油价的波动较为明显,本北向资金增持个股一览,重点加仓半导体行业9月14日,A股三大指数集体下跌,沪指跌0。80,深成指跌1。25,创业板指跌1。84。题材股尽数回落,充电桩锂电池磷化工风电光伏苹果指数跌幅靠前,券商电力化工基建表现不振海运石油油价调整今天9月16日92号95号汽油价格,国内油价或大幅下调油价调整今天9月16日92号95号汽油价格,国内油价或大幅下调今天是2022年9月16日,星期五!本月已过半,油价在月初已经迎来了一轮上调,每升汽柴油平均上调0。18元左右,国内油周四凌晨迎来两大重磅利好,这两个板块或将迎来大幅上涨周四凌晨,消息面并不平静,陆续迎来两大重磅利好消息多家国有大行9月15日起下调个人存款利率国常会决定核准福建漳州二期和广东廉江一期核电项目。利好一多家国有大行9月15日起下调个人存胡鑫溢9。15黄金白银反弹无力,晚间金油行情走势分析投资,之所以不知足,就是有着太多的虚荣心。俗话说知足者常乐,但又有几个人能达到这样的境界。人不是因为拥有的东西太少,而是想要的东西太多。大千世界无奇不有,有着太多太多的诱惑,金融市林芝如梦桃花杜鹃和山川距离林芝之行已经过去快两年了,至今想起来仍然有一种不真实的感觉。冰川在悠悠的森林顶部泛着银光,江水被阳光照射成碧蓝色,林木葱茏,暗香浮动,行于陌上,如入梦中。林芝是西藏的江南,她的国庆去哪儿?九个最好的秋天,承包你一生的记忆我们想用九个秋天,和你再谈记忆秋天,原本是最应该走到远方里去的时候,尤其,是中国的秋天。木心说过,秋天的风都是从往年秋天里吹来的。记忆总是出现在秋天,就好比我们此刻,会不自觉惦念过迪丽热巴穿黑色镶钻裙,天鹅颈尽显高贵,美女仪态绝了近日,工作室发了一组迪丽热巴亮相活动现场的照片,引发网友热议。照片中的迪丽热巴状态极好,身穿黑色镶钻的精致礼服,容貌端庄大气,天鹅颈尽显高贵,气质极佳。一出场,热巴便成为全场的焦点
债市震荡导致银行理财回撤,原因何在,未来如何?来看专家解析实习记者章宇璠11月以来,一向以稳健著称的银行理财遭遇大幅回撤。很多网友吐槽说,持有的债基理财短短几天内亏掉了几个月的收益,稳稳的幸福消失了。众多理财子公司纷纷表示这一轮债券基金下赶集2。0航拍实探!金银湖CBD崛起,朔商项目率先亮相2021年2月,两集中供地成为我国土拍市场的新名词。新规之下,零散出让的涓涓细流变成集中出让的放量供地,土拍新时代自此开启。新规实施已近两年,土拍市场的高溢价得到平抑房企拿地也更加提进度保障任务兑现多地重大项目加快推进央视网消息进入四季度,多地重大项目的建设一片火热,通过大项目落地,发挥有效投资撬动作用,保障年度任务完成和目标兑现。近日,湖北省新开工44个新能源项目。截至目前,全省109个国家基成都熊猫海洋世界项目开工青岛将建国内规模最大海洋主题科技馆成都熊猫海洋世界项目开工,总投资30亿元12月5日,成都市成华区三个做优做强重点片区项目集中签约开工仪式在成都熊猫国际旅游度假区举行。据悉,本次3个重点片区集中签约中国大熊猫国际科马上就要过年了,摆摊最能快速赚钱啊!分享几个快速赚钱的小生意疫情反复很多地方动不动就静态管理,可是苦了一些行业的从业者。尤其是饭店和旅游从业者简直是难的一匹啦!维持下去就算不错了,都在咬牙硬抗着。我作为一名营销策划师,最近身边的好多朋友都在嗓子总是有痰不干净?分享三个中成药帮你化痰,还你清爽有很多患者经常说,感觉自己的嗓子里有痰,而且还吐不干净,吐了之后,不一会就又有了,很是困扰。药呢,也喝过不少,但效果一般,这是为什么呢?今天就来给大家讲讲。正常情况下,大家都认为有饭店最干净的5道菜,可以放心点,老板也常吃,可惜懂的人很少随着生活水平提高,大家的生活品质也越来越好,很多年轻人甚至一些家里的长辈都开始喜欢下馆子吃饭,比在家里省心多了,口味多还不用收拾,多好,特别是逢年过节,生日聚会什么的,都喜欢出来聚乡村散文悲歌秋雨霏霏,带着些许凉意。雨茗和崔鑫骑着电动车,有说有笑去县城买衣服。崔鑫从工厂辞职了,准备在家做个小买卖,结束了两人两地分居的相思之苦。许是雨天的缘故,行人稀少。雨茗骑着车,崔鑫斜文案!整理一些干净文艺文案闲时煮茶落暑天,岁里偷得半旧年。二斤桃花酿作酒,万杯不及你温柔。你是人间烟火不自知,我在俗世仰望应如是。唯有你的光辉,能像漫过山岭的薄雾。活着不一定要鲜艳,但一定要有自己的颜色。只三亚经济圈多家景区互惠联动促进圈内景区融合发展海南日报三亚12月6日电(记者李艳玫)近日,三亚旅文集团联手海南槟榔谷黎苗文化旅游区南湾猴岛生态旅游区呀诺达雨林文化旅游区及海南富力海洋欢乐世界度假区共同推出三亚经济圈景区互惠联动安徽六安花近11亿打造的景区,民国风味十足,还是一个亲子乐园很多人出门的时候都有一点纠结,既想去游山玩水,又想去玩各种游乐设施,还想能带着小朋友方便一点,奈何时间有限,就不得不做出选择,而在安徽省六安市就有一个景区,可以说是一个集游山玩水高