一、创建eureka注册中心

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-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文件

  1. server.port=8761
  2.  
  3. #禁止将自己注册到注册中心
  4. eureka.client.register-with-eureka=false
  5. eureka.instance.hostname=localhost
  6. eureka.client.fetch-registry=false
  7. eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
  8. eureka.server.enable-self-preservation=false
  9. spring.cloud.config.discovery.enabled=true

c、在启动类上加上@EnableEurekaServer注解

  1. @SpringBootApplication
  2. @EnableEurekaServer
  3. public class SpringcloudEurekaApplication {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringcloudEurekaApplication.class, args);
  7. }
  8.  
  9. }

d、启动该服务

二、创建微服务A

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. <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文件

  1. spring.application.name=springcloud-aservice
  2. server.port=8080
  3.  
  4. eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  5.  
  6. #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  8. spring.datasource.username=root
  9. spring.datasource.password=123456
  10. spring.datasource.url=jdbc:mysql://localhost:3306/yzh?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  11.  
  12. #################jpa配置####################
  13. spring.jpa.database=mysql
  14. spring.jpa.show-sql=true
  15. spring.jpa.hibernate.ddl-auto=update
  16. spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

c、在启动类上添加@EnableEurekaClient注解

d、创建entity

  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

  1. public interface OrderDao extends JpaRepository<Orders,Integer> {
  2. }

f、创建service

  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

  1. @RestController
  2. public class OrdersController {
  3.  
  4. @Autowired
  5. private OrderService orderService;
  6.  
  7. @RequestMapping("/addOrders")
  8. public Object addOrders(){
  9. return orderService.addOrder();
  10. }
  11. }

三、创建微服务B

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文件

  1. spring.application.name=springcloud-bservice
  2. server.port=8081
  3.  
  4. eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  5.  
  6. #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  8. spring.datasource.username=root
  9. spring.datasource.password=123456
  10. spring.datasource.url=jdbc:mysql://localhost:3306/yzh?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  11.  
  12. #################jpa配置####################
  13. spring.jpa.database=mysql
  14. spring.jpa.show-sql=true
  15. spring.jpa.hibernate.ddl-auto=update
  16. 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

  1. public interface TbInventoryDao extends JpaRepository<TbInventory,Integer> {
  2. }

f、创建service

  1. @Service
  2. public class TbInventoryService {
  3.  
  4. @Autowired
  5. private TbInventoryDao tbInventoryDao;
  6.  
  7. @Transactional
  8. public TbInventory updateInventory(Integer itemId,Integer itemNum){
  9. TbInventory tbInventory = new TbInventory();
  10. tbInventory.setItemId(itemId);
  11. tbInventory.setItemnum(itemNum);
  12. TbInventory save = tbInventoryDao.save(tbInventory);
  13. System.err.println(1/0);
  14. return save;
  15.  
  16. }
  17. }

g、创建web

  1. @RestController
  2. public class TbInventoryController {
  3.  
  4. @Autowired
  5. private TbInventoryService tbInventoryService;
  6.  
  7. @GetMapping("updateInventory")
  8. public Object updateInventory(@RequestParam Integer itemId, @RequestParam Integer itemNum){
  9. return tbInventoryService.updateInventory(itemId,itemNum);
  10. }
  11. }

四、引入LCN

a、下载地址:https://github.com/codingapi/tx-lcn/releases

(此处下载的是版本5.0.2.RELEASE)

b、将项目txlcn-tm导入idea,并修改properties文件

  1. spring.application.name=tx-manager
  2. server.port=7970
  3.  
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
  6. spring.datasource.username=root
  7. spring.datasource.password=root
  8.  
  9. mybatis.configuration.map-underscore-to-camel-case=true
  10. mybatis.configuration.use-generated-keys=true
  11.  
  12. #tx-lcn.logger.enabled=true
  13. # TxManager Host Ip
  14. #tx-lcn.manager.host=127.0.0.1
  15. # TxClient连接请求端口
  16. #tx-lcn.manager.port=8070
  17. # 心跳检测时间(ms)
  18. #tx-lcn.manager.heart-time=15000
  19. # 分布式事务执行总时间
  20. #tx-lcn.manager.dtx-time=30000
  21. #参数延迟删除时间单位ms
  22. #tx-lcn.message.netty.attr-delay-time=10000
  23. #tx-lcn.manager.concurrent-level=128
  24. # 开启日志
  25. #tx-lcn.logger.enabled=true
  26. #logging.level.com.codingapi=debug
  27. #redis 主机
  28. #spring.redis.host=127.0.0.1
  29. #redis 端口
  30. #spring.redis.port=6379
  31. #redis 密码
  32. #spring.redis.password=
    • # 给出信息都是默认值
      关于详细配置说明见TM配置

    • application.properties 加载顺序如下:
      0、命令行启动参数指定
      1、file:./config/(当前jar目录下的config目录)
      2、file:./(当前jar目录)
      3、classpath:/config/(classpath下的config目录)
      4、classpath:/(classpath根目录)
      发布的二进制可执行Jar包含一个默认配置文件(也就是4),可按需要覆盖默认配置

