0序文
マイクロサービスアーキテクチャでは、サブデータベースサブテーブルが一般的な操作です。複数のデータソースの場合、どうすればコードを柔軟に切り替えることができるかが問題になります。今日は、dynamic-datasource-spring-boot-starter
コンポーネントを使用してマルチデータソース構成を実装します
1はじめに
dynamic-datasource-spring-boot-starter
これは、複数のデータソースをすばやく統合するためのスプリングブートベースのスターターです。
環境要件:
jdk 1.7+
springboot 1.4.x或1.5.x或2.x.x
特性:
- マルチデータベース、読み取り/書き込み分離、1つのマスターと複数のスレーブ、またはその他の混合モードに適したデータグループ化をサポートします
- 構成ファイルでアンダースコアで区切られたすべてのデータソースの場合、ヘッダーはグループの名前であり、同じグループ名のデータソースはグループの下で再生されます。たとえば、slave_1とslave_2はスレーブグループの下に配置されます
- メソッドのアノテーションは、クラスのアノテーションよりも優先されます
ENC()
データベース構成情報を暗号化するメソッドの使用をサポートします。
その他の機能については、公式ドキュメントを参照してください
2.使用する
依存関係をインポートする
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2.1マスタースレーブライブラリを構成する
構成ファイルを変更します
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://ip1:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: jdbc:mysql://ip3:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
使用する場合は、メソッドまたはクラスの@DS
アノテーションスイッチを使用してください
次のようにクラスに追加しました@DS("slave")
。つまり、このクラスのメソッドにアクセスすると、データソースグループslaveからデータソースを取得します。上記の構成によれば、slave_1とslave_2の2つのデータソースがあります。次に、負荷に応じてデータソースを使用します。バランス戦略では、同じグループの下のデータソースを選択します。
同時に、メソッドに追加したので、listOrder2
メソッド@DS("slave_1")
にアクセスlistOrder2
するときに、最初にメソッドの@DSアノテーションを識別しslave_1
、データをクエリします。
@DS
アノテーションが1つしかない場合は、デフォルトのデータソースを意味します
@Service
@DS("slave")
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {
@Override
public List<Order> listOrder(){
return this.list();
}
@Override
@DS("slave_1")
public List<Order> listOrder2(){
return this.list();
}
}
2.2読み取り/書き込み分離
dynamic-datasource
読み取りと書き込みの分離を構成することも非常に便利です。次の構成のように、対応する読み取りライブラリと書き込みライブラリを構成するだけで、マスターライブラリマスターに書き込み、スレーブライブラリスレーブに読み取ります。
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://ip1:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: jdbc:mysql://ip3:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
次に、メソッドまたはクラスにマークを付け、書き込まれたメソッドまたはクラスにマークを付け@DS("master")
、読み取りメソッドまたはクラスにマークを付ける必要があります。@DS("slave")
このようにして、読み取りと書き込みの分離が実現されます。もちろん、ここではデータ同期の構成を行っていません。これを実現するために運河などのコンポーネントを使用できます。この章で説明するトピックに属していないため、あまり拡張しません。
@Service
@DS("slave")
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {
@Override
public List<Order> listOrder(){
return this.list();
}
@Override
public Order getByOrderId(Long id){
return this.getById(id);
}
@Override
@DS("master")
public boolean updateOrder(Order order){
return this.update(order);
}
}
2.3複数のデータソース
さまざまなタイプのデータベースを使用する場合は、dynamic-datasource
それらを均一に構成することもできます。これにより、mysql、oracle、sqlserver、postgresql、h2などのデータベースがサポートされます。次のように
datasource:
# 数据源1
db1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@ip:1525:order_test
username: root
password: 123456
# 数据源2
db2:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
dynamic-datasource
使い方はとても簡単で、実際のプロジェクトで体験する必要があるので、この号の内容は終わりです。