springcloud分散式事務處理 LCN

NeverSayCode發表於2019-02-28

一、目前使用的是Tx-LCN處理分散式事務。
二、TX-LCN官網http://www.txlcn.org/zh-cn/index.html,需要詳細資料的可以去查閱。一直在更新。
三、準備環境,windows10+springboot2.0.*以上+springcloud+eureka+redis3.2+mysql5.6+feign
四、我的Mysql 和redis都是用的阿里雲的伺服器上,你們可以根據你們自己的需求配置。
五、準備上號上面的環境以後,就開始搭建Tx-Manager了,搭建步驟如下:
1.先新建一個springboot模組
2.在pom檔案中新增maven依賴:

<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-tm</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

3.在啟動類上新增註解
@EnableTransactionManagerServer

@SpringBootApplication
@EnableTransactionManagerServer
public class TransactionManagerApplication {

  public static void main(String[] args) {
      SpringApplication.run(TransactionManagerApplication.class, args);
  }

}

4.填寫配置
填寫配置前,先在mysql上建立一個資料庫,名稱為: tx-manager
建立資料表:

CREATE TABLE `t_tx_exception`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `transaction_state` tinyint(4) NULL DEFAULT NULL,
  `registrar` tinyint(4) NULL DEFAULT NULL,
  `remark` varchar(4096) NULL DEFAULT  NULL,
  `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解決 1已解決',
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

根據你自己環境配置,主要是資料庫地址和註冊中心的地址

spring.application.name=tx-manager
server.port=7970

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
#指定註冊中心地址
eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.instance.prefer-ip-address=true

mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true

# TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
# TxClient連線請求埠
tx-lcn.manager.port=8070
# 心跳檢測時間(ms)
tx-lcn.manager.heart-time=15000
# 分散式事務執行總時間
tx-lcn.manager.dtx-time=30000
#引數延遲刪除時間單位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128
# 開啟日誌
tx-lcn.logger.enabled=true
logging.level.com.codingapi=debug
#redis 主機
spring.redis.host=127.0.0.1
#redis 埠
spring.redis.port=6379
#redis 密碼
spring.redis.password=

5.到此你的tm已經配置完成了,啟動這個服務,開啟瀏覽器訪問http://localhost:7970/admin/index.html#/login
你可以看到tx-manager的後臺管理,類似註冊中心那種,可以看到你有哪些服務需要做事務處理的。登入的預設密碼為codingapi
已註冊的TC就是你要做事務的客服端,這裡稱為tc-client
已註冊的TC就是你要做事務的客服端,這裡稱為tc-client
六、配置tc-client
就是你要做事務的哪些微服務
在你要做事務處理的每一個tc-client中新增如下maven依賴

<dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

然後在啟動類上加入註解
@EnableDistributedTransaction

@SpringBootApplication
@EnableDistributedTransaction
public class DemoAApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoDubboClientApplication.class, args);
    }

}

然後在你需要做的事務事務的方法上加入註解@LcnTransaction //分散式事務註解
比如:這裡兩個服務,A服務給B服務轉錢,A服務減一百,B服務加一百。這個處理就需要做事務處理了,以保證資料的一致性。
那在A服務Service層上加入註解@LcnTransaction,A的服務層去呼叫B服務,在B服務中的service成也需要加上@LcnTransaction註解。
在你處理的整個業務的時候,如果需要事務處理,那你就得在再涉及到你這個業務所有服務的所對應的處理的service層加上註解。
最後說一下,在每一個tc-client配置檔案中需要制定tx-manager的地址,因為我用的是預設配置,所以沒有寫。若有修改tx-manager 在tc-client中新增如下配置
預設之配置為TM的本機預設埠
tx-lcn.client.manager-address=127.0.0.1:8070
七、在github寫了一個demo 感興趣的朋友可以去看看;github地址:https://github.com/shenyuewang/springcloud-lcn
第一次寫CSDN有做的不好的,希望各位大佬指出,也希望各位小夥伴多多來交流

相關文章