首页 技术 正文
技术 2022年11月23日
0 收藏 642 点赞 3,994 浏览 10996 个字

一、创建eureka注册中心

a、pom文件

 <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</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>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

b、properties文件

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注解

@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaApplication { public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaApplication.class, args);
}}

d、启动该服务

二、创建微服务A

a、pom文件

 <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>

b、properties文件

spring.application.name=springcloud-aservice
server.port=8080eureka.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

 @Entity
public class Orders implements Serializable{ private static final long serialVersionUID = 3295617400035010415L; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer orderId; private Integer itemId; private Integer price; public Integer getOrderId() {
return orderId;
} public void setOrderId(Integer orderId) {
this.orderId = orderId;
} public Integer getItemId() {
return itemId;
} public void setItemId(Integer itemId) {
this.itemId = itemId;
} public Integer getPrice() {
return price;
} public void setPrice(Integer price) {
this.price = price;
}
}

e、创建dao

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

f、创建service

 @Service
public class OrderService { @Autowired
private OrderDao orderDao;
@Autowired
private InventoryService inventoryService; @Transactional
public Orders addOrder(){
Orders orders = new Orders();
orders.setItemId(100);
orders.setPrice(2000); Orders save = orderDao.save(orders); inventoryService.updateInventory(100,9); return save;
}
}

g、创建feign调用

 @FeignClient(value = "springcloud-bservice",fallback = InventoryServiceFallback.class)
public interface InventoryService { @GetMapping(value = "updateInventory")
Object updateInventory(@RequestParam(value = "itemId") Integer itemId,@RequestParam(value = "itemNum") Integer itemNum); } //回调类
public class InventoryServiceFallback implements InventoryService{
@Override
public Object updateInventory(Integer itemId, Integer itemNum) {
return 0;
}
}

h、在启动类上添加@EnableFeignClients注解

i、创建web

@RestController
public class OrdersController { @Autowired
private OrderService orderService; @RequestMapping("/addOrders")
public Object addOrders(){
return orderService.addOrder();
}
}

三、创建微服务B

a、pom文件

 <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

b、properties文件

spring.application.name=springcloud-bservice
server.port=8081eureka.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

 @Entity
@Table(name = "tb_inventory")
public class TbInventory implements Serializable{
private static final long serialVersionUID = 4171468306443543867L; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer inventoryId; private Integer itemId; private Integer itemnum; public Integer getInventoryId() {
return inventoryId;
} public void setInventoryId(Integer inventoryId) {
this.inventoryId = inventoryId;
} public Integer getItemId() {
return itemId;
} public void setItemId(Integer itemId) {
this.itemId = itemId;
} public Integer getItemnum() {
return itemnum;
} public void setItemnum(Integer itemnum) {
this.itemnum = itemnum;
}
}

e、创建dao

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

f、创建service

 @Service
public class TbInventoryService { @Autowired
private TbInventoryDao tbInventoryDao; @Transactional
public TbInventory updateInventory(Integer itemId,Integer itemNum){
TbInventory tbInventory = new TbInventory();
tbInventory.setItemId(itemId);
tbInventory.setItemnum(itemNum);
TbInventory save = tbInventoryDao.save(tbInventory);
System.err.println(1/0);
return save; }
}

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);
}
}

四、引入LCN

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

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

springcloud整合分布式事务LCN

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

spring.application.name=tx-manager
server.port=7970spring.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=rootmybatis.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、命令行启动参数指定
      1、file:./config/(当前jar目录下的config目录)
      2、file:./(当前jar目录)
      3、classpath:/config/(classpath下的config目录)
      4、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中

  <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<spring-boot.version>2.1.7.RELEASE</spring-boot.version>
</properties> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</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文件中引入坐标

 <dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>

注意:为了防止springboot的jar包冲突,需要将里面关于springboot的所有jar包排除掉。

b、在服务A、B的启动类上添加注解@EnableDistributedTransaction启动分布式事务

c、在服务A中的需要分布式事务方法上面添加@LcnTransaction,服务B中添加@TxcTransaction注解。

六、启动、测试

a、依次启动eureka注册中心,txlcn-tm,服务A、B

springcloud整合分布式事务LCN

springcloud整合分布式事务LCN

b、调用服务

springcloud整合分布式事务LCN

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,991
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,505
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,766
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844