分布式事务TX-LCN课题实验手册(二)

上一篇文章,我们构建了分布式事务管理器,从本文开始,我们将构建业务服务。

新建订单项目

在 IDEA 或 Eclipse 中构建一个简单的 maven 项目,
groupId: cn.com.hohistar.cloud
artifactId: tx-client-order

然后用以下的内容替换掉项目中原来的 pom.xml 中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cn.com.hohistar.cloud</groupId>
<artifactId>tx-client-order</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

新建启动类

package: cn.com.hohistar.cloud.order
class: TxOrderApplication

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootApplication
public class TxOrderApplication {

public static void main(String[] args) {

SpringApplication.run(TxOrderApplication.class, args);
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}

新建Model

package: cn.com.hohistar.cloud.order.model
class: OrderMaster

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class OrderMaster {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

@NotNull
private String product;

private Double amount;

private Integer allCount;
}

数据访问接口

package: cn.com.hohistar.cloud.order.repository
interface: OrderMasterRepos

代码:

1
2
3
4
@Repository
public interface OrderMasterRepos extends JpaRepository<OrderMaster, Integer> {

}

服务访问客户端

package: cn.com.hohistar.cloud.order.client
class: AccountHistoryClient

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class AccountHistoryClient {

@Autowired
private RestTemplate restTemplate;

public String handleOrder(OrderMaster order) {

StringBuffer buf = new StringBuffer("http://localhost:8083/handleOrder?");
buf.append("prod=").append(order.getProduct());
buf.append("&orderId=").append(order.getId());
buf.append("&count=").append(order.getAllCount());

String res = restTemplate.getForObject(buf.toString(), String.class);

return res;
}
}

class: StoreMasterClient

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class StoreMasterClient {

@Autowired
private RestTemplate restTemplate;

public String handleOrder(OrderMaster order) {

StringBuffer buf = new StringBuffer("http://localhost:8082/handleOrder?");
buf.append("prod=").append(order.getProduct());
buf.append("&orderId=").append(order.getId());
buf.append("&count=").append(order.getAllCount());

String res = restTemplate.getForObject(buf.toString(), String.class);

return res;
}
}

业务类:

package: cn.com.hohistar.cloud.order.biz
class: OrderMasterBiz

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Service
public class OrderMasterBiz {

@Autowired
private OrderMasterRepos orderRepos;

@Autowired
private StoreMasterClient storeMasterClient;

@Autowired
private AccountHistoryClient accountHistoryClient;

@LcnTransaction
@Transactional
public void confimOrder(String prod, Double amount, Integer allCount) {

OrderMaster order = new OrderMaster();
order.setProduct(prod);
order.setAmount(amount);
order.setAllCount(allCount);

orderRepos.save(order);

accountHistoryClient.handleOrder(order);

storeMasterClient.handleOrder(order);

}
}

Api接口类

package: cn.com.hohistar.cloud.order.api
class: OrderMasterApi

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class OrderMasterApi {

@Autowired
private OrderMasterBiz orderBiz;

@GetMapping("/confirm")
public String confirmOrder(@RequestParam("prod") String prod) {

orderBiz.confimOrder(prod, 20.0, 100);

return "ok";
}

}

配置文件

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server:
port: 8081

logging:
level:
com.example.demo: DEBUG


spring:
application:
name: cloud-order-service
datasource:
driverClassName: org.h2.Driver
url: jdbc:h2:./hohistar-order
username: sa
password:
jpa:
database: H2
generate-ddl: true
show-sql: true
hibernate:
ddl-auto: create-drop
h2:
console:
enabled: true
path: /api/h2
settings:
web-allow-others: true

下一步

下一篇文章

本文标题:分布式事务TX-LCN课题实验手册(二)

文章作者:Morning Star

发布时间:2019年12月02日 - 22:12

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/microservice/spring-cloud/springcloud-tx-lcn-practise-manual-02/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。