Skip to content

User Guide 0.5.x

liuyangming edited this page Nov 19, 2018 · 2 revisions

一、使用约束

1.1、共同约束

  1. JDK版本:8.0及以上版本;

1.2、使用Spring Cloud的约束

  1. 禁止对Feign/Ribbon/RestTemplate等HTTP请求自行进行封装,但允许拦截;
  2. 禁止使用Spring Cloud的IRule,如有类似需求,可考虑扩展ByteJTA的TransactionRule接口;

1.3、使用Dubbo的约束

  1. 必须且仅可指定一个<dubbo:application name="..." />元素,其name不能为空,且必须唯一;
  2. 必须且仅可指定一个<dubbo:protocol port="..." />元素,其port不能为空,也不能为-1;
  3. 定义dubbo服务提供者时(<dubbo:service />):a、filter必须为bytejta;b、loadbalance必须为bytejta;c 、cluster必须为failfast;d、retries必须为0;e、group必须为x-bytejta;
  4. 定义dubbo服务消费者时(<dubbo:reference />):a、filter必须为bytejta;b、loadbalance必须为bytejta;c 、cluster必须为failfast;d、retries必须为0;e、group必须为x-bytejta;

二、配置ByteJTA

2.1、引入ByteJTA配置

2.1.1、Spring Cloud引入ByteJTA配置
@Import(SpringCloudConfiguration.class)
2.1.2、Dubbo引入ByteJTA配置
@Import(DubboSupportConfiguration.class)

2.2、配置数据源

@Bean("primaryXADataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public XADataSource mysqlXA2() {
    return DataSourceSpiBuilder.create().build();
}

@Bean("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource mysql2(@Autowired @Qualifier("primaryXADataSource") XADataSource xaDataSourceInstance) {
    return DataSourceCciBuilder.create(xaDataSourceInstance).build();
}

注意:对于每一个数据源,需要配置两个数据源对象:一个XADataSource、一个DataSource。业务系统最终使用的是DataSource,如本例中的primaryDataSource。

三、ByteJTA对dubbo集群的支持

在某个事务T内,consumer端应用app1首次向provider端应用app2(集群环境)发起请求时,ByteJTA使用random负载均衡策略将其随机分发到一个app2实例(如inst2);后续app1在该事务T内再次向app2发起请求时,将始终落在inst2(即首次请求的处理实例)上。

四、ByteJTA对Spring Cloud的其他支持

4.1、对Context Path的支持

当服务提供方应用使用了Context Path时,服务消费方需要在配置中体现,如:

org:
  bytesoft:
    bytejta:
      contextpath:
        springcloud-sample-provider: /sample-provider

上述配置将告知ByteJTA,应用springcloud-sample-provider使用的context-path为/sample-provider。

4.2、对IRule的支持

ByteJTA默认通过org.bytesoft.bytejta.supports.springcloud.rule.TransactionRuleImpl来提供路由决策。如果业务系统希望对Rule进行扩展,可以考虑通过org.bytesoft.bytejta.NFTransactionRuleClassName配置向ByteJTA注册自己的Rule实现。例如,

org:
  bytesoft:
    bytejta:
      NFTransactionRuleClassName: xxx.RuleImpl

注意:xxx.RuleImpl需要实现org.bytesoft.bytejta.supports.springcloud.rule.TransactionRule接口。