在上一篇的文章中https://blog.csdn.net/we_phone/article/details/79053472
我初步完成了整个RPC框架的搭建,从服务调用到服务发现再到负载均衡,这一篇开始进行的是一系列我所知的优化操作
这一篇我讲的是连接池,比较简单,详细代码已托管到github:https://github.com/wephone/MeiZhuoRPC
首先了解一下什么是连接池
连接池
在平时我们的数据库增删查改的业务中,应该绝大多数使用到了连接池技术,例如C3P0,Druid这类框架,帮我们完成了对数据库连接的池化。
当没有连接池时会遇到这样的问题:
要么每一次进行远程连接时都去创建一个连接,用完立即释放,也就是频繁的创建和销毁大量连接。
或者各个调用共用一个单一连接,但在多线程的情况下,需要加锁来避免争抢的问题,这个方案的问题是效率低下且复杂性高。
连接池的做法就是预先加载一定数量的连接放到资源池里,当需要连接时则从连接池中拿出一个来使用,用完则还回去,当并发量巨大,连接资源匮乏时,根据一定的策略来新建连接或者拒绝。
和jdk中的线程池类似,都是资源池化的思想。
在我前面的框架编写中,我采用的是单一连接的方式,并且用加锁来保证不会重复连接等等,其实在netty框架的一些版本中,有FixedChannelPool这个东西作为netty的连接池,但在我用的版本里没有发现这个,出于学习的目的,就自行用其他库写了一个来作为RPC框架的连接池。
Commons-Pool
在后续的开发中我引入了这个库,用来做连接池的基本手脚架,这个框架已经包含了对象池的基本处理,例如创建对象,回收对象,最大数量控制等等。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.2</version>
<