springcloud tx-lcn分布式集群微服务注册中心配置

首先本文是基于tx-lcn5.0.2release基础写的,springboot2.1.8 cloud版本Greenwich.SR3,如果是其他版本,你可以参考下本文,然后做对应的修改。

tx-lcn会在redis中生成两个key,主要的tmmanager的key是这个tm.instances;如果你配置好tm集群可以看到
在这里插入图片描述
一般tc客户端会在配置文件中配置

#是否启动LCN负载均衡策略
tx-lcn.ribbon.loadbalancer.dtx.enabled=true
#-----tx-lcn配置----------
#这个地址其实已经没有用了,但是保留着,防止报错
#已经从redis读取tm信息
tx-lcn.client.manager-address=192.168.1.138:11318,192.168.1.138:11319

但是这样的配置并不灵活,每次要修改配置文件很麻烦。
那我们就直接在redis中读取tm不就行了吗?

首先 建目录 com.codingapi.txlcn.tc.config

建上面目录非常重要!
在该目录中建 TxClientConfig.java

package com.codingapi.txlcn.tc.config;

import com.codingapi.txlcn.common.runner.TxLcnApplicationRunner;
import com.codingapi.txlcn.common.util.ApplicationInformation;
import com.codingapi.txlcn.common.util.id.ModIdProvider;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description: 让tc从redis中读取tm,下面的注解都很重要,不能随便删除,特别是primary
 * @author: MuYi Yang
 * @create: 2020-01-20 13:46
 **/
@Slf4j
@Primary
@ConfigurationProperties(prefix = "tx-lcn.client")
@Component
@Data
public class TxClientConfig {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private static final String REDIS_TM_LIST = "tm.instances";

    public TxClientConfig() {
        this.dtxAspectOrder = 0;
        this.dtxTime = 30 * 1000;
        this.managerAddress = Collections.singletonList("127.0.0.1:8070");
    }

    public List<String> getManagerAddress() {
        List<String> managerAddress = stringRedisTemplate.opsForHash().entries(REDIS_TM_LIST).entrySet().stream()
                .map(entry -> entry.getKey().toString()).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(managerAddress)) {
            throw new RuntimeException("在redis没有找到可用的tx-manager地址");
        }
        if (log.isInfoEnabled()) {
            managerAddress.forEach(b -> {
                log.info("tm集群地址:-------->" + b);
            });
        }
        return managerAddress;
    }


    @Bean
    public ApplicationRunner txLcnApplicationRunner(ApplicationContext applicationContext) {
        return new TxLcnApplicationRunner(applicationContext);
    }

    @Bean
    @ConditionalOnMissingBean
    public ModIdProvider modIdProvider(ConfigurableEnvironment environment,
                                       @Autowired(required = false) ServerProperties serverProperties) {
        return () -> ApplicationInformation.modId(environment, serverProperties);
    }

    /**
     * aspect order
     */
    private Integer dtxAspectOrder;

    /**
     * aspect connection order
     */
    private int resourceOrder;

    /**
     * txManager check heart time (s)
     */
    private int txManagerHeart;
    /**
     * txManager max delay time (s)
     */
    private int txManagerDelay;

    /**
     * manager hosts
     */
    private List<String> managerAddress;

    /**
     * 调用链长度等级
     */
    private int chainLevel = 3;

    /**
     * Distributed Transaction Time
     */
    private long dtxTime;

    private long tmRpcTimeout;

    private long machineId;

    private void setMachineId(long machineId) {
        this.machineId = machineId;
    }

    private void setDtxTime(long dtxTime) {
        this.dtxTime = dtxTime;
    }

    private void setTmRpcTimeout(long timeout) {
        this.tmRpcTimeout = timeout;
    }

    public void applyTmRpcTimeout(long timeout) {
        setTmRpcTimeout(timeout);
    }

    public void applyDtxTime(long dtxTime) {
        setDtxTime(dtxTime);
    }

    public void applyMachineId(long machineId) {
        setMachineId(machineId);
    }
}

OK,顺利工作!不管是客户端挂掉还是服务端挂掉,都会从redis中剔除,放心开始用吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCC-Transaction是一个开源的TCC补偿性分布式事务框架。TCC是Try、Confirm、Cancel的缩写,表示事务的尝试、确认和取消阶段。TCC能够对分布式事务中的各个资源进行分别锁定、提交和释放。它的优点是能够实现严格一致性并且具有较短的执行时间和高实时性要求。同时,TCC也具有一定的缺点,例如对应用的侵入性较强,需要实现每个分支的try、confirm和cancel操作,实现难度较大。 关于Spring Cloud分布式事务和TCC,可以使用TCC-Transaction框架来实现。TCC-Transaction可以作为可靠性事件投递的替代品,并作为Spring Cloud Stream或Spring Cloud Bus的基础组件。此外,TCC还需要在事务管理器(协调器)节点上以高可用集群方式部署,并使用多数派算法来避免集群发生脑裂问题。 在实际应用中,TCC适用于一些需要严格一致性、执行时间短和实时性要求高的场景,例如红包和收付款业务。 更多关于TCC-Transaction框架的详细信息可以在其GitHub地址(https://github.com/changmingxie/tcc-transaction)和项目指南地址(https://github.com/changmingxie/tcc-transaction/wiki/使用指南1.2.x)中找到。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringCloud(6) 分布式事务【概念、常见框架选择 - tx-lcn】](https://blog.csdn.net/qq_38225558/article/details/86103229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Spring Cloud综合实战 - 基于TCC补偿模式的分布式事务](https://blog.csdn.net/Solarison/article/details/68061157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值