Java를 사용하여 Spring Cloud 기반 분산 트랜잭션 애플리케이션을 개발하는 방법 Alibaba
요약:
분산 트랜잭션은 분산 시스템에서 여러 하위 트랜잭션을 처리하는 메커니즘으로, 이러한 하위 트랜잭션이 모두 성공하거나 모두 롤백합니다. 마이크로서비스 아키텍처에서 분산 트랜잭션은 서비스 간의 상호 호출로 인해 어려운 문제가 됩니다. 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
다음으로 간단한 분산 트랜잭션 예제 구현을 시작합니다. 주문 서비스와 재고 서비스라는 두 가지 마이크로서비스가 있다고 가정해 보겠습니다. 주문이 생성되면 동시에 해당 재고를 차감해야 합니다. 분산 트랜잭션을 구현하려면 Seata에서 제공하는 @GlobalTransactional 주석을 사용해야 합니다. 주문 서비스의 주문 생성 메소드에 다음 주석을 추가합니다.
@GlobalTransactional public void createOrder() { // 扣除库存的逻辑 deductStock(); }
또한 재고 서비스의 deduct Inventory 메소드에 @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 중국어 웹사이트의 기타 관련 기사를 참조하세요!