基于Apache-Commons-Pool2实现Grpc客户端连接池

  

概述

  

在项目运行过程中,有些操作对系统资源消耗较大,比如建立数据库连接,建立复述,连接等操作,我们希望一次性创建多个连接对象,并在以后需要使用时能直接使用已创建好的连接,达到提高性能的目的。池技术通过提前将一些占用较多资源的对象初始化,并将初始化后的对象保存到池中备用,达到提高应用服务性能的目的,数据库的JDBC连接池和能连接池等都使用了池技术。
Apache-Commons-Pool2提供了一套池技术的规范接口和实现的通用逻辑,我们只需要实现其抽象出来的方法就可以了。这篇博文主要分享基于Apache-Commons-Pool2来实现Grpc连接池的应用。
关于Grpc相关的内容,大家如想了解基本的实现方法,可以参考我的另一篇博客(传送门):https://blog.51cto.com/andrewli/2058908

  

核心组件

  

我们先来了解一下Apache-Commons-Pool2规范接口中涉及到的几个核心组件,包括:

  
      <李> ObjectPool
    对象池,用于存储对象,并管理对象的入池和出池。对象池的实现类是GenericObjectPool;李   <李> PoolConfig
    池属性,用于设置连接池的一些配置信息,比如最大池容量,超过池容量后的处理逻辑等。池属性的实现类是:GenericObjectPoolConfig;李   <李> ObjectFactory
    对象工厂,在需要的时候生成新的对象实例,并放入池中。对象工厂的接口是:界面PooledObjectFactory;李   <李> ClientObject
    池对象,由对象工厂负责创建,并放入到对象池中,需要使用时从对象池中取出,执行对象的业务逻辑,使用完后再放回对象池,池对象的接口是:接口PooledObject。   

    核心组件依赖关系及其工作流程

      

    接口与类之间的依赖关系

      

    在梳理连接池相关的核心组件工作流程之前,我们先来了解一下核心组件涉及到的类和接口之间的继承和实现关系。

      <李>   

    对象池类的继承关系
    对象池的最顶层接口是ObjectPool抽象类BaseGenericObjectPool池类GenericObjectPool继承了抽象类BaseGenericObjectPool,并实现了ObjectPool接口。其中添加了对象工厂,存储所有对象的地图,存储闲置对象的链式阻塞队列,当前已创建的对象数等属性。
    由于GenericObjectPool类支持范型,我们要做的,就是指定GenericObjectPool池类返回的池对象类型& lt; T>,并设置对象工厂类,配置类等池属性,或者继承GenericObjectPool类以添加更多的自定义池特性。
    基于Apache-Commons-Pool2实现Grpc客户端连接池

      李   <李>   

    池属性类的继承关系
    池属性的最上层接口是接口可克隆,抽象类BaseObjectPoolConfig实现了这个接口,并定义了默认的池配置属性。
    GenericObjectPoolConfig类继承了BaseObjectPoolConfig,同样定义了默认的池配置属性值。
    我们可以直接使用GenericObjectPoolConfig类,或者继承GenericObjectPoolConfig类,根据自己的需求设置自定义池配置属性。
    基于Apache-Commons-Pool2实现Grpc客户端连接池

      李   <李>   

    池内对象类的继承关系
    池内对象类实现了上层的PooledObject接口,这个接口里面定义了一个池对象需要实现的各种方法。
    另外,池内对象类还需要定义类本身需要具备的成员属性和需要实现的业务方法。
    基于Apache-Commons-Pool2实现Grpc客户端连接池

      李   <李>对象工厂类的继承关系
    对象工厂类实现了最上层的PooledObjectFactory接口,该接口定义了对象工厂的核心功能方法,包括:创建对象,销毁对象,校验对象,激活对象,钝化对象。
    基于Apache-Commons-Pool2实现Grpc客户端连接池   
  

工作流程

  

根据上述对核心组件的类继承关系分析,我们可以梳理出一个流程,逐步实现各个组件,并组合成一套适用于我们业务的连接池架构。我们来看看这个流程该如何定义。
(1)定义我们的池内对象类ClientObject,并结合我们的实际业务来实现上层接口的方法。

基于Apache-Commons-Pool2实现Grpc客户端连接池