2016-05-08 12 views
1

私はマルチテナントWebアプリケーションを作成しようとしており、良いチュートリアルhereが見つかりました。これは、新しいテナント(CurrentTenantIdentifierResolverHandlerInterceptorAdapterを拡張するMultiTenancyInterceptor)を見つけるためにMVCを設定する方法、3人の異なるテナントに3つの異なるデータソースを設定する方法、そして実行時にサーバに正しいデータソースを与える方法を説明しますAbstractDataSourceBasedMultiTenantConnectionProviderImplダイナミックデータソースを使用したSpringブートjpaマルチテナント

これは、私が春と冬眠の仕事でどのようにマルチテナントをしているかを理解するのに最適な出発点ですが、これをさらに進めたいと思います。テナントが完全にダイナミックになるようにしたいと思います。私はアプリケーションのために何人のテナントが存在するかを前提にしていません。

これは私が考えたものである:

  • アプリケーションは起動時に(ないクラスパスで、例えばは/ usr /データ/設定)のパスをスキャンするように設定し、様々な下の様々なapplication.propertiesファイルを発見されましたディレクトリ(テナントごとに1つのディレクトリ)テナントA、テナントB、テナントC ...
  • 各application.propertiesについて、Springブートは、そのファイルに基づいてデータソースを作成します(そのファイルは、ブートプロパティspring.datasource.urlのみを持ちます)。 Springクラスなどのように、単一のURLから必要な情報をすべて得ることができるので、SpringBootのプロパティを使用することは素晴らしいことに注意してください。
  • (前のリンクに示すように)私はハッシュマップにその後

をそれらのデータソースの各々を登録する、基本的なマルチテナント構造は既に前述のリンクに記載されている:毎回、エンドユーザが要求を行いますブラウザは、テナントを精緻化し、正しいデータソースを返して、使用するデータベースを探します。

これまでに作成されたことがあれば、誰でも私にいくつかのリソースを教えてもらえますか(これは私が何度も始めたものです)、またはこれを達成するために使用するSpringクラス/誰もが今までにこのようなニーズを持っている場合、私がやってしまったものだ事前

答えて

1

感謝。 これ以上の拡張、またはベストプラクティスの侵害に関するコメントは、大歓迎です。 AbstractDataSourceBasedMultiTenantConnectionProviderImplを拡張

DataSourceProviderは二つの方法

バックアプリケーションのためのデータソースをインスタンス化する通常の方法を用いてばねによってインスタンス化される @Autowired DataSource返し
  • selectAnyDataSourceをオーバーライドしなければなりません。
    • は、テナントのconfigフォルダ
    • のパスを取得するアプリケーションから取得したプロパティを持つDataSourcePropertiesをインスタンス化します:
    • selectDataSource(String tenant)は、次の行います。テナントの設定フォルダにあるプロパティファイル
    • 以前にインスタンス化されたDataSourcePropertiesのフィールドをプロパティとして使用して、DataSourceBuilderを介して新しいデータソースを作成して返します(SpringがデータベースURLから動的にドライバクラス名を取得するので便利です)
    • ここで提供

コード、それを使用して自由に感じる:

String configPath = [...]; // Instantiate your configuration path 
File file = new File(realPath); 
DataSourceProperties dsProp = new DataSourceProperties(); 
Properties properties = new Properties(); 
try { 
    properties.load(new FileInputStream(file)); 
} catch (IOException e) { 
    throw new TenantNotConfiguredException(tenant); // Custom exception 
} 

PropertiesConfigurationFactory<DataSourceProperties> pcf = new PropertiesConfigurationFactory<>(dsProp); 
pcf.setTargetName(DataSourceProperties.PREFIX); 
pcf.setProperties(properties); 

try { 
    dsProp = pcf.getObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

return DataSourceBuilder.create() 
      .url(dsProp.getUrl()) 
      .driverClassName(dsProp.getDriverClassName()) 
      .username(dsProp.getUsername()) 
      .password(dsProp.getPassword()) 
      .build(); 
関連する問題