Transacciones distribuidas -Seata

ASIENTO


  • Directorio artículo

1. ¿Qué es de SEAT?

De SEAT es un soluciones de transacción distribuida de fuentes abiertas, proporcionando un alto rendimiento y la facilidad de uso de los servicios de transacción distribuida. De SEAT proporcionará a los usuarios un AT, TCC, SAGA y XA
modo de transacción, para los usuarios para crear una solución única para distribuida. arquitectura de servicios de micro con las soluciones de transacciones distribuidas de alto rendimiento y fácil de usar

2. Historia del desarrollo

servicio de hormigas Oro:

  • Xts: Extended Transaction Service. Las hormigas equipo vestido de middleware de oro desde 2007 para desarrollar un middleware de transacción distribuida, el middleware es ampliamente utilizado en los servicios de hormigas juego del oro para abordar el problema de la coherencia de los datos entre las bases de datos y servicios.

  • DTX: Distributed Transacción expansión. Desde 2013, XTS tiene que DTX nombres publicados en el vestido de la nube hormigas oro.

Ali Baba:

  • TXC: Alibaba equipo de middleware desde 2014 para iniciar el proyecto, con el fin de resolver los problemas causados ​​por una arquitectura de aplicación de transacciones distribuidas de un solo servicio a cambio de micro causado

  • GTS: Global Transaction Services. Txc como un nuevo nombre de productos de middleware GTS Ali nube puestos en libertad en 2016

  • Fescar: a partir de 2019 comenzamos un proyecto de código abierto basado Fescar TXC / GTS con el fin de trabajar en estrecha colaboración con la comunidad en el futuro

  • De SEAT: simple y arquitectura escalable transacción autónoma. Las hormigas se unieron vestido de oro Fescar, lo que es una comunidad de comercio distribuido más neutral y abierta, mientras que Fescar sido renombrada de SEAT

servicio de transacción distribuida-Micro 3. en cuestión

Escena convencional sola aplicación - de compras proveedor de electricidad. Su actividad consiste en tres módulos (inventario, pedidos y de la cuenta), estos tres módulos usando la fuente de datos local respectiva.

En ocurre el curso del negocio, la transacción local para garantizar la consistencia de datos.

arquitectura de micro-servicios ha cambiado. Los tres módulos antes mencionados están diseñados en las tres fuentes diferentes de tres servicios (modo: base de datos para cada servicio). Los asuntos locales asegura naturalmente consistencia de los datos para cada servicio.

4. de SEAT cómo resolver las transacciones distribuidas?

4.1 Principios de diseño de SEAT para resolver la transacción distribuida:

4.2 Cómo definir una transacción distribuida:

Las transacciones distribuidas son las transacciones globales de un grupo que consiste en rama asuntos, esa transacción rama es una transacción local.

4.3 de SEAT Hay tres componentes básicos:

  • Coordinador de transacciones (TC): Mantenimiento y asuntos globales rama del estado, campaña mundial confirmación o retrotracción.
  • Administrador de transacciones (TM): la definición de un ámbito de transacción global: Comienzo de la transacción global, la transacción global se ha comprometido o retrotraído.
  • Administrador de recursos (RM): asuntos de recursos rama Administración, TC comunicarse con registrar y reportar la rama rama de transacción de los asuntos estatales,

4.4 gestión de SEAT de transacciones distribuidas de ciclo de vida media:

  • TM TC necesario para iniciar una nueva transacción global. TC genera una transacción global XID.

  • XID propagación micro llamando servicios de cadena.

  • RM se registrará como un XID transacción local a la rama apropiada del TC transacción global.

  • TM reclamo TC correspondiente transacción global confirmar o deshacer el XID.

  • TC transacción conducir todas las ramas en el XID respectiva transacción global a confirmar o deshacer la ramificación.

5. SpringCloud integrada de SEAT

dirección de referencia fuente github

5.1 ejecución de SEAT

5.1.1 Descarga de SEAT https://github.com/seata/seata/releases

5.1.2 perfil de SEAT

configuración del servidor de SEAT están en la carpeta de archivos conf, dentro de esa carpeta hay dos archivos que tenemos que ser descrito en detalle a continuación.

de archivo por defecto del servidor de SEAT (papeles) para almacenar los registros de transacciones, ejecute la información de la transacción, que puede ser especificado por los parámetros de script db forma -m, en la actualidad sólo es compatible con archivos, tanto db.

file.conf

El archivo de configuración se utiliza para el modo de almacenamiento, información de la transacción NIO información de transmisión transparente, la configuración del archivo registry.conf archivo de modo por defecto correspondiente.

