netty 学习回顾

2 篇文章 0 订阅
1 篇文章 0 订阅

netty 是什么?

说白了就是一个链接从客户端到服务端的不断优化升级之后,业内公认的标准解决方法。

我的学习经历了什么?


从开始的学习极客的秦老师的课程,到自己去找资料看的情况,从概念到代码的理解。在到看bili上看视频,在到自己看给的辅助的资料。最后搜错极客看到的傅健的视频。现在回忆下自己到底看到的是什么?

个人总结根本


首先这个问题研究的根本就是连接的处理,如何去处理客户端到服务端的多个请求,接收到请后之后服务端是如何优化处理多个请求,带来的处理不及时还有扩展的。

最初的链接

客户端和服务端,一般业务场景是一个服务端对外通过tcp/IP的形式,也就是网络IP地址,加端口好的形式对外提供服务。
别人访问的时候就是IP:端口+请求接口。这个就是一个客户端想服务端请求数据。用邮寄信件的方式去说就是写封信,信封上的信息。

然后举例丢给的是一个邮局*(服务端)。前期这个邮局就只有一个地方,一个人在处理。而且是以一个人就只能处理一个在处理一个。这样肯定接待和处理的是一个处理完了在去处理下一个。

加大处理的优化


这样的效率非常低下。 这个也就是网络中通讯早期的socket的通信,而且是长连接,不断的,执行等待完成在继续执行。


后来安排多个人执行,就是多线程的执行。
这些其实都是单线程处理,到多线程处理,最后到了线程池减少开销就是固定线程池的处理。

我理解这个就是处理能力的提升,还有日常的维护,这里考虑的点就是一个服务端,正常数据会请求量多大,处理的时候多大。也就是蓄水池,进出水的问题。只要水不宜出来就是可以长期去执行。这里是加多个出水口。到后面属于出水口根绝实际情况设定比较合适的数量。

业务长的优化

这之后就是连接的一个稳定性,也就是一个请求过来处理的业务很多,会导致的返回很慢,返回慢,处理长就会中间出现线程异常,分布式服务中的服务可能断掉。这就需要去考虑吧这些分开。也就是解耦。解耦呢就是通过类似redis,mq的方式。让数据通过监听有变动这个变动就是事件,这样就避免了长时间的线程。这就是线程非阻塞的由来。非阻塞就是我处理一个事情,如果不能处理,我就先干别的。等能处理了在处理。

在现在中就是现成的 BIO NIO AIO.AIO就是你发需求发过来,然后就做自己的事情,等做好了返回给你。常见的就是页面的ajax。页面中的部分请求,不影响别的也买你的数据渲染,也就是他不反悔最多不会一部分页面有对应的效果。等有了效果在渲染。在去渲染。这个就是后续结果没影响。这个在业务中就是异步业务,比如说我一个订单完成了,需要给用户发送通知,给用户增加积分,自动生成评分页面。这些都不影响业务中的订单完成的业务。订单的状态改变,金额从官网冻结的金额转到商铺的账面上。也就是后续的业务上。

业务的横向处理

这两个一个是从处理的多少,还有从解耦也就是吧大业务分解成小业务。还有一个就是对业务的处理的横向的扩展的数据。
也就是可扩展的处理点,以及业务的分发,这个其实就是类似数据库的sharding-spare。把大的处理变成小的处理,最后减少增加了服务的力度,可以通过配置,选择服务的。也就是通过动态的配置某个环节的处理复杂度增加,减少处理的机器。比如天猫的服务系统,会部署虚拟机,根据比如双11的服务,先去根据以往的业务还有评估的增长量,去部署服务系统。比如运算量还有请求出,csdn,等需要进行IO处理还有后台业务计算的服务。

这个也就是说对于一个业务场景具体的分析,解决的通用方式。也就是请求量大,后端处理量大。
采取的测试,把请求拿过来,然后解耦的继续宁处理,这样不会导致不同地方的处理溢出。同时给需要加大的地方进行加强。

简单说就是业务方面的动态化处理扩展。比如一个客户端对应多个订单系统的分布式部署。

netty对比理解

