1. 网络通信<br />1.网络传输的要素:<br />1. 协议;<br />Udp:广播协议,面向无连接的,速度快,不安全<br />Tcp:面向连接的,因为要经过三次握手,所以比较慢,比较安全<br /> <br />注意:udptcp都是基于socket来实现的协议<br /> <br />2.io:网络间的数据传输是通过二进制数据进行传输的,那么也就是使用io流的形式进行传输的<br /> <br />注意:IO的分类<br />1. BIO:同步阻塞io<br />2. AIO:异步非阻塞io<br />3. NIO:同步非阻塞io<br /> <br />注意:这里的同步和异步指的是应用程序和内核的交互:<br /> 同步:排队等待,<br /> 异步:无需等待<br />阻塞:指未得到当前消息就直接挂起不做其他事情<br />非阻塞:即使未得到结果,先去做其他事情了<br /> <br /> <br />3.RPC框架以及原理:主要作用就是将消息进行打包封装以及解压<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330540914-a87e70c1-5f77-4a83-b831-ed3067d197fb.png#height=253&width=415)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330541239-28f1596a-2f8d-4593-ab22-7c66acae0eaf.png#height=271&width=415)<br /> <br /> <br />远程调用讲解:<br />1. RMI:java原生支持的远程调用,不需要依赖第三方的包,使用的是jrmp协议<br /> <br /> <br />BIO:同步阻塞的io<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330541529-85b89d22-6d7b-4dfc-a811-16ff9d4cbaa0.png#height=222&width=416)<br />代码案例:<br />服务端:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330541987-83c5d033-bbbc-43b1-a6ad-c52c00b30b98.png#height=228&width=415)<br />客户端:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330542359-6e061b8f-9f56-4514-ab2b-3ac6ec2171e4.png#height=156&width=415)<br /> <br />NIO:同步非阻塞io:一个请求开辟一个通道<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330542641-2a206f3e-6028-4d69-865b-d356f4a61ba7.png#height=214&width=415)<br />1. 客户端的请求注册到多路复用器上面,注册到上面之后,多路复用器就去轮询我们的服务器,看客户端需要执行的对应的哪些读操做和写操做,然后开辟一个通道(channel),多路复用器并监控io的读写请求<br />2. 数据主要是buffer(缓冲区)和channel(通道)之间的交互<br />3. 这里始终使用的是一个线程进行连接<br /> <br /> <br />代码案例:<br /> <br /> <br />NIO缺点:<br />1. 类库和api繁杂,使用麻烦<br />2. 可靠性不强<br />3. Nio的bug,列如epoll bug,会导致selector空轮询,以至于cpu100%<br /> <br />AIO:异步非阻塞:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330542946-f31461e4-1bbf-490e-9691-a4c09a6d07ad.png#height=155&width=415)<br />这里客户端将信息只要交给操做系统就好了,什么也不用管,到时候服务端会主动调用回调函数去进行通知<br /> <br />使用场景:连接数目多且比较长的连接,就用aio去实现:相册服务器<br /> <br />注意:**长连接**:客户端和服务端建立连接之后,一次请求之后不会立即关闭,而是保留连接方便下次使用:客户端消失但连接依然存在,比较占资源,这个时候服务端每2个小时发送一次探测报文段给客户端,获取客户端的状态。<br /> **短连接**:客户端和服务端建立连接之后,一次请求之后会立即关闭,一般由客户端发起关闭请求:管理起来简单,意味着存在的连接都是有用的连接<br /> <br /> <br />Netty:异步的,基于事件驱动的网络编程框架:支持socket,也支持http协议<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330543262-b178013b-4c87-4416-b583-7d5eb18d22b4.png#height=83&width=415)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330543564-295f94e7-b798-4d54-b98c-7adc548b1b5f.png#height=110&width=415)<br /> <br />Netty的线程模型:<br />1. 单线程模型:当并发比较高的情况下,单线程的处理效率会非常差<br />2. 线程池模型:<br /> <br />Netty常用组件:<br />1. ChannelHandler接口及其实现类:ChannelInBoundHandlerAdapter<br />使用说明:<br />1. 自定义一个类继承ChannelInBoundHandlerAdapter,并重写里面的相关方法去实现业务逻辑,<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330544063-60e3b919-eae1-4ec7-a355-bb17c270f8d4.png#height=62&width=415)<br />代码案例:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330544632-7c538e4e-2e51-4c94-a9f8-f76b643a3090.png#height=190&width=415)<br /> <br /> 2.ChannelPipeline:Handler集合,负责处理和拦截inbound或者outbound的事件和操做<br /> <br />注意:这里就好比是一条执行链条,在通道中,我们需要先做什么,再做什么,都往这个链条中塞,也就是使用下面的方法,至于first和last类似队列,有队头和队尾的概念<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330545103-1ce8014d-994a-49ae-88b7-acefaca8d1f7.png#height=59&width=415)<br />代码案例:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330545616-1ddca02f-5fa2-48c5-8a9e-ae4b32fc76d4.png#height=214&width=414)<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330546145-e49e7e9e-2191-40ca-89f8-b0f554228ffc.png#height=91&width=415)<br /> <br /> 3.ChannelHandlerContext:这个是每个通道中处理事件的具体工作者,是业务处理中的参数,从而获得对数据的操做:看第一个组件图可知<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330546611-a7ef71e2-8ab5-4a71-9df0-e67f7709ded0.png#height=58&width=415)<br /> <br /> <br /> 4.ChannelFuture:channel异步IO操做的结果<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330547099-294e5c49-3b95-4df9-9656-88ce7f6c1134.png#height=44&width=415)<br /> <br />5.接口EventLoopGroup和其实现类:NioEventLoopGroup:<br /> 这个类似一个线程池,里面有很多的eventloop,每个eventloop负责维护一个selector。<br /> <br />注意:1.selector:多路复用器<br />2. 我们在消息的提供端(服务端)创建两个线程池,一个用来用户的连接,一个用来连接中数据的读写<br />3. 创建好之后作为参数放在启动助手类之中就好<br />代码案例:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330547346-6a80d360-bd6d-4023-9973-b9a39cf81072.png#height=135&width=415)<br />6. serverbootstrap和bootstrap<br /> Serverbootstrap是服务端启动助手:<br />Bootstrap:启动引导类<br />代码案例:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330547637-e2da70f6-864e-4b21-8362-193c150d7224.png#height=42&width=415)<br /> <br /> <br />常用组件就讲完了,回过头再仔细阅读代码 然后总结一套流程出来<br /> <br />Netty实战:<br />1. 引入依赖:<br />![](https://cdn.nlark.com/yuque/0/2020/png/2499550/1607330548159-ebf4d2a8-eab7-4b12-bf88-ee29a5cd51fd.png#height=114&width=412)<br />2. <br />3. <br />4. <br /> <br />1. 服务端:<br />2. 客户端:<br /> <br /> <br />使用netty实现rpc框架原理与实战:<br /> <br /> <br />这个下面就全是代码了 代码我已经全部给你了,你自己总结流程就行了。