springcloud + nacos + lcn 使用

吴书松
吴书松
发布于 2025-05-20 / 11 阅读
0
0

springcloud + nacos + lcn 使用

github 地址:https://github.com/codingapi/tx-lcn/releases

TM部署

1、源码部署

下载源码::https://github.com/codingapi/tx-lcn/releases

或者到阿里云盘中下载

修改数据库、redis配置:如上图

注意:

server.port=7970 # tm管理端端口

tx-lcn.manager.host=127.0.0.1 # tm 客户端tc连接IP

tx-lcn.manager.port=8070 # tm 客户端tc连接端口

tx-lcn.manager.adminKey=jm123456. # tm管理端密码

直接运行main启动即可

注意,在数据库中,需要创建默认表

-- auto-generated definition
create table t_tx_exception
(
    id                bigint auto_increment
        primary key,
    group_id          varchar(64)   null,
    unit_id           varchar(32)   null,
    mod_id            varchar(128)  null,
    transaction_state tinyint       null,
    registrar         tinyint       null,
    remark            varchar(4096) null,
    ex_state          tinyint       null comment '0 未解决 1已解决',
    create_time       datetime      null
)
    row_format = DYNAMIC;

2、自己搭建springboot 启动

1、创建一个空的springboot项目

2、pom引入依赖

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

        <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>

3、修改配置文件

#服务名
spring.application.name=tx-manager
#端口
server.port=7970

#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.40:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

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

#redis配置
spring.redis.host=192.168.1.111
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=2

#开启日志
tx-lcn.logger.enabled=true

#TxManager Host IP
tx-lcn.manager.host=127.0.0.1
#TxClient 连接请求端口
tx-lcn.manager.port=8070
tx-lcn.manager.adminKey=jm123456.

4、启动项目即可

注意,在数据库中,需要创建默认表

-- auto-generated definition
create table t_tx_exception
(
    id                bigint auto_increment
        primary key,
    group_id          varchar(64)   null,
    unit_id           varchar(32)   null,
    mod_id            varchar(128)  null,
    transaction_state tinyint       null,
    registrar         tinyint       null,
    remark            varchar(4096) null,
    ex_state          tinyint       null comment '0 未解决 1已解决',
    create_time       datetime      null
)
    row_format = DYNAMIC;

3、访问TM后台

TC集成,连接TM

1、引入依赖

在自己的项目中引入TC依赖

jsqlparser 和mybatis的分页插件有冲突,需要排除

slf4j 需要排除,与自带的logback冲突

        <!-- tx-lcn  -->
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>com.github.jsqlparser</groupId>
                    <artifactId>jsqlparser</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2、修改配置

tx-lcn:
  client:
    manager-address: 127.0.0.1:8070 # TM的IP:TM客户端连接端口
  logger:
    enabled: false # 关闭日志

3、编写测试业务接口

package com.xxxxx.iotd.controller;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.codingapi.txlcn.tc.annotation.LcnTransaction;
import com.xxxxx.common.core.constant.SecurityConstants;
import com.xxxxx.common.core.exception.BusinessException;
import com.xxxxx.common.core.util.R;
import com.xxxxx.common.security.annotation.Inner;
import com.xxxxx.iotd.api.feign.RemoteIotdService;
import com.xxxxx.iotd.finance.entity.IotdOrderEntity;
import com.xxxxx.iotd.finance.mapper.IotdOrderMapper;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/test")
@Tag(description = "test" , name = "短信相关" )
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class TestController {

    private final IotdOrderMapper iotdOrderMapper;
    
    //Feign接口
    private final RemoteIotdService remoteIotdService;


    @LcnTransaction
    @Inner
    @GetMapping(value = "/test1")
    public R<String> test1(@RequestParam(value = "p1")String p1,@RequestParam(value = "p2")String p2){
        iotdOrderMapper.update(new IotdOrderEntity(), new LambdaUpdateWrapper<IotdOrderEntity>()
                .eq(IotdOrderEntity::getOrderCode,"D1914190876176928768R1")
                .set(IotdOrderEntity::getOrderRemarks,p2)
        );

        return R.ok();
    }


    @LcnTransaction
    @Inner(value = false)
    @GetMapping(value = "/test2")
    public R<String> test2(@RequestParam(value = "p1")String p1,@RequestParam(value = "p2")String p2){
        iotdOrderMapper.update(new IotdOrderEntity(), new LambdaUpdateWrapper<IotdOrderEntity>()
                .eq(IotdOrderEntity::getOrderCode,p1)
                .set(IotdOrderEntity::getOrderRemarks,p2)
        );

        R<String> stringR = remoteIotdService.test1(p1, p2 + "_test2"
        , SecurityConstants.FROM_IN);
        System.out.println(JSONObject.toJSONString(stringR));
        if(!stringR.isSuccess()){
            throw new BusinessException(stringR.getMsg());
        }

        //模拟异常
        if(p2.equals("22222")){
            throw new BusinessException("业务自定义异常");
        }

        return R.ok();
    }

}

Feign远程接口

package com.xxxxx.iotd.api.feign;

import com.xxxxx.common.core.constant.SecurityConstants;
import com.xxxxx.common.core.util.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(contextId = "remoteIotdService", value = "jm-cloud-iotd-biz")
public interface RemoteIotdService {


    @GetMapping(value = "/test/test1")
    R<String> test1(@RequestParam(value = "p1")String p1, @RequestParam(value = "p2")String p2,
                    @RequestHeader(SecurityConstants.FROM) String from);

}

4、启动项目 项目整体

5、测试

1、正常测试

2、异常测试,数据回滚:p1=22222 就会触发模拟异常

数据库数据也没有更新


评论