public static RpcControllerFactory instantiate(Configuration configuration) {
    String rpcControllerFactoryClazz =
      configuration.get(CUSTOM_CONTROLLER_CONF_KEY, RpcControllerFactory.class.getName());
    try {
      return ReflectionUtils.instantiateWithCustomCtor(rpcControllerFactoryClazz,
        new Class[] { Configuration.class }, new Object[] { configuration });
    } catch (UnsupportedOperationException | NoClassDefFoundError ex) {
      // HBASE-14960: In case the RPCController is in a non-HBase jar (Phoenix), but the application
      // is a pure HBase application, we want to fallback to the default one.
      String msg = "Cannot load configured \"" + CUSTOM_CONTROLLER_CONF_KEY + "\" ("
        + rpcControllerFactoryClazz + ") from hbase-site.xml, falling back to use "
        + "default RpcControllerFactory";
      if (LOG.isDebugEnabled()) {
        LOG.warn(msg, ex); // if DEBUG enabled, we want the exception, but still log in WARN level
      } else {
        LOG.warn(msg);
      }
      return new RpcControllerFactory(configuration);
    }
  }
Custom RPC Controller factory allows frameworks to change the RPC controller. If the configured
controller cannot be found in the classpath or loaded, we fall back to the default RPC
controller factory.
hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcControllerFactory.java