registry.conf

archivo de configuración del servidor central de SEAT, se puede configurar el servicio a través del archivo de registro, lea el modo de configuración.

Regístrate actualmente soporta el modo de archivo, nacos, Eureka, Redis, ZK, cónsul, etcd3, sofá, etc., de archivos por defecto, la información de registro de una manera correspondiente a file.conf lectura.

Lee la información de configuración del modo de archivo de soporte, nacos, apolo, ZK, cónsul, etcd3 etc., archivo predeterminado, leer el archivo de configuración correspondiente en file.conf.

5.1.3 Ejecución de SEAT

entorno windows

seata-server.bat -p 8091 -m file

entorno Linux

sh seata-server.sh -p 8091 -m file                       #以前台运行方式运行seata

nohup sh seata-server.sh -p 8091 -h 127.0.0.1 -m file &> seata.log &            #以后台方运行式启动seata

-host número de host -h especifica vinculante, el valor predeterminado 0.0.0.0

-puerto -p Especifica el número de puerto de escucha, por defecto 8091

-storeMOde de almacenamiento de registros -m (archivo, db), el archivo predeterminado

5.2 inicialización de secuencia de comandos SQL

# Account
DROP SCHEMA IF EXISTS db_account;
CREATE SCHEMA db_account;
USE db_account;

CREATE TABLE `account_tbl`
(
    `id`      INT(11) NOT NULL AUTO_INCREMENT,
    `user_id` VARCHAR(255) DEFAULT NULL,
    `money`   INT(11)      DEFAULT 0,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

INSERT INTO account_tbl (id, user_id, money)
VALUES (1, '1001', 10000);
INSERT INTO account_tbl (id, user_id, money)
VALUES (2, '1002', 10000);

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

# Order
DROP SCHEMA IF EXISTS db_order;
CREATE SCHEMA db_order;
USE db_order;

CREATE TABLE `order_tbl`
(
    `id`             INT(11) NOT NULL AUTO_INCREMENT,
    `user_id`        VARCHAR(255) DEFAULT NULL,
    `commodity_code` VARCHAR(255) DEFAULT NULL,
    `count`          INT(11)      DEFAULT '0',
    `money`          INT(11)      DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

# Storage
DROP SCHEMA IF EXISTS db_storage;
CREATE SCHEMA db_storage;
USE db_storage;

CREATE TABLE `storage_tbl`
(
    `id`             INT(11) NOT NULL AUTO_INCREMENT,
    `commodity_code` VARCHAR(255) DEFAULT NULL,
    `count`          INT(11)      DEFAULT '0',
    PRIMARY KEY (`id`),
    UNIQUE KEY `commodity_code` (`commodity_code`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;


INSERT INTO storage_tbl (id, commodity_code, count)
VALUES (1, '2001', 1000);

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

5.3 Estructura del proyecto

  • servicio de orden de preparación de servie
  • servicios comerciales, servicios empresariales
  • Para órdenes de servicio Servicio
  • Servicios de almacenamiento de servicio

5.4 introdujo Maven dependiente

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

5.5 archivos de configuración

file.conf de service.vgroup_mapping configuración deben ser coherentes y spring.application.name
en org.springframework.cloud:spring-cloud-starter-alibaba-seata clase org.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration, se usará el valor por defecto $ {} spring.application.name -fescar reparada o grupo nombre registrado como un servicio al servidor de SEAT, y si inconsistencias en la configuración file.conf, le pedirá ningún servidor disponible a un error de conexión

Es posible, pero debe estar configurado spring.cloud.alibaba.seata.tx-servicio-grupo consistente modificado la configuración y el sufijo file.conf

application.properties

spring.application.name=account-service
server.port=8083
spring.datasource.url=jdbc:mysql://localhost:3306/db_account?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
spring.cloud.alibaba.seata.tx-service-group=my_group

file.conf

service {
  vgroupMapping.my_group = "account-service"
  account-service.grouplist = "127.0.0.1:8091"
  enableDegrade = false
  disableGlobalTransaction = false
}

5.6 iniciar el proyecto, se muestra a continuación probar arranque con éxito

5.7 Prueba:

No hay error se ha enviado correctamente:

curl http://127.0.0.1:8084/purchase/commit

Después de la finalización de la base de datos se puede ver en account_tbl la identificación es el dinero 1 se reducirá 5, order_tbl añadirá un registro, identificación storage_tbl para la reducción del campo de recuento de 1 1

transacción anormal se revierte:

curl http://127.0.0.1:8084/purchase/rollback

En esta cuenta de servicio se produce una excepción, se produce una reversión, los datos en la base de datos no cambia hasta después de la finalización de una operación de deshacer éxito

6. SpringCloud integrado de SEAT + Nacos

dirección de referencia fuente github

6.1 funcionamiento de SEAT

6.1.1 Editar el archivo de configuración conf / registry.conf

Nota: No SERVERADDR con 'http: //' prefijo

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    serverAddr = "114.55.34.44"
    namespace = ""
    cluster = "default"
  }
}
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"
  nacos {
    serverAddr = "114.55.34.44"
    namespace = ""
    cluster = "default"
  }
}

6.1.2 Editar la configuración del archivo de configuración / nacos-config.txt (de SEAT-servicio-1.1.0 versión única o menos)

service.vgroup_mapping. y la en r - s mi r v yo C mi - sol r en la pag = re mi F una en l t , en entre de {Su-servicio-gruop} = por defecto, intermedia {su-servicio-gruop} propio nombre para la definición del grupo de servicios, Application.properties servicio de archivo de configuración en el nombre del grupo de servicios.

Hay dos servicios demo, y son de almacenamiento de servicio de pedidos de servicio, por lo que la configuración es la siguiente:

service.vgroup_mapping.storage-service-group=default
service.vgroup_mapping.order-service-group=default

Inicialización de SEAT de configuración nacos:

cd conf
sh nacos-config.sh 114.55.34.44  #114.55.34.44为nacos的服务器地址

de SEAT-servicio-1.1.0 versión añade la configuración manual de Nacos en:

service.vgroupMapping.storage-service-group=default
service.vgroupMapping.order-service-group=default

Comience de SEAT-servicio:

cd bin
sh seata-server.sh -p 8091 -m file

Después de una pantalla de puesta en marcha exitosa de la siguiente manera:

secuencia de comandos SQL 6.1.3 inicialización

-- 创建 order库、业务表、undo_log表
create database seata_order;
use seata_order;

DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;


-- 创建 storage库、业务表、undo_log表
create database seata_storage;
use seata_storage;

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;

-- 初始化库存模拟数据
INSERT INTO seata_storage.storage_tbl (id, commodity_code, count) VALUES (1, 'product-1', 9999999);
INSERT INTO seata_storage.storage_tbl (id, commodity_code, count) VALUES (2, 'product-2', 0);

6.1.4 introdujo Maven dependiente

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</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>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- nacos -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>0.2.1.RELEASE</version>
</dependency>

<!-- seata-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-seata</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>1.1.0</version>
</dependency>

<!-- mysql -->
<dependency>
    <groupId>com.work</groupId>
    <artifactId>base-framework-mysql-support</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

6.1.5 Perfil registy.conf

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    serverAddr = "114.55.34.44"
    namespace = ""
    cluster = "default"
  }
}
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"
  nacos {
    serverAddr = "114.55.34.44"
    namespace = ""
    cluster = "default"
  }
}

