Skip to content

User Guide 0.4.x

liuyangming edited this page Dec 15, 2017 · 5 revisions

一、使用约束

1.1、共同约束

  1. JDK版本:7.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;本约束与ByteJTA采用的负载均衡分发粒度相关,当使用ByteJTA按请求粒度负载均衡时可忽略该约束
  3. 定义dubbo服务提供者时(<dubbo:service />):a、filter必须为transaction;b、loadbalance必须为transaction;c 、cluster必须为failfast;d、retries必须为0;e、group必须为org.bytesoft.bytejta;
  4. 定义dubbo服务消费者时(<dubbo:reference />):a、filter必须为transaction;b、loadbalance必须为transaction;c 、cluster必须为failfast;d、retries必须为0;e、group必须为org.bytesoft.bytejta;

二、配置ByteJTA

2.1、引入ByteJTA配置

2.1.1、Spring Cloud引入ByteJTA配置
@ImportResource({ "classpath:bytejta-supports-springcloud.xml" })
2.1.2、Dubbo引入ByteJTA配置
<import resource="classpath:bytejta-supports-dubbo.xml" />
2.2.2、配置扫描的应用包名
2.2.1、Spring Cloud配置扫描的应用包名
@SpringBootApplication(scanBasePackages = "com.yourcompany.service...")
2.2.2、Dubbo配置扫描的应用包名
<context:component-scan base-package="com.yourcompany.service..." />

2.3、配置数据源

2.3.1、Spring Cloud配置数据源
	@Bean(name = "dataSource")
	public DataSource getDataSource(@Autowired XADataSource xaDataSource, @Autowired TransactionManager transactionManager) {
		BasicManagedDataSource bds = new BasicManagedDataSource();
		bds.setXaDataSourceInstance(xaDataSource);
		bds.setTransactionManager(transactionManager);

		bds.setMaxTotal(50);
		bds.setInitialSize(20);
		bds.setMaxWaitMillis(60000);
		bds.setMinIdle(6);
		bds.setLogAbandoned(true);
		bds.setRemoveAbandonedOnBorrow(true);
		bds.setRemoveAbandonedOnMaintenance(true);
		bds.setRemoveAbandonedTimeout(1800);
		bds.setTestWhileIdle(true);
		bds.setTestOnBorrow(false);
		bds.setTestOnReturn(false);
		bds.setValidationQuery("select 'x' ");
		bds.setValidationQueryTimeout(1);
		bds.setTimeBetweenEvictionRunsMillis(30000);
		bds.setNumTestsPerEvictionRun(20);
		return bds;
	}

	@Bean
	public XADataSource wrapDataSource() {
		MysqlXADataSource xaDataSource = new MysqlXADataSource();
		xaDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/inst01");
		xaDataSource.setUser("root");
		xaDataSource.setPassword("123456");

		XADataSourceImpl wrapDataSource = new XADataSourceImpl();
		wrapDataSource.setXaDataSource(xaDataSource);
		return wrapDataSource;
	}
2.3.2、Dubbo配置数据源
	<bean id="dontUseThisDataSourceDirectly_1" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/inst01" />
		<property name="user" value="root" />
		<property name="password" value="123456" />
	</bean>
	<bean id="dontUseThisDataSourceDirectly_2" class="org.bytesoft.bytejta.supports.jdbc.XADataSourceImpl">
		<property name="xaDataSource" ref="dontUseThisDataSourceDirectly_1" />
	</bean>
	<bean id="dataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource">
		<property name="transactionManager" ref="transactionManager" />
		<property name="xaDataSourceInstance" ref="dontUseThisDataSourceDirectly_2" />
		<!-- ...... -->
	</bean>

注意:不要直接使用本例中定义的dontUseThisDataSourceDirectly_1和dontUseThisDataSourceDirectly_2这两个数据源,而应该使用dataSource数据源。

三、ByteJTA对dubbo集群的支持

ByteJTA计划对负载均衡的支持粒度,可分为两种:a、按事务进行负载均衡;b、按请求进行负载均衡。

3.1、按事务进行负载均衡

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

注意
1)ByteJTA 0.4.x版本默认支持“按事务进行负载均衡”的特性。

3.2、按请求进行负载均衡

consumer端应用app1向provider端应用app2(集群环境)发起请求时,ByteJTA始终按业务系统指定的负载均衡策略将请求分发到一个app2实例。

注意
1)ByteJTA 0.4.x版本暂不提供“按请求进行负载均衡”的特性,如果您希望使用该特性,请联系[email protected]

四、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接口。