c、创建MySQL数据库, 名称为: tx-manager、然后创建数据表

  1. CREATE TABLE `t_tx_exception` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  4. `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  5. `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  6. `transaction_state` tinyint(4) NULL DEFAULT NULL,
  7. `registrar` tinyint(4) NULL DEFAULT NULL,
  8. `remark` varchar(4096) NULL DEFAULT NULL,
  9. `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决',
  10. `create_time` datetime(0) NULL DEFAULT NULL,
  11. PRIMARY KEY (`id`) USING BTREE
  12. ) 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中

  1. 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、调用服务

springcloud整合分布式事务LCN的更多相关文章

  1. SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

    项目依赖 SpringBoot 2.5.5 SpringCloud 2020.0.4 Alibaba Spring Cloud 2021.1 Mybatis Plus 3.4.0 Seata 1.4. ...

  2. 微服务架构 - SpringCloud整合分布式服务跟踪zipkin

    1.zipkin zipkin是Twitter的一个开源项目,它基于Google Dapper实现.我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询 ...

  3. LCN分布式事务管理(一)

    前言 好久没写东西了,9月份换了份工作,一上来就忙的要死.根本没时间学东西,好在新公司的新项目里面遇到了之前没遇到过的难题.那遇到难题就要想办法解决咯,一个请求,调用两个服务,同时操作更新两个数据库. ...

  4. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...

  5. fescar分布式事务(概览)

    1. fescar分布式事务(概览) 1.1. 概述   Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1.2 ...

  6. SpringCloud系列——TX-LCN分布式事务管理

    前言 SpringCloud分布式架构给我们带来开发上的便利,同时增加了我们对事务管理的难度,微服务的遍地开花,本地事务已经无法满足分布式的要求,由此分布式事务问题诞生. 分布式事务被称为世界性的难题 ...

  7. 【分布式事务】spring cloud集成lcn解决分布式事务

    参考地址:https://blog.csdn.net/u010882691/article/details/82256587 参考地址:https://blog.csdn.net/oyh1203/ar ...

  8. SpringCloud 分布式事务解决方案

    目录 TX-LCN分布式事务框架 TX-LCN分布式事务框架 随着互联化的蔓延,各种项目都逐渐向分布式服务做转换.如今微服务已经普遍存在,本地事务已经无法满足分布式的要求,由此分布式事务问题诞生. 分 ...

  9. springCloud分布式事务实战(一)案例需求及实现步骤

    本文不对分布式事务原理进行探索,而是通过一个案例来说明如何使用分布式事务 案例需求:创建2个基于springCloud的微服务,分别访问不同的数据库:然后创建一个整合服务,调用微服务实现数据的保存到2 ...

随机推荐

  1. [原创] Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍

    Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍 函数原型:HWND HtmlHelpA( HWND hwndCaller, LPCSTR pszFile, UINT uCo ...

  2. python之路----操作系统的发展史

    阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...

  3. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 I. Reversion Count (java大数)

    Description: There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1 ...

  4. BZOJ 3879: SvT 虚树 + 后缀自动机

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  5. MainActivity.java 文件

    主函数 package myapplication21.lum.com.mycanvas; import android.support.v7.app.AppCompatActivity;import ...

  6. 电脑如何连接windows server服务器

    第一步:win+r 启动‘运行’,输入mstsc 第二步:连接远程桌面,输入服务器ip 第三步,输入账户密码,登陆即可. 注释:mstsc,全称 Microsoft Telnet Screen Con ...

  7. LintCode之移动零

    题目描述: 分析:由于要使非零元素保持原数组的顺序,我只能想出在找到一个0时,逐个移动数组元素使得后一个元素覆盖前一个元素,再将这个0移到后头去. 我的代码: public class Solutio ...

  8. 代理池抓取基础版-(python协程)--抓取网站(西刺-后期会持续更新)

    # coding = utf- __autor__ = 'litao' import urllib.request import urllib.request import urllib.error ...

  9. 手动修改key 伪修改内存变量

    # -*- coding: UTF-8 -*- import math import random import sys import threading import time from time ...

  10. CSS-父元素宽度自适应子元素宽度之和

    最近碰见这样一个需求,要让图片横向排列设置 x 方向的滚动条滚动查看,原本当直接创建一个 IFC(inline,float 什么的)就解决了,搞了半天发现搞不定(IFC 也是不能父元素宽度自适应子元素 ...