6.1.6 Perfil application.properties

Para el servicio

spring.application.name=order-service
server.port=9091

# Nacos 注册中心地址
spring.cloud.nacos.discovery.server-addr = 114.55.34.44:8848

# seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
spring.cloud.alibaba.seata.tx-service-group=order-service-group
logging.level.io.seata = debug

# 数据源配置
spring.datasource.druid.url=jdbc:mysql://114.55.34.44:3306/seata_order?allowMultiQueries=true
spring.datasource.druid.driverClassName=com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=root

almacenamiento de servicio

spring.application.name=storage-service
server.port=9092

# Nacos 注册中心地址
spring.cloud.nacos.discovery.server-addr = 114.55.34.44:8848

# seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
spring.cloud.alibaba.seata.tx-service-group=storage-service-group
logging.level.io.seata = debug

# 数据源配置
spring.datasource.druid.url=jdbc:mysql://114.55.34.44:3306/seata_storage?allowMultiQueries=true
spring.datasource.druid.driverClassName=com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=root

6.1.7 Elementos de inicio

6.1.8 Pruebas

transacción distribuida es exitosa, los pedidos normales de simular, hebilla de inventario

curl localhost:9091/order/placeOrder/commit

transacción distribuida falla, el éxito solo analógico, inventario hebilla de fracaso, y de vuelta en última instancia laminado al mismo tiempo,

curl localhost:9091/order/placeOrder/rollback

Más centros de registro y marco integrado, documentación de referencia

Publicado 11 artículos originales · ganado elogios 2 · Vistas 431

Supongo que te gusta

Origin blog.csdn.net/qq_41112063/article/details/105314104
Recomendado
Clasificación