Java を使用して Spring Cloud Alibaba に基づく分散トランザクション アプリケーションを開発する方法
概要:
分散トランザクションは分散システム A で処理されます。複数のサブトランザクションがすべて成功するか、すべてロールバックされることを保証するためのメカニズム。マイクロサービス アーキテクチャでは、サービス間の相互呼び出しにより、分散トランザクションが困難な問題になります。 Spring Cloud Alibaba は、Spring Cloud に基づくマイクロサービス開発フレームワークであり、分散トランザクション ソリューションの包括的なセットを提供します。この記事では、Java を使用して Spring Cloud Alibaba に基づく分散トランザクション アプリケーションを開発する方法を紹介し、具体的なコード例を示します。
Spring Cloud Alibaba を分散トランザクション開発に使用する前に、まず対応する依存関係を導入する必要があります。次の依存関係をプロジェクトの pom.xml ファイルに追加します。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
Seata は、Spring Cloud Alibaba の分散トランザクション ソリューションです。 Seata 関連の情報をアプリケーション構成ファイルに構成する必要があります。次の設定を application.properties または application.yml ファイルに追加します。
# 启用Seata的自动代理 spring.cloud.alibaba.seata.tx-service-group=my_tx_group # Seata的注册中心地址 spring.cloud.alibaba.seata.registry.type=consul spring.cloud.alibaba.seata.registry.address=127.0.0.1:8500
次に、単純な分散トランザクションの例の実装を開始します。注文サービスと在庫サービスという 2 つのマイクロサービスがあるとします。注文が作成されると、同時に対応する在庫を差し引く必要があります。分散トランザクションを実装するには、Seata が提供する @GlobalTransactional アノテーションを使用する必要があります。次のアノテーションを注文サービスの注文作成メソッドに追加します:
@GlobalTransactional public void createOrder() { // 扣除库存的逻辑 deductStock(); }
また、@GlobalTransactional アノテーションを在庫サービスの在庫控除メソッドに追加します:
@GlobalTransactional public void deductStock() { // 扣除库存的逻辑 }
上記の例では、分散トランザクションを管理するために Seata を使用しました。しかし実際には、依然として各マイクロサービスにローカル トランザクション ロジックを実装する必要があります。 Seata は複数の分散トランザクション モードをサポートしているため、適切なモードを選択してローカル トランザクションを実装できます。
例の注文サービスと在庫サービスは、JdbcTemplate または MyBatis を使用してデータベースを操作できます。各サービスでローカル トランザクション メソッドを定義し、 @LocalTransactional アノテーションでマークします。
@LocalTransactional public void createOrderTx() { jdbcTemplate.update("INSERT INTO orders (order_id, user_id, amount) VALUES (?, ?, ?)", orderId, userId, amount); } @LocalTransactional public void deductStockTx() { jdbcTemplate.update("UPDATE stock SET amount = amount - ? WHERE id = ?", amount, stockId); }
これで、分散トランザクション アプリケーションをテストできます。テスト コードでは、注文を作成し、注文と在庫のステータスが期待どおりであるかどうかをアサートします。
@Test public void testCreateOrder() { // 创建订单 orderService.createOrder(); // 断言订单状态 Order order = jdbcTemplate.queryForObject("SELECT * FROM orders WHERE order_id = ?", new OrderRowMapper(), orderId); assertNotNull(order); assertEquals(userId, order.getUserId()); assertEquals(amount, order.getAmount()); // 断言库存状态 Stock stock = jdbcTemplate.queryForObject("SELECT * FROM stock WHERE id = ?", new StockRowMapper(), stockId); assertNotNull(stock); assertEquals(originalAmount - amount, stock.getAmount()); }
概要:
この記事では、Spring Cloud Alibaba を使用して開発する方法を紹介します。分散トランザクションベースのアプリケーション。 Seata の依存関係を導入し、各マイクロサービスの主要なメソッドに @GlobalTransactional または @LocalTransactional アノテーションを追加することで、Spring Cloud Alibaba に基づいた信頼性の高い分散トランザクション アプリケーションを構築できます。実際のプロジェクトでは、分散ロックやメッセージ キューなど、より複雑な分散トランザクション シナリオを処理する必要がある場合もあります。この記事が分散トランザクションの理解と使用に少しでも役立つことを願っています。
以上がJava を使用して Spring Cloud に基づく分散トランザクション アプリケーションを開発する方法 Alibabaの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。