netty呢就是基础这个情况考虑。给服务端设计的接受请求,请求解耦,缓存,然后后台根据请求分开处理。在给不同的请求进行对应的业务操作。然后拿到里面的数据进行的一个业务分界,在返回的处理。从而达到了业务处理中,部分需要解耦,也就是响应可以不及时,处理必须到,不用时刻监听,后面单独比如处理的业务也保证了给他充足时间去处理。
以及并行的增加处理加大蓄水池流出速度。达到一个类似山洪暴发,有点地方不能同时很多水通过,通过多小水流快速消化,有的拦住水底坑。最后都留到山下也就是重点,又不会在留下取得过程中,造成破坏。在系统中就是两个考量的点,一个是IO复制,一个是计算量。IO运算,比如用户申请账号,最终就是直接复制信息到数据库。运算,就是比如我一个业务,需要涉及到的后台的运算,比如说算上红包,算上活动,算上运营商的成本,积分,不同商品是否可以累计等方面,一个业务中的计算量,还有查询的次数导致的计算,查询等。如果比如IO时间长就给IO的解决方案,比如水缓存,比如加多IO的处理器,比如说进行静态的,还有缓存。如果计算负责,就增加计算量,优化算法等。

netty中消息的保证

在这中间呢,存在消息的一个传递,也就是从客户那发送信息,字节流一般(buffer 7种类型的),客户端节收到,先复制到内存中,在复制到服务器内存中,服务器内部处理拿到运算中,运算好在给到用户内核,在分发给服务器的,服务器拿到后在转码通过各种通讯协议转码通过来链接发送给客户端。客户端在根据一个本地的活动的链接线程,接受到这个对应的数据,也就是channel对应的数据。去进行解析,然后进行展示或者运算。一般就是个展示了。
所谓的0拷贝,优化等就是把这些信息减少了拷贝,其实就是减少了一部分的IO。也是提升了系统中的运行效率。linu一般作为线上服务器,早就实现了内存的零拷贝也就是不用CPU,内存共享,减少了拷贝的时间。从现在业务上看,量少数大。也就成了大量的优化的情况。

从netty的情况分析:
目前的就直接的是Reactor的主从结构的技术上,加封装的NIO,还有他可扩展的bootgroup,NioSocketChannel,Pipeling,handler等不同节点组成的一个优化情况。

服务端分析

目前看到的普遍的一个netty,架构是

 

 

一个初始化的服务端 ServerBootstrap(封装的一个服务端的启动类) 
中包含一个boosGroup,多个workGroup。boosGroup去接受所有的请求,存放起来。workGroup根据请求不同进行分开处理。
一个workGroup就是一个类型的请求的结合。他下面对应的就是不同的EventLoop。也就是所谓的时间。就是需要处理的事情。一个事情配对一个信息的通道,用于客户端和服务端的信息的保证,也即是说这个信息是谁的。java中的类型就是SocketChannel。一个信息可能会经历出个操作。比如一个炸鸡,经过初次炸,控干,洒调料,在炸,后在裹粉之类的。每个操作即使一个handler。最后处理完成之后,饭给到channel中去。然后通过时间监听的情况,反馈给对应的请求的channel。

 

客户端相对简单就是请求的配置,请求到哪里,指定Ip加端口,指定他的消息通道还有返回收处理的信息。最后在进行关系。整个请求到服务的时候ok.

整个中注意的知识点:


1.socketChannel基于Nio的selector进行的关联信息。
也就是一个socket监听时间,每次请求过来就会放在绑定的socket,accpet的监听下main。这个accept就是请求监听的意思。socket是个常链接,链接分类型,包括了去请,读,写,commit。如果是请求的就会把这个放入到socketor中,记录在selectionKey中。其实类似于Spring的服务注册。当有时间发生的时候就会进行时间的触发监听,然后selector会根据事件,得到注册中的key,在通过key得到channel。然后把这个channel作为消息交流。

2.channel中的信息,中间还存在一个buffer。NIO中有七种。不同于Socket用的字节流形式。一个输入字节流,一个输出字节流。socket的channel中可以实现输入和输出,只要切换属性状态就可以。从代码的样例看的话,netty的代码直接一个参数或者设置就减少了NIO的很多配置项目。这也是netty封装的好处。

3.对于事件驱动的心跳。其实就是保证连接的正常。这个参考spring的注册服务就OK。一般就是一定时间的返回一个信息。确保OK链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值