КИСЛОТНЫЕ свойства
Внедрение распределенных транзакций
Например: распределенная система разделяет систему приложений на несколько сервисов, которые могут быть развернуты независимо. Поэтому для выполнения транзакционных операций требуется удаленное сотрудничество между службами. Транзакции, выполняемые удаленно, осуществляются через сеть. Совместная работа называется распределенными транзакциями. Например, транзакции регистрации пользователей и бонусных баллов, транзакции создания заказов и сокращения запасов, транзакции банковских переводов и т. д. — все это распределенные транзакции.
Из приведенного выше рисунка мы видим, что на самом деле, если речь идет об использовании нескольких источников данных, могут возникнуть проблемы с транзакциями. Конечно, в реальной разработке мы должны стараться избегать возникновения таких проблем. избежать этого невозможно, нам нужно. Чтобы решить эту проблему, в архитектуре нашей микросервисной системы в настоящее время лучшим и наиболее распространенным решением является Seata.
С распространением межсетевых связей различные проекты постепенно переходят на распределенные услуги. В настоящее время микросервисы стали повсеместными, а локальные транзакции больше не могут соответствовать требованиям распределенных транзакций, поэтому возникла проблема распределенных транзакций. Распределенные транзакции известны как всемирная проблема. В настоящее время существуют две основные теоретические основы распределенных транзакций:
Содержание этой теоремы относится к: В распределенной системе Consistency (согласованность), Availability (доступность) и Partitiontolerance (отказоустойчивость разделов) не могут быть достигнуты одновременно.
CAP не может существовать одновременно. Это иллюстрируется следующим примером.
Аннотация: В распределенной системе p неизбежно, поэтому мы можем выбирать только между C и A. При этом условии родилась теория BASE.
BASE — это аббревиатура трех фраз: «Базово доступный», «Мягкое состояние» и «В конечном итоге согласованный». Теория BASE является результатом компромисса между согласованностью и доступностью в CAP. Она основана на обобщении распределенных практик в крупномасштабных интернет-системах и постепенно развивается на основе теоремы CAP. Основная идея теории BASE заключается в следующем: даже если строгая согласованность не может быть достигнута, каждое приложение может использовать соответствующие методы в соответствии со своими бизнес-характеристиками для достижения окончательной согласованности системы.
Тогда мы все еще можем использовать пример, который мы только что использовали, чтобы проиллюстрировать эту позицию.
В основном доступны:гарантировать Основные услугида Можно использоватьиз,Что касается других услуг, время ответа может быть соответствующим образом сокращено.,Даже да понижение уровня обслуживания
Мягкое состояние:житьсуществоватьпромежуточное состояние,Не влияет на общее использование системы,Синхронизация данных задерживается.
Окончательная согласованность:После периода пикового трафика,По истечении некоторого времени синхронизации,Обеспечьте единообразие данных каждой службы.
Seata — это решение для распределенных транзакций с открытым исходным кодом, предназначенное для предоставления высокопроизводительных и простых в использовании услуг распределенных транзакций. Seata предоставит пользователям режимы транзакций AT, TCC, SAGA и XA, чтобы создать универсальное распределенное решение для пользователей.
В нашей микросервисной системе соответствующий бизнес разбит на независимые модули. На официальной схеме архитектуры мы видим, что на данный момент существует три сервиса:
существуют В этой структуре,Пользователи размещают заказы на приобретение товаров для бизнеса,Для завершения требуется три услуги,внутри каждого сервисаизданные一致性Зависит от本地делаПриходитьгарантировать,Но решения проблемы глобальной согласованности данных не существует.,У Seata есть решение этой проблемы.
Документация Seata на китайском языке
https://seata.io/zh-cn/docs/overview/what-is-seata.html
Примечание. Вышеупомянутый TC (Transaction Координатор) – координатор транзакций является сервером Seata-Server.
Seata предлагает четыре различных решения для распределенных транзакций:
Основные понятия:АТ-режимданенавязчивыйиз Распределенные деларешение,существовать АТ-режим Вниз,Пользователям нужно только сосредоточиться на себя из "Business SQL",пользователя из "Business SQL" первым этап,SeataРамочное совещаниеавтоматическийизгенерироватьделаизвторой этап фиксации и отката.
общий механизм
Эволюция протокола двухфазной фиксации:
первый этап:существоватьпервый На этом этапе Seata перехватит «Бизнес-SQL», сначала проанализирует семантику SQL, найдет бизнес-данные, которые необходимо обновить, сохранит «отмену» перед обновлением существующих данных, а затем выполнит «Бизнес-SQL». QL» обновляет данные, снова сохраняет данные «повторно» после обновления и, наконец, генерирует блокировки строк. Эти операции выполняются в локальной базе данных, поэтому создаем первый этапизация.
второй этап:относительнопервый этап,второй Этап относительно простой, отвечает за общий откат и коммит, если он был ранее выполнен Если на этапе произошел сбой локального дела, будет выполнен глобальный откат. В противном случае будет выполнена глобальная фиксация. Если для отката используется «дапервый». этап Записыватьиз“undo Log», сгенерируйте SQL обратного обновления через записи отката и выполните его для завершения отката ветки. Разумеется, после завершения транзакции все ресурсы будут освобождены, а все логи будут удалены.
Иллюстрация
Примечание. Подробное описание использования режима AT см. в главах 5 и 6!
В версии Seata 1.2.0 представлен новый режим транзакций: режим XA для поддержки протокола XA.
Проведем детальный анализ по трем аспектам:
Для начала нам нужно понять, что такое XA?
Спецификация XA была предложена в начале 1990-х годов для решения задач в области распределенной обработки транзакций.
Примечание. Не существует механизма распределенных транзакций, который мог бы идеально адаптироваться ко всем сценариям и удовлетворить все потребности.
Независимо от того, будь то режим AT, режим TCC или режим Saga, предложение этих режимов по существу проистекает из неспособности спецификации XA удовлетворить потребности определенных сценариев.
Спецификация XA — это стандарт распределенной обработки транзакций (DTP, Distributed Transaction Processing), определенный организацией X/Open.
Спецификация XA описывает интерфейс между глобальным менеджером транзакций и локальным менеджером ресурсов. Цель спецификации XA — разрешить доступ к нескольким ресурсам (таким как базы данных, серверы приложений, очереди сообщений и т. д.) в одной транзакции, чтобы свойства ACID оставались действительными для всех приложений.
Спецификация XA использует двухфазную фиксацию (2PC), чтобы гарантировать, что все ресурсы одновременно фиксируют или откатывают любую конкретную транзакцию.
Спецификация XA была предложена в начале 1990-х годов. В настоящее время почти все основные базы данных поддерживают спецификацию XA.
Модель DTP определяет следующие роли:
Объяснение случая:
Болевые точки протокола XA
Если ресурс, участвующий в глобальной транзакции, «потерян» (не может получить команду на завершение транзакции ветки), то данные, которые он блокирует, всегда будут заблокированы. Более того, это может даже привести к тупику.
Это основная проблема протокола XA, а также ключевая проблема, на которой Seata сосредоточится при внедрении режима XA.
Seata определяет структуру глобальных транзакций.
Глобальная транзакция определяется как общая координация нескольких отраслевых транзакций:
Глобальный процесс обработки транзакций Seata разделен на два этапа:
Так называемый режим транзакций Seata относится к режиму поведения транзакций филиалов, выполняемых в рамках глобальной структуры транзакций Seata. Точнее, его следует называть режимом транзакции филиала.
Разница между различными режимами транзакций заключается в том, что транзакции филиалов используют разные методы для достижения целей двух этапов глобальных транзакций. То есть ответьте на следующие два вопроса:
В качестве примера возьмем режим AT:
Режим ХА:
В рамках структуры распределенных транзакций, определенной Seata, модель транзакций использует ресурсы транзакций (базы данных, службы сообщений и т. д.) для поддержки протокола XA и использует механизм протокола XA для управления транзакциями филиалов.
Зачем добавлять режим XA в Seata? Какой смысл поддерживать XA?
По сути, Сиата Уже поддерживается 3 большойделамодель:AT、TCC、Saga Они все компенсаторные. из。
Механизм обработки компенсирующих транзакций построен на ресурсах транзакций (либо на уровне промежуточного программного обеспечения, либо на уровне ресурсов транзакций). сам прав Распределенные делада Нет восприятияиз.
Существует фундаментальная проблема нечувствительности транзакционных ресурсов к распределенным транзакциям: невозможно достичь истинной глобальной согласованности.
Например, в процессе компенсационной транзакции количество записей о запасах сокращается со 100 до 50. В это время администратор склада подключается к базе данных, запрашивает статистическую инвентаризацию и видит текущие 50. Позже, если транзакция будет отменена из-за исключения, запасы будут компенсированы и откачены до 100. Очевидно, что 50 статистических данных, полученных по запросу администратора хранилища, являются грязными данными. Следовательно, существует промежуточное состояние в компенсирующих транзакциях (грязные данные могут быть прочитаны на полпути).
В отличие от компенсации, протокол XA требует, чтобы ресурс транзакции сам обеспечивал поддержку спецификации и протокола.
Поскольку ресурсы транзакций воспринимают распределенный процесс обработки транзакций и участвуют в нем, ресурсы транзакций (такие как базы данных) могут обеспечить эффективную изоляцию доступа к данным с любой точки зрения и обеспечить глобальную согласованность данных.
Например, в только что упомянутом сценарии обновления запасов XA Во время обработки транзакции инвентаризация данных промежуточного состояния 50 Зависит отданные Библиотекасамгарантировать,да Не знаю, как хранить Библиотекаадминистраториз Запросить статистику, чтобы просмотретьиз.
Помимо фундаментальной ценности глобальной согласованности, поддержка XA также имеет следующие преимущества:
получение кода
Официальный пример используется для демонстрации ниже:
официальное дело Внизнагрузкаадрес:https://github.com/seata/seata-samples.git
Здесь редактор сообщает вам адрес загрузки сетевого диска проекта:
Проект инициализации
Проект Seata-XA, в котором расположен корпус XA, показан на рисунке ниже:
Инициализация базы данных
Экспортируйте файл сценария базы данных all_in_one.sql в базу данных и измените соединение с базой данных файла конфигурации проекта application.properties.
Исходные данные:
Начать проект
После изменения файла конфигурации просто запустите указанные выше четыре основные службы соответственно.
тестирование кода
Посетите ссылку:
http://127.0.0.1:8084/purchase
После успешного вызова возвращается SUCCESS.
На данный момент данные следующие:
Примечание. Выше приведен обычный процесс бизнес-обработки. Ниже показана ситуация, когда возникает проблема с распределенной транзакцией и перезапускается служба заказов.
Восстановите данные в таблице в исходное состояние.,позвони еще разhttp://127.0.0.1:8084/purchase
В это время данные в таблице представления не изменяются, то есть вступает в силу приложение режима XA.
Официальное демонстрационное изображение корпуса:
Анализ случая:
Общий механизм работы:
Подвести итог
На современном этапе развития технологий не существует механизма распределенной обработки транзакций, который мог бы идеально удовлетворить потребности всех сценариев.
Ограничения проектирования системы во многих аспектах, таких как согласованность, надежность, простота использования, производительность и т. д., должны удовлетворяться различными механизмами обработки транзакций.
Основная ценность проекта Seata — создание стандартизированной платформы, которая комплексно решает проблемы распределенных транзакций.
На основе Seata архитектура приложений верхнего уровня может гибко выбирать подходящие решения для распределенных транзакций в зависимости от потребностей реальных сценариев.
Добавление режима XA заполняет пробел Seata в сценарии глобальной согласованности, формируя структуру из четырех основных режимов транзакций: AT, TCC, Saga и XA, которые в основном могут удовлетворить требования распределенной обработки транзакций всех сценариев.
Чтобы переключиться в режим XA, вам нужно всего лишь изменить агент источника данных на режим XA.
@Configuration public class StockXADataSourceConfiguration { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource druidDataSource() { return new DruidDataSource(); } @Bean("dataSourceProxy") public DataSource dataSource(DruidDataSource druidDataSource) { // DataSourceProxy for AT mode // return new DataSourceProxy(druidDataSource); // DataSourceProxyXA for XA mode return new DataSourceProxyXA(druidDataSource); } @Bean("jdbcTemplate") public JdbcTemplate jdbcTemplate(DataSource dataSourceProxy) { return new JdbcTemplate(dataSourceProxy); } }
TCC — это протокол двухфазной фиксации в распределенных транзакциях. Его полное название — Try-Confirm-Cancel, что означает резервирование ресурсов (Try), операцию подтверждения (Confirm) и операцию отмены (Cancel). Их конкретное значение следующее:
TCC — это решение с интрузивными распределенными транзакциями. Вышеупомянутые три операции требуют реализации самой бизнес-системы. Это очень вмешательство в бизнес-систему, и ее конструкция относительно сложна. Однако преимущество состоит в том, что TCC вообще не полагается на базу данных. и может осуществлять трансграничные транзакции. Управление базами данных и ресурсами между приложениями реализует атомарную операцию посредством интрузивного кодирования для доступа к этим различным данным, что лучше решает проблемы распределенных транзакций в различных сложных бизнес-сценариях.
Принцип режима Seata TCC такой же, как и в универсальном режиме TCC.
Разница между TCC и AT
AT Узор основан на Поддержка местных ACID дела из реляционная база данных:
соответствующий из,режим ТСС,Не полагается на базовые ресурсы данных, поддержка издела:
так называемый TCC режим относится к поддержке Настроить из филиала дела включен в глобальное управление делаиз.
Функции
Объясните подробно
Ссылка на вариант использования
https://seata.io/zh-cn/blog/integrate-seata-tcc-mode-with-spring-cloud.html
Официальный адрес документа
https://seata.io/zh-cn/docs/user/saga.html
Saga mode даSEATA предлагает решения для долгих дел,существоватьSagaмодельсередина,Каждый участник бизнес-процесса предоставляет локальную информацию,Если участник терпит неудачу, предыдущие успешные участники получают компенсацию.,первый этаптолько КServiceивторой этапCompensation Service (Произошла ошибка при выполнении обработки,Дайте шанс исправиться) все реализовано в рамках развития бизнеса.
Saga Режим распределенных дел обычно состоит из событий, ведущих машинаиз, да асинхронное выполнение между каждым участником, Сага Шаблон да Решение долгих дел.
Ранее мы узнали, что можно использовать все микросервисы, используемые в трех моделях распределенной работы Seata. соответствии сразвивать ВОЗизнуждатьсяруководить Исправлять,Но дасуществовать некоторые особые обстоятельства,Например, старая система,Закрытая система (не подлежит модификации),При этом нет распределенных делпредставлений),Тогда модели AT, XA и TCC будут недоступны.,Чтобы решить эту проблему,Только потом процитировал модель Саги.
Например: Участниками могут быть другие компании, службы или устаревшие системы.,Невозможно трансформироваться,Можно использовать режим Саги.
Saga mode даSeata предлагает решения для долгих дел,предоставилГетерогенная система разработала единую модель обработки。существоватьSagaмодельсередина,Все субпредприятия не участвуют непосредственно в общей обработке дел (несут ответственность только за обработку местных дел),И да, все это реализуется последним вызывающим абонентом.,И существованиеруководить общее время обработки бизнес-логики,существуют Когда есть проблемы с определенным подбизнесом,Тогда автоматическая компенсация прошла в полной мере успешно и другие участники,такпервый этапизтолько К сервис колливторой этапиз Обработка вознаграждения за обслуживание осуществляется в рамках общего развития бизнеса.
В настоящее время режим Saga, предоставляемый Seata, может быть реализован только через механизм конечного автомата.,Разработчики обязаны вручную рисовать бизнес-процесс Saga,И конвертируйте его в файл JsonConfiguration.,Затем существуют, когда программа работает,Обработка бизнес-процессов и оплата услуг будут реализованы на основе документа субконфигурации.,И рисовать руководить Сагадиаграмма происходящимиз,Как правило, это необходимо реализовать через конечный автомат Saga.
Основные принципы:
Для удобства пользователя Seata Saga предоставляет визуальный конструктор конечных автоматов. Код и руководство по эксплуатации см. по адресу:
https://github.com/seata/seata/tree/develop/saga/seata-saga-statemachine-designer
Демонстрационный адрес конструктора государственных автоматов
http://seata.io/saga_designer/index.html
Видеоурок по проектированию конечных автоматов
http://seata.io/saga_designer/vedio.html
АТ-режим,да Мы обычно используем режим обработки,Также да использует большую часть из них.
XAиAT,ненавязчивыйиз,Чтобы переключиться между ними, вам нужно всего лишь изменить источник данных и прокси-объект.
TCC требует от нас вручную: Настроить, попробовать, подтвердить, отменить.
Сагада нацелен на старые проекты,Элементы не могут быть изменены,Решить распределенную проблему при вызове через внешнюю форму,Вся бизнес-логика разработана посредством государственной машины, руководимой в Saga.
Внизнагрузкаадрес:https://seata.io/zh-cn/blog/download.html
Если загрузка идет медленно, редактор поделился ссылкой для скачивания с сетевого диска здесь:
Связь:https://pan.baidu.com/s/1wtUb7tpGGYGoIE_h10kjvQ?pwd=yyds Код извлечения: yyds
Скачать версию издаSeataизseata-server-1.5.2 можно здесь.
После распаковки структура папок следующая:
Изменить файл конфигурации
Расположение файла конфигурации:
seata—>confОглавление—>файл application.yml
Полный файл конфигурации выглядит следующим образом:
server: port: 7091 spring: application: name: seata-server # Конфигурация журнала logging: config: classpath:logback-spring.xml file: path: ${user.home}/logs/seata # Внешний журнал отсутствует, поэтому следующую конфигурацию пока можно игнорировать. extend: logstash-appender: destination: 127.0.0.1:4560 kafka-appender: bootstrap-servers: 127.0.0.1:9092 topic: logback_to_logstash # Недавно добавленная консольная консоль, # Вы можете войти в систему, посетив http://localhost:7091, номер учетной записи выглядит следующим образом: seata/seata. console: user: username: seata password: seata seata: # Seata подключается к центру конфигурации Nacos config: # support: file, nacos, consul, apollo, zk, etcd3 type: nacos nacos: server-addr: 127.0.0.1:8848 namespace: 0fff12f9-61ef-4c65-b48a-70150001c547 group: SEATA_GROUP username: nacos password: nacos ##if use MSE Nacos with auth, mutex with username/password attribute #access-key: "" #secret-key: "" # Seata подключается к центру регистрации сервисов Nacos registry: # support: file, nacos, eureka, redis, zk, consul, etcd3, sofa type: nacos nacos: application: seata-server server-addr: 127.0.0.1:8848 group: SEATA_GROUP namespace: 0fff12f9-61ef-4c65-b48a-70150001c547 cluster: default username: nacos password: nacos ##if use MSE Nacos with auth, mutex with username/password attribute #access-key: "" #secret-key: "" # Здесь нет необходимости настраивать, поскольку конфигурация nacos подключена, следующие конфигурации, связанные с магазином, можно настроить непосредственно через SeataServer.properties. # store: # support: file 、 db 、 redis # mode: db # server: # service-port: 8091 #If not configured, the default is '${server.port} + 1000' security: secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017 tokenValidityInMilliseconds: 1800000 ignore: urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
Примечание. В нижней версии конфигурации есть два файла, а именно реестр.conf и файл.conf.
Например: версия seata-server-1.4.2, подробности о двух вышеупомянутых файлах здесь не будут представлены.
Создайте новую базу данных test_seata и импортируйте изmqsql.sql в каталог распаковки Seata script\server\db в test_seata.
После успешного импорта ситуация выглядит следующим образом:
Нам нужно загрузить Seata из какой-то конфигурации в Nacos.,Конфигурация Более,Итак, чиновник предоставил нам config.txt.,Скачиваем и изменяем параметры,Загрузите в Накос.
Внизнагрузкаадрес:https://github.com/seata/seata/tree/develop/script/config-center
В основном измените следующее содержимое:
-- Модификация 1: Конфигурациядела группировка #Transaction routing rules configuration, only for the client service.vgroupMapping.dev_xxkfz_group=default #If you use a registry, you can ignore it service.default.grouplist=127.0.0.1:8091 -- Модификация 2: Режим хранения конфигурации — БД, информация о подключении к базе данных (из базы данных, инициализированной в версии 4.3) store.mode=db store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/test_seata?useUnicode=true&rewriteBatchedStatements=true store.db.user=xxkfz store.db.password=xxkfz
Примечание: группировка дел: используется для защиты компьютерного зала от отключения электроэнергии.,активировать запасную компьютерную комнату,или Удаленный компьютерный зал,механизм отказоустойчивости,Конечно, если Конфигурация Seata-Server соответствует группировке издела.,Клиенту также необходима Конфигурация той же группировки издела.
Конфигурациядела Группа: service.vgroupMapping.dev_xxkfz_group=default dev_xxkfz_group: должно соответствовать клиенту, пользователи могут Настроить. по умолчанию: должно соответствовать кластеру в клиентском application.yml.
После завершения вышеуказанных изменений поместите файл config.txt в каталог seata:
На данный момент нам нужно добавить эти конфигурации одну за другой в Конфигурацию Nacos.,Итак, нам нужен скрипт для выполнения,Официально предоставлено,Адрес загрузки:
https://github.com/seata/seata/tree/develop/script/config-center/nacos
Загрузите файл сценария изnacos-config.sh и также поместите его в каталог Seata.
Выполните скрипт для импорта:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t пространство имен -u nacos -w nacos
Описание параметра:
-h: хост, значение по умолчанию localhost
-p: порт, значение по умолчанию 8848.
-g: настроить группировку, по умолчанию — SEATA_GROUP.
-t: информация об арендаторе,Соответствует Nacosизпространство nameID,По умолчанию пусто
При этом внимание уделяется:
существуют при выполнении файла-скрипта naocs-config.sh из,По умолчанию он ищет config.txt по пути, а наш путь отличается.,Итак открываем файл naocs-config.sh руководить и вносим в него изменения,В противном случае оно не может быть выполнено.
Найдите соответствующую позицию ниже, измените и сохраните.
До модификации:
После модификации:
В приведенном выше случае редактор выполняет заказ на импорт следующим образом:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 0fff12f9-61ef-4c65-b48a-70150001c547 -u nacos -w nacos
Начните выполнение импорта:
После завершения вышеуказанной конфигурации,Можем запустить nacosиseata-server,На этом этапе мы проверяем центр настройки Nacosiz.,Вы увидите всю информацию о конфигурации, которую мы передали.
Войдите в каталог bin и дважды щелкните, чтобы запустить Seata-server.bat.
После успешного запуска,Доступ через браузерnacosадрес:http://127.0.0.1:8848/nacos/,Затем войдите на страницу списка услуг.,Вы можете видеть, что служба seata-server зарегистрирована на Nacos.
Импортируйте конфигурацию следующим образом:
Seata-сервер зарегистрирован в Nacos:
Пользователь покупает товаризбизнес-логика——>весьбизнес-логика Зависит от3Микросервисы обеспечивают поддержку:
Создайте базу данных xxkfz_test и выполните следующий сценарий, чтобы создать таблицу.
УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ `t_order`; СОЗДАТЬ ТАБЛИЦУ `t_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) ПО УМОЛЧАНИЮ NULL КОММЕНТАРИЙ 'userid', `product_id` bigint(11) ПО УМОЛЧАНИЮ NULL КОММЕНТАРИЙ 'product_id', `count` int(11) DEFAULT NULL COMMENT 'Количество', `money` decimal(11, 0) ПО УМОЛЧАНИЮ NULL COMMENT 'сумма', `status` int(1) DEFAULT NULL COMMENT 'Статус заказа: 0: Создание 1: Завершено', ПЕРВИЧНЫЙ КЛЮЧ (`id`) С ИСПОЛЬЗОВАНИЕМ BTREE ) ENGINE = InnoDB НАБОР СИМВОЛОВ = utf8 COLLATE = utf8_general_ci COMMENT = 'Таблица заказов' ROW_FORMAT = Dynamic; УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ `t_storage`; СОЗДАТЬ ТАБЛИЦУ `t_storage` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `product_id` bigint(11) ПО УМОЛЧАНИЮ NULL КОММЕНТАРИЙ 'product_id', `total` int(11) DEFAULT NULL COMMENT 'Общий инвентарь', `used` int(11) DEFAULT NULL COMMENT 'использованный инвентарь', `residue` int(11) DEFAULT NULL COMMENT 'оставшийся инвентарь', ПЕРВИЧНЫЙ КЛЮЧ (`id`) С ИСПОЛЬЗОВАНИЕМ BTREE ) ENGINE = InnoDB НАБОР СИМВОЛОВ = utf8 COLLATE = utf8_general_ci КОММЕНТАРИЙ = «Инвентаризация» ROW_FORMAT = Dynamic; ВСТАВИТЬ В ЗНАЧЕНИЯ `t_storage` (1, 1, 100, 0, 100); СОЗДАТЬ ТАБЛИЦУ `t_account` ( `id` bigint(11) NOT NULL КОММЕНТАРИЙ 'id', `user_id` bigint(11) ПО УМОЛЧАНИЮ NULL КОММЕНТАРИЙ 'userid', `total` decimal(10, 0) DEFAULT NULL COMMENT 'общая сумма', `used` decimal(10, 0) DEFAULT NULL COMMENT 'использованный баланс', `residue` decimal(10, 0) DEFAULT NULL COMMENT 'оставшаяся доступная квота', ПЕРВИЧНЫЙ КЛЮЧ (`id`) С ИСПОЛЬЗОВАНИЕМ BTREE ) ENGINE = InnoDB НАБОР СИМВОЛОВ = utf8 COLLATE = utf8_general_ci COMMENT = 'Таблица учетных записей' ROW_FORMAT = Dynamic; ВСТАВИТЬ В ЗНАЧЕНИЯ `t_account` (1, 1, 1000, 0, 1000); -- Структура таблицы для undo_log -- Обратите внимание, что в версии 0.3.0+ сюда добавлен уникальный индекс ux_undo_log. ---------------------------- УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ `undo_log`; СОЗДАТЬ ТАБЛИЦУ `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) НЕ НУЛЬ, `xid` varchar(100) НЕ НУЛЬ, `context` varchar(128) НЕ NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) НЕ НУЛЬ, `log_created` дата-время НЕ NULL, `log_modified` дата-время НЕ NULL, ПЕРВИЧНЫЙ КЛЮЧ («id»), УНИКАЛЬНЫЙ КЛЮЧ `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 CHARSET ПО УМОЛЧАНИЮ=utf8;
Базовый проект кода включает в себя три микросервиса:
Основная структура кода следующая:
<dependency> <groupId>com.xxkfz.simplememory</groupId> <artifactId>xxkfz-service-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!-- seata --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.3</version> </dependency> <!-- Драйвер подключения MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Druid пул соединений --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <!-- mybatis plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
Примечание. Следующий файл конфигурации — Services. по учетуиз Конфигурация,Два других похожи,Здесь больше не отображается.
account-service ——> файл application.yml
server: port: 8090 spring: application: name: account-service cloud: nacos: discovery: # Группировка услуг group: SEATA_GROUP server-addr: http://localhost:8848 # требуется пространство именизID namespace: 0fff12f9-61ef-4c65-b48a-70150001c547 datasource: type: com.alibaba.druid.pool.DruidDataSource #Текущий тип операции источника данных driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/xxkfz_test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false #useSSL усиление безопасности username: xxkfz password: xxkfz # MyBatis Плюс конфигурация mybatis-plus: # Конфигурацияmapperiz сканирует и находит все файлы сопоставления изmapper.xml. mapper-locations: classpath*:mapper/**/*.xml #Сканирование объекта, несколько пакетов, разделенных запятыми или точками с запятой typeAliasesPackage: com.xxkfz.simplememory.entity global-config: db-config: id-type: auto configuration: # Включите верблюжий регистр. После его включения, если имена полей базы данных и атрибутов объекта имеют одинаковые буквы, их можно распознать независимо от того, сколько подчеркиваний добавлено в середине. map-underscore-to-camel-case: true # Seata Конфигурация seata: application-id: seata-server # да Нет включения источника данных Beanавтоматический прокси enable-auto-data-source-proxy: false tx-service-group: dev_xxkfz_group # Должен совпадать с конфигурацией сервера. # Должен совпадать с конфигурацией сервера. registry: type: nacos nacos: # Nacos Адрес обслуживания server-addr: http://localhost:8848 group: SEATA_GROUP namespace: 0fff12f9-61ef-4c65-b48a-70150001c547 application: seata-server # Должен совпадать с конфигурацией сервера. username: nacos password: nacos cluster: default config: type: nacos nacos: server-addr: ${spring.cloud.nacos.discovery.server-addr} group: SEATA_GROUP namespace: 0fff12f9-61ef-4c65-b48a-70150001c547 service: vgroup-mapping: tx-service-group: dev_xxkfz_group # Должен совпадать с конфигурацией сервера. disable-global-transaction: false client: rm: # Сообщать ли о статусе успеха report-success-enable: true # Количество повторов report-retry-count: 5
order-service ——> OrderController.java
@GetMapping("/order/create") public R<Order> createOrder(Order order) { orderService.create(order); return new R<>(200, «Заказ успешно создан!», order); }
логика обработки
order-service ——> OrderServiceImpl.java
public void createOrder(Order order) { // Создать заказ baseMapper.createOrder(order); // Инвентаризационные вычеты storageService.decrStorage(order.getProductId(), order.getCount()); log.info("----->Инвентаризационные вычетыCountЗаканчивать"); // Списание со счета accountService.decrAccount(order.getUserId(), order.getMoney()); }
Объявите интерфейсы хранилища и учетной записи.
@FeignClient(value = «служба хранения») общедоступный интерфейс StorageService { /** * вычет инвентаря * * @param идентификатор продукта * @param количество * @возвращаться */ @PostMapping(value = "/хранилище/уменьшение") R decrStorage(@RequestParam("productId") Длинный ProductId, @RequestParam("count") Целочисленное количество); }
@FeignClient(value = "account-service") public interface AccountService { /** * Списание со счета * * @param userId * @param money * @return */ @PostMapping(value = "/account/decrease") R decrAccount(@RequestParam("userId") Long userId, @RequestParam("money") BigDecimal money); }
Текущий пользователь userId = 1 из Счет1000,Запас 100,Имитировать покупку пользователем 1 продукта,Потратить 100,После делового звонка,Статус данных базы данных должен быть следующим:
Проверьте обычный процесс заказа:
Затем используйте аннотацию всех дел Seata @GlobalTransactional для имитации исключений и управления операциями отката.
Операция моделирования:
Модификация кода 1. Добавьте аннотацию @GlobalTransactional в существующий метод Создать заказcreateOrder.
Модификация кода 2. Имитация исключений в службе учетных записей.
Так как Seata требует прокси для источника данных руководить,Добиться распределенного управления делами,Нам нужен источник данных, руководить Конфигурацией. Пример конфигурации выглядит следующим образом:
@Configuration public class DataSourceConfig { @Value("${mybatis-plus.mapper-locations}") private String mapperLocations; @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druidDataSource(){ return new DruidDataSource(); } @Bean @Primary public DataSourceProxy dataSourceProxy(DataSource dataSource) { return new DataSourceProxy(dataSource); } @Bean public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSourceProxy); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(mapperLocations)); sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory()); return sqlSessionFactoryBean.getObject(); } }
Перезапустите три службы соответственно и восстановите исходные данные таблицы базы данных.
Интерфейс доступа:
Обнаружено, что данные таблицы не изменились, а глобальный откат дел прошел успешно.
консоль Seata глобальные дела и ветка дела журнал отката
Отладка точки останова для просмотра сиденья и undo_log данныеизизменять
Точка останова и продолжение спуска,вызвать исключение,,Вставленные данные откатываются,И undo_log очищается,Откат распределенных дел - это нормально.