a、pom文件java
1 <properties>
2 <java.version>1.8</java.version>
3 <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
4 </properties>
5
6 <dependencies>
7 <dependency>
8 <groupId>org.springframework.boot</groupId>
9 <artifactId>spring-boot-starter-web</artifactId>
10 </dependency>
11 <dependency>
12 <groupId>org.springframework.cloud</groupId>
13 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
14 </dependency>
15
16 <dependency>
17 <groupId>org.springframework.boot</groupId>
18 <artifactId>spring-boot-starter-test</artifactId>
19 <scope>test</scope>
20 </dependency>
21 </dependencies>
22
23 <dependencyManagement>
24 <dependencies>
25 <dependency>
26 <groupId>org.springframework.cloud</groupId>
27 <artifactId>spring-cloud-dependencies</artifactId>
28 <version>${spring-cloud.version}</version>
29 <type>pom</type>
30 <scope>import</scope>
31 </dependency>
32 </dependencies>
33 </dependencyManagement>
b、properties文件mysql
server.port=8761
#禁止將本身註冊到註冊中心
eureka.client.register-with-eureka=false
eureka.instance.hostname=localhost
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.enable-self-preservation=false
spring.cloud.config.discovery.enabled=true
c、在啓動類上加上@EnableEurekaServer註解git
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaApplication.class, args);
}
}
d、啓動該服務github
a、pom文件web
1 <properties>
2 <java.version>1.8</java.version>
3 <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
4 </properties>
5
6 <dependencies>
7 <dependency>
8 <groupId>org.springframework.boot</groupId>
9 <artifactId>spring-boot-starter-data-jpa</artifactId>
10 </dependency>
11 <dependency>
12 <groupId>org.springframework.boot</groupId>
13 <artifactId>spring-boot-starter-web</artifactId>
14 </dependency>
15 <dependency>
16 <groupId>org.springframework.cloud</groupId>
17 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
18 </dependency>
19
20 <dependency>
21 <groupId>mysql</groupId>
22 <artifactId>mysql-connector-java</artifactId>
23 <scope>runtime</scope>
24 </dependency>
25 <dependency>
26 <groupId>org.springframework.boot</groupId>
27 <artifactId>spring-boot-starter-test</artifactId>
28 <scope>test</scope>
29 </dependency>
30 <dependency>
31 <groupId>com.alibaba</groupId>
32 <artifactId>druid</artifactId>
33 <version>1.0.9</version>
34 </dependency>
35 <dependency>
36 <groupId>org.springframework.cloud</groupId>
37 <artifactId>spring-cloud-starter-openfeign</artifactId>
38 </dependency>
39 </dependencies>
b、properties文件redis
spring.application.name=springcloud-aservice
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/yzh?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
#################jpa配置####################
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
c、在啓動類上添加@EnableEurekaClient註解spring
d、建立entitysql
1 @Entity
2 public class Orders implements Serializable{
3
4 private static final long serialVersionUID = 3295617400035010415L;
5
6 @Id
7 @GeneratedValue(strategy = GenerationType.IDENTITY)
8 private Integer orderId;
9
10 private Integer itemId;
11
12 private Integer price;
13
14 public Integer getOrderId() {
15 return orderId;
16 }
17
18 public void setOrderId(Integer orderId) {
19 this.orderId = orderId;
20 }
21
22 public Integer getItemId() {
23 return itemId;
24 }
25
26 public void setItemId(Integer itemId) {
27 this.itemId = itemId;
28 }
29
30 public Integer getPrice() {
31 return price;
32 }
33
34 public void setPrice(Integer price) {
35 this.price = price;
36 }
37 }
e、建立dao數據庫
public interface OrderDao extends JpaRepository<Orders,Integer> {
}
f、建立serviceapi
1 @Service
2 public class OrderService {
3
4 @Autowired
5 private OrderDao orderDao;
6 @Autowired
7 private InventoryService inventoryService;
8
9 @Transactional
10 public Orders addOrder(){
11 Orders orders = new Orders();
12 orders.setItemId(100);
13 orders.setPrice(2000);
14
15 Orders save = orderDao.save(orders);
16
17 inventoryService.updateInventory(100,9);
18
19 return save;
20 }
21 }
g、建立feign調用
1 @FeignClient(value = "springcloud-bservice",fallback = InventoryServiceFallback.class)
2 public interface InventoryService {
3
4 @GetMapping(value = "updateInventory")
5 Object updateInventory(@RequestParam(value = "itemId") Integer itemId,@RequestParam(value = "itemNum") Integer itemNum);
6
7 }
8
9 //回調類
10 public class InventoryServiceFallback implements InventoryService{
11 @Override
12 public Object updateInventory(Integer itemId, Integer itemNum) {
13 return 0;
14 }
15 }
h、在啓動類上添加@EnableFeignClients註解
i、建立web
@RestController
public class OrdersController {
@Autowired
private OrderService orderService;
@RequestMapping("/addOrders")
public Object addOrders(){
return orderService.addOrder();
}
}
a、pom文件
1 <properties>
2 <java.version>1.8</java.version>
3 <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
4 </properties>
5
6 <dependencies>
7 <dependency>
8 <groupId>org.springframework.boot</groupId>
9 <artifactId>spring-boot-starter-data-jpa</artifactId>
10 </dependency>
11 <dependency>
12 <groupId>org.springframework.boot</groupId>
13 <artifactId>spring-boot-starter-web</artifactId>
14 </dependency>
15 <dependency>
16 <groupId>org.springframework.cloud</groupId>
17 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
18 </dependency>
19
20 <dependency>
21 <groupId>mysql</groupId>
22 <artifactId>mysql-connector-java</artifactId>
23 <scope>runtime</scope>
24 </dependency>
25 <dependency>
26 <groupId>org.springframework.boot</groupId>
27 <artifactId>spring-boot-starter-test</artifactId>
28 <scope>test</scope>
29 </dependency>
30 </dependencies>
b、properties文件
spring.application.name=springcloud-bservice
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/yzh?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
#################jpa配置####################
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
c、在啓動類上添加@EnableEurekaClient註解
d、建立entity
1 @Entity
2 @Table(name = "tb_inventory")
3 public class TbInventory implements Serializable{
4 private static final long serialVersionUID = 4171468306443543867L;
5
6 @Id
7 @GeneratedValue(strategy = GenerationType.IDENTITY)
8 private Integer inventoryId;
9
10 private Integer itemId;
11
12 private Integer itemnum;
13
14 public Integer getInventoryId() {
15 return inventoryId;
16 }
17
18 public void setInventoryId(Integer inventoryId) {
19 this.inventoryId = inventoryId;
20 }
21
22 public Integer getItemId() {
23 return itemId;
24 }
25
26 public void setItemId(Integer itemId) {
27 this.itemId = itemId;
28 }
29
30 public Integer getItemnum() {
31 return itemnum;
32 }
33
34 public void setItemnum(Integer itemnum) {
35 this.itemnum = itemnum;
36 }
37 }
e、建立dao
public interface TbInventoryDao extends JpaRepository<TbInventory,Integer> {
}
f、建立service
1 @Service
2 public class TbInventoryService {
3
4 @Autowired
5 private TbInventoryDao tbInventoryDao;
6
7
8 @Transactional
9 public TbInventory updateInventory(Integer itemId,Integer itemNum){
10 TbInventory tbInventory = new TbInventory();
11 tbInventory.setItemId(itemId);
12 tbInventory.setItemnum(itemNum);
13 TbInventory save = tbInventoryDao.save(tbInventory);
14 System.err.println(1/0);
15 return save;
16
17 }
18 }
g、建立web
@RestController
public class TbInventoryController {
@Autowired
private TbInventoryService tbInventoryService;
@GetMapping("updateInventory")
public Object updateInventory(@RequestParam Integer itemId, @RequestParam Integer itemNum){
return tbInventoryService.updateInventory(itemId,itemNum);
}
}
a、下載地址:https://github.com/codingapi/tx-lcn/releases
(此處下載的是版本5.0.2.RELEASE)
b、將項目txlcn-tm導入idea,並修改properties文件
spring.application.name=tx-manager
server.port=7970
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true
#tx-lcn.logger.enabled=true
# TxManager Host Ip
#tx-lcn.manager.host=127.0.0.1
# TxClient鏈接請求端口
#tx-lcn.manager.port=8070
# 心跳檢測時間(ms)
#tx-lcn.manager.heart-time=15000
# 分佈式事務執行總時間
#tx-lcn.manager.dtx-time=30000
#參數延遲刪除時間單位ms
#tx-lcn.message.netty.attr-delay-time=10000
#tx-lcn.manager.concurrent-level=128
# 開啓日誌
#tx-lcn.logger.enabled=true
#logging.level.com.codingapi=debug
#redis 主機
#spring.redis.host=127.0.0.1
#redis 端口
#spring.redis.port=6379
#redis 密碼
#spring.redis.password=
# 給出信息都是默認值
關於詳細配置說明見TM配置
application.properties 加載順序以下:
0、命令行啓動參數指定
一、file:./config/(當前jar目錄下的config目錄)
二、file:./(當前jar目錄)
三、classpath:/config/(classpath下的config目錄)
四、classpath:/(classpath根目錄)
發佈的二進制可執行Jar包含一個默認配置文件(也就是4),可按須要覆蓋默認配置
c、建立MySQL數據庫, 名稱爲: tx-manager、而後建立數據表
CREATE TABLE `t_tx_exception` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`transaction_state` tinyint(4) NULL DEFAULT NULL,
`registrar` tinyint(4) NULL DEFAULT NULL,
`remark` varchar(4096) NULL DEFAULT NULL,
`ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解決 1已解決',
`create_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
d、將項目改形成springcloud項目,並註冊到eureka中
1 <properties>
2 <java.version>1.8</java.version>
3 <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
4 <spring-boot.version>2.1.7.RELEASE</spring-boot.version>
5 </properties>
6
7 <dependency>
8 <groupId>org.springframework.boot</groupId>
9 <artifactId>spring-boot-starter-data-redis</artifactId>
10 <version>${spring-boot.version}</version>
11 </dependency>
12
13 <dependency>
14 <groupId>org.springframework.boot</groupId>
15 <artifactId>spring-boot-starter-mail</artifactId>
16 <version>${spring-boot.version}</version>
17 </dependency>
18 <dependency>
19 <groupId>org.springframework.boot</groupId>
20 <artifactId>spring-boot-starter-data-jpa</artifactId>
21 <version>${spring-boot.version}</version>
22 </dependency>
23 <dependency>
24 <groupId>org.springframework.cloud</groupId>
25 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
26 </dependency>
注意:爲了防止版本衝突須要知道springboot的版本爲2.1.x,而且設置springcloud的版本爲Finchley.RELEASE,還要在properties文件中新增配置:spring.cloud.compatibility-verifier.enabled=false
c、將項目註冊到eureka中
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
d、在啓動類上添加@EnableEurekaClient註解
a、在服務A、B的pom文件中引入座標
1 <dependency>
2 <groupId>com.codingapi.txlcn</groupId>
3 <artifactId>txlcn-tc</artifactId>
4 <version>5.0.2.RELEASE</version>
5 <exclusions>
6 <exclusion>
7 <groupId>org.springframework.boot</groupId>
8 <artifactId>*</artifactId>
9 </exclusion>
10 </exclusions>
11 </dependency>
12
13 <dependency>
14 <groupId>com.codingapi.txlcn</groupId>
15 <artifactId>txlcn-txmsg-netty</artifactId>
16 <version>5.0.2.RELEASE</version>
17 <exclusions>
18 <exclusion>
19 <groupId>org.springframework.boot</groupId>
20 <artifactId>*</artifactId>
21 </exclusion>
22 </exclusions>
23 </dependency>
注意:爲了防止springboot的jar包衝突,須要將裏面關於springboot的全部jar包排除掉。
b、在服務A、B的啓動類上添加註解@EnableDistributedTransaction啓動分佈式事務
c、在服務A中的須要分佈式事務方法上面添加@LcnTransaction,服務B中添加@TxcTransaction註解。
a、依次啓動eureka註冊中心,txlcn-tm,服務A、B
b、調用服務