zoukankan      html  css  js  c++  java
  • Netty实践场景

    数据通信

    如果需要考虑的是两台机器(甚至多台)怎么使用Netty进行通信。大体上分为三种:

    1 第一种:使用长连接通道不断开的形式进行通信。也就是服务端和客户端的通道一直处于开启状态。

    如果服务器性能足够好,并且我们的客户端数量也比较少的情况下,推荐这种方式。

    2 第二种:一次性批量提交数据,采用短连接方式。也就是我们会把数据保存在本地临时缓冲区或者临时表里,

    当达到临界值时一次性批量提交。又或者根据定时任务轮询提交。这种情况弊端是做不到实时性传输。对实施性不

    高的应用程序中推荐使用。

    3 第三种:可以使用一种特殊的长连接,在指定某一时间内,服务器与某客户端没有任何通信,则断开连接。

    下次连接是客户端向服务器发送请求的时候,在次建立连接。但是这种模式我们需要考虑两个因素:

    1 如何在超时(即服务器和客户端没有任何通信)后关闭通道?

     

        使用 new ReadTimeoutHandler(5, TimeUnit.SECONDS);即可设置超时时间

        关闭通道后又如何再次建立连接?    

        采用了一个小判断,每次在getChannelFuture()时判断是否需要重新连接。

    2 客户端宕机时,我们无需考虑。下次客户端重启之后我们就可以与服务器建立连接,但是服务器宕机时我们的客户端如何与服务器建立连接呢?

        服务端宕机的问题:

        我们可以写一个定时任务,定时的(比如每隔一个小时)尝试与服务器建立连接,检测服务器是否处于可用状态,如果服务器宕机了则不再发送业务请求,直到定时检测发现服务器恢复正常。

    心跳检测

            使用socket通信一般会经常处理多个服务器之间的心跳检测,一般来讲我们去维护服务器集群,肯定要有一台或几台服务器主机(Master),然后还有N台(Slave),那么主机肯定要时刻知道自己下面所有的从服务器的各方面情况(比如磁盘使用情况,性能,CPU使用率等等),然后进行实时监控的功能,这种功能在分布式架构中叫做心跳检测或者心跳监控,如果跨网跨域还要考虑安全问题。最佳处理方式还是应该用一些框架实现,比如Netty就可以做这样一件事情。

    可以使用sigar用于监控我们这个服务器的所有信息

    Sigar全名是System Information Gatherer And Reporter,中文名是系统信息收集和报表工具。我是一个开源的工具,提供了跨平台的系统信息收集的API ,Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息。

    这些平台包括:LinuxWindowsSolarisAIXHP-UXFreeBSDMac OSX

        CPU信息:包括基本信息(vendormodelmhzcacheSize)和统计信息(usersysidlenicewait

        文件系统信息:包括FilesystemSizeUsedAvailUse%Type

        事件信息:类似Service Control Manager

        内存信息:物理内存和交换内存的总数、使用数、剩余数;RAM的大小

        网络信息:包括网络接口信息和网络路由信息

        进程信息:包括每个进程的内存、CPU占用数、状态、参数、句柄

        IO信息:包括IO的状态,读写大小等

        服务状态信息

        系统信息:包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息

    1 首先客户端在发送请求时,channelActive方法中进行安全认证

     

    2 服务端收到请求判断请求类型,如果请求参数为String类型则进行安全认证,给客户端回写认证信息

     

    3 客户端通过判断服务端是否认证成功,使用线程池:Executors.newScheduledThreadPool(1);每隔三秒发送一次发送健康包检测

     

     

        

    RequestInfo:省去getset

     

    客户端代码

     

    服务端代码

     

    Netty上传下载

    Netty在上传时会将文件分成多个小块chunck,比方说:一个文件10MNetty会用ChunckedWriteHandler(支持异步发送的码流(大文件传输)但不占用过多的内存,防止java内存溢出)类将这个文件拆分,比如说分成10份,每份1M10次进行传输,将10次传输封装成1response进行响应。这样做的好处,每次传输的内容小所以够快。

    ---------------------

    作者:石印掌纹

    来源:CSDN

    原文:https://blog.csdn.net/LIAN_XL/article/details/79799072

    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    MySQL数据库:数据完整性及约束的应用
    MySQL数据库:运算符
    MySQL数据库:合并结果集
    MySQL数据库:聚合函数的使用
    spring web mvc环境搭建
    golang中type常用用法
    有些事情,你真的要早点明白
    一个小事例,了解golang通道阻塞模式
    golang中,slice的几个易混淆点
    作为面试官的一点小感想
  • 原文地址:https://www.cnblogs.com/xiaoshen666/p/10852007.html
Copyright © 2011-2022 走看看