springcloud分布式事務LCN實現


1  LCN介紹

利用事務管理器,統一協調各個本地事務,實現事務的一致性。

 

特性:

1、一致性,通過TxManager協調控制與事務補償機制確保數據一致性

2、易用性,僅需要在業務方法上添加@TxTransaction注解即可

3、高可用,項目模塊不僅可高可用部署,事務協調器也可集群化部署

4、擴展性,支持各種RPC框架擴展,支持通訊協議與事務模式擴展

 

官方文檔:https://www.txlcn.org/zh-cn/docs/preface.html

源碼參考:https://gitee.com/wangliang1991/tx-lcn/tree/4.1.0/

 

2  tx-manager資源管理器改造

下載資源管理器代碼 tx-manager,進行改造,可自行調整注冊中心和redis集成等。

修改配置application.properties

調整端口、注冊中心配置,redis配置

tx-manager.zip

3  分布式事務集成使用

3.1 微服務service-1改造

3.1.1  添加pom依賴配置

<!--分布式事務配置-->
	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>transaction-springcloud</artifactId>
		<version>4.1.0</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>tx-plugins-db</artifactId>
		<version>4.1.0</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<!--分布式事務配置-->

  

3.1.2  添加tx-manger地址配置

新增tx.properties

url=http://127.0.0.1:9000/tx/manager/

3.1.3 添加測試接口

@RestController
	@RequestMapping("/test")
	public class TestController {
		private static Logger LOGGER = LoggerFactory.getLogger(TestController.class);
		@Autowired
		private IDemoService demoService;
		@PostMapping(value = "/save", produces = "application/json;charset=utf-8")
		@ResponseBody
		public int save(){
			return demoService.save();
		}
	}

  

public interface IDemoService {
    List<Test> list();
    int save();
}

  

@Service
	public class DemoServiceImpl implements IDemoService /*,ITxTransaction*/ {
		@Autowired
		private ITestDao testDao;
		private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
		@Override
		public List<Test> list() {
			return testDao.findAll();
		}
		/**
     *  @TxTransaction(isStart = false) //true:事務發起方 false: 事務參與方 ,默認為參與方
     *   參與方添加注解@TxTransaction或者實現接口ITxTransaction效果一樣。
     * @return
     */
    @Override
    @TxTransaction
    @Transactional
	public int save() {
			int rs1 = testDao.save("test-service-2");
			return rs1;
		}
	}

  

@Mapper
	public interface ITestDao {
		@Select("SELECT * FROM t_test")
		List<Test> findAll();
		@Insert("INSERT INTO t_test(name) VALUES(#{name})")
		int save(@Param("name") String name);
	}

  

3.2  微服務service-2改造

 

3.2.1  添加pom依賴配置

<!--分布式事務配置-->
	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>transaction-springcloud</artifactId>
		<version>4.1.0</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>tx-plugins-db</artifactId>
		<version>4.1.0</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<!--分布式事務配置-->

  

3.2.2  添加tx-manger地址配置

新增tx.properties

url=http://127.0.0.1:9000/tx/manager/

 

3.2.3 添加測試接口

@RestController
	@RequestMapping("/test")
	public class TestController {
		private static Logger LOGGER = LoggerFactory.getLogger(TestController.class);
		@Autowired
		private IDemoService demoService;
		@PostMapping(value = "/save", produces = "application/json;charset=utf-8")
		@ResponseBody
		public int save(){
			return demoService.save();
		}
	}

  

public interface IDemoService {
    List<Test> list();
    int save();
    }

  

@Service
	public class DemoServiceImpl implements IDemoService {
		@Autowired
		private ServiceFeignClient serviceFeignClient;
		@Autowired
		private ITestDao testDao;
		private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
		@Override
		public List<Test> list() {
			return testDao.findAll();
		}

		@Override
		@TxTransaction(isStart = true) //true:事務發起方 false:事務參與方
		@Transactional
		public int save() {
			int rs1 = testDao.save("test-service-2");
			int rs2 = serviceFeignClient.save();
			int v = 100/0;
			return rs1+rs2;
		}
	}

  

@Mapper
	public interface ITestDao {
		@Select("SELECT * FROM t_test")
		List<Test> findAll();
		@Insert("INSERT INTO t_test(name) VALUES(#{name})")
		int save(@Param("name") String name);
	}

  

3.2.4 添加feign配置

  @FeignClient(name = "service-1")
	public interface ServiceFeignClient {
		@PostMapping(value = "/test/save")
		@ResponseBody
		int save();
	}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM