RPC调用的三个主题,
1. 数据协议,好的数据协议编码后的码流小,利于网络传输,在编解码的过程中占用CPU少,并且跨平台的。例如java自带的序列化反序列化就是不跨平台。
2.IO模型, bio、nio、aio,JDK1.5之后nio采用了epoll模式,netty就是基于这个NIO做的,比较出名的是 零拷贝(直接内存,不走jvm的堆),
什么direct buffer之类的,直接内存不是在jvm管理的范围内,是非托管操作的,jvm里面也是可以设置的。
3. 线程模型,(监听的事儿NIO走了,监听之后处理通道的消息的执行有线程模型的说法)对于tcp连接消息的读取、发送、编解的处理,
单线程模型一个一个地处理连接,这样还是很慢,
多线程模型可以并发地处理多个连接(进入线程池,线程池维持一个任务队列和N个可用线程),
nio线程接受连接是一个线程,但是连接量大的时候还是不行(很多连接可能需要做一些安全认证),接受连接也做一个线程池(accept pool),处理连接也是多线程
ps:accept阶段的叫IO线程,reactor阶段的也叫io线程 ,后面是soa框架或者类似catalina框架处理请求、响应请求也有线程模型(工作者线程),例如dubbo,dubbo会对什么场景下直接在io线程里面处理掉,或者在工作线程里面处理。
详见: http://www.infoq.com/cn/articles/netty-high-performance
Netty在并发编程上的小技巧:
1.多用volatile,实现多个线程间数据更改的同步,无锁设计,同时又能做到set /get线程安全
2.多用cas,例如atomicInteger里面的加加减减。
3.多用线程安全的容器(里面也会充分利用第一、二点)
4.多用读写锁提高并发性(读读共享,读写互斥,写写互斥)
参考: https://www.zhihu.com/question/25536695/answer/109977506 (谁能用通俗的语言解释一下什么是 RPC 框架?)