Docker+nacos+seata1.3.0 のインストールと使用設定チュートリアル

Docker+nacos+seata1.3.0 のインストールと使用設定チュートリアル

これに先立ち、1日かけてやってみました。Seataは使い方が簡単で超シンプルですが、インストールや設定が本当に面倒で、いろいろな落とし穴に遭遇しました。本題に入りましょう。オ(╥﹏╥)オ

1. バージョン

注意:バージョンが一致しないと、さまざまなエラーが発生します。公式サイトに従ってバージョンを合わせることができます。

シータ:1.3.0
alibaba.cloud:2.2.3.リリース
ナコス:2.0.2

2. Dockerのインストールとseataサーバーの構築

2.1 seataイメージをダウンロードする

docker pull seataio/seata-server:1.3.0

2.2 Linux ディレクトリに registry.conf を作成します。私のパスは /data/seate/registry.conf です。以降のすべての作成はこのディレクトリにあります。

cd /データ
mkdir シート
vim レジストリ.conf

2.3 registry.confの内容は次のとおりです。

レジストリ {
  タイプ = "ナコス"
 
  ナコス
    アプリケーション = "seata-server"
    サーバーアドレス = "127.0.0.1:8848"
    グループ = "SEATA_GROUP"
    名前空間 = ""
    クラスター = "デフォルト"
    ユーザー名 = ""
    パスワード = ""
  }
}
 
設定{
  タイプ = "ナコス"
 
  ナコス
    サーバーアドレス = "127.0.0.1:8848"
    名前空間 = ""
    グループ = "SEATA_GROUP"
    ユーザー名 = ""
    パスワード = ""
  }
}

レジストリと設定は同じグループにある必要があることに注意してください。登録センターとして nacos を使用します。nacos のアドレスを変更する必要があることに注意してください。

----->>>ここで文を追加したいと思います。新しいデータベース seata と 3 つの新しいテーブルを作成する必要があります。

-- -------------------------------- storeMode が 'db' の場合に使用されるスクリプト --------------------------------
-- GlobalSessionデータを保存するテーブル
存在しない場合はテーブルを作成 `global_table`
(
    `xid` VARCHAR(128) NOT NULL、
    `transaction_id` BIGINT、
    `status` TINYINT NOT NULL、
    `アプリケーションID` VARCHAR(32)、
    `transaction_service_group` VARCHAR(32)、
    `トランザクション名` VARCHAR(128)、
    `タイムアウト` INT,
    `begin_time` BIGINT、
    `application_data` VARCHAR(2000)、
    `gmt_create` 日付時刻、
    `gmt_modified` 日付時刻、
    主キー (`xid`)、
    キー `idx_gmt_modified_status` (`gmt​​_modified`, `status`),
    キー `idx_transaction_id` (`transaction_id`)
) エンジン = InnoDB
  デフォルト文字セット = utf8;
 
-- BranchSessionデータを保存するテーブル
`branch_table` が存在しない場合はテーブルを作成します
(
    `branch_id` BIGINT NOT NULL、
    `xid` VARCHAR(128) NOT NULL、
    `transaction_id` BIGINT、
    `リソースグループID` VARCHAR(32)、
    `resource_id` VARCHAR(256)、
    `branch_type` VARCHAR(8)、
    `ステータス` TINYINT、
    `client_id` VARCHAR(64)、
    `application_data` VARCHAR(2000)、
    `gmt_create` 日付時刻(6)、
    `gmt_modified` 日付時刻(6)、
    主キー (`branch_id`)、
    キー `idx_xid` (`xid`)
) エンジン = InnoDB
  デフォルト文字セット = utf8;
 
-- ロックデータを保存するテーブル
存在しない場合はテーブルを作成する `lock_table`
(
    `row_key` VARCHAR(128) NOT NULL、
    `xid` VARCHAR(96)、
    `transaction_id` BIGINT、
    `branch_id` BIGINT NOT NULL、
    `resource_id` VARCHAR(256)、
    `テーブル名` VARCHAR(32)、
    `pk` VARCHAR(36)、
    `gmt_create` 日付時刻、
    `gmt_modified` 日付時刻、
    主キー (`row_key`)、
    キー `idx_branch_id` (`branch_id`)
) エンジン = InnoDB
  デフォルト文字セット = utf8;

分散ビジネス データベースを実装するには、各データベースに undo_log テーブルを追加する必要があります。そうしないと、エラーが報告されます。

テーブル `undo_log` を作成します (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `branch_id` bigint(20) NOT NULL COMMENT 'ブランチトランザクションID',
  `xid` varchar(100) NOT NULL COMMENT 'グローバルトランザクションID',
  `context` varchar(128) NOT NULL COMMENT 'undo_logコンテキスト、シリアル化など',
  `rollback_info` longblob NOT NULL COMMENT 'ロールバック情報',
  `log_status` int(11) NOT NULL COMMENT '0:通常状態、1:防御状態',
  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
  主キー (`id`)、
  ユニークキー `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='AT トランザクション モード UNDO テーブル';

2.4 プッシュ設定ファイル vim config.txt を作成し、ファイル内の設定を nacos にプッシュします。

vim config.txt
service.vgroupMapping.btb_tx_group=デフォルト
ストアモード=db
store.db.datasource=ドルイド
ストア.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://172.0.0.1:3306/seata?useUnicode=true
store.db.user=ルート
store.db.password=ルート
ストア.db.minConn=5
ストア.db.maxConn=30
store.db.globalTable=グローバルテーブル
store.db.branchTable=ブランチテーブル
ストア.db.クエリ制限=100
store.db.lockTable=ロックテーブル
ストア.db.maxWait=5000

btb_tx_group はクライアントと一貫性がある必要があることに注意してください。ちなみに、データベース ドライバーに注意してください。8 以上の場合は、私のドライバーを使用してください。5.7 の場合は、com.mysql.jdbc.Driver を使用してください。

2.5 プッシュスクリプトを作成します。実行スクリプトはconfig.txtの次のレイヤーに配置する必要があるため、ディレクトリを追加します。

mkdir sh
cd sh
vim nacos-config.sh

内容は以下のとおりです。変更は行わない方がよいでしょう

#!/usr/bin/env バッシュ
# 著作権 1999-2019 Seata.io グループ。
#
# Apache License バージョン 2.0 (以下「ライセンス」) に基づいてライセンス供与されます。
# ライセンスに従わない限り、このファイルを使用することはできません。
# ライセンスのコピーは以下から入手できます。
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 適用法で義務付けられている場合、または書面で同意されている場合を除き、ソフトウェア
# ライセンスに基づいて配布されるものは「現状有姿」で配布されます。
# 明示的または黙示的を問わず、いかなる種類の保証または条件もありません。
# 権限と使用許諾を規定する具体的な言語についてはライセンスを参照してください。
# ライセンスに基づく制限。
 
getopts ":h:p:g:t:u:w:" が opt されるとき
する
  ケース$opt in
  h)
    ホスト=$OPTARG
    ;;
  p)
    ポート=$OPTARG
    ;;
  グ)
    グループ=$OPTARG
    ;;
  t)
    テナント=$OPTARG
    ;;
  u)
    ユーザー名=$OPTARG
    ;;
  わ)
    パスワード=$OPTARG
    ;;
  ?)
    echo " 使用オプション: $0 [-h ホスト] [-p ポート] [-g グループ] [-t テナント] [-u ユーザー名] [-w パスワード] "
    出口1
    ;;
  エサック
終わり
 
[[ -z ${host} ]]の場合
    ホスト=ローカルホスト
フィ
[[ -z ${port} ]]の場合
    ポート=8848
フィ
[[ -z ${group} ]]の場合
    グループ="SEATA_GROUP"
フィ
[[ -z ${tenant} ]]の場合
    テナント=""
フィ
[[ -z ${username} ]];の場合
    ユーザー名=""
フィ
[[ -z ${password} ]]の場合
    パスワード=""
フィ
 
nacosAddr=$ホスト:$ポート
コンテンツタイプ="コンテンツタイプ:application/json;文字セット=UTF-8"
 
echo "nacosAddr=$nacosAddr を設定"
echo "グループ=$group を設定"
 
失敗回数=0
tempLog=$(mktemp -u)
関数addConfig() {
  curl -X POST -H "${contentType}" "http://$nacosAddr/nacos/v1/cs/configs?dataId=$1&group=$group&content=$2&tenant=$tenant&username=$username&password=$password" >"${tempLog}" 2>/dev/null
  [[ -z $(cat "${tempLog}") ]]; の場合
    echo " クラスターのステータスを確認してください。 "
    出口1
  フィ
  [[ $(cat "${tempLog}") =~ "true" ]] の場合、
    echo "$1=$2 の設定に成功しました"
  それ以外
    echo "$1=$2 の設定に失敗しました "
    (( 失敗回数++ ))
  フィ
}
 
カウント=0
$(cat $(dirname "$PWD")/config.txt | sed s/[[:space:]]//g); の行に対して
  (( カウント++ ))
	キー=${行%%=*}
    値=${行番号*=}
	addConfig "${キー}" "${値}"
終わり
 
エコー "= ...
echo " 初期化パラメータを完了しました。合計数:$count、失敗数:$failCount "
エコー "= ...
 
[[ ${failCount} -eq 0 ]]の場合
	echo " Init nacos config が完了しました。seata-server を起動してください。"
それ以外
	echo " init nacos config が失敗しました。 "
フィ

2.6 プッシュ スクリプトを実行し、その後に nacos IP アドレスを指定します。ポートが 8848 でない場合は、-p 8884 を追加してポートを設定する必要があります。

bash nacos-config.sh -h 127.0.0.1

2.7 コンテナを作成します。SEATA_IP が Alibaba Cloud サーバーの場合は、外部ネットワーク IP アドレスを書き込む必要があることに注意してください。

docker run -d --restart always --name seata-server -p 8091:8091 -e SEATA_IP=172.0.0.1 -e SEATA_CONFIG_NAME=file:/data/seata/registry -v /data/seata:/data/seata seataio/seata-server:1.3.0

3. クライアント(つまり、プロジェクトで seata を使用するマイクロサービス)

3.1 pom.xml は依存関係を導入します

<!-- Seata 分散トランザクション -->
        <依存関係>
            <グループ ID>com.alibaba.cloud</グループ ID>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <除外事項>
                <除外>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </除外>
            </除外>
        </依存関係>
        <依存関係>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <バージョン>1.3.0</バージョン>
        </依存関係>

元の io.seata パッケージを削除する必要があり、サーバーおよびクライアントのパッケージ バージョンが一致している必要があることに注意してください。

3.2 プロジェクト構成ファイルを構成する

#シータ
seata.application-id=${spring.application.name}
seata.tx-サービスグル​​ープ=btb_tx_group
seata.config.type=ナコス
seata.config.nacos.server-addr=172.0.0.1:8848
seata.config.nacos.group=SEATA_GROUP
seata.registry.type=ナコス
seata.registry.nacos.application=seata サーバー
seata.registry.nacos.server-addr=172.0.0.1:8848
seata.registry.nacos.group=SEATA_GROUP

注: ここでの btb_tx_group は、サーバーの vgroupMapping の後のキーと一致している必要があります。

例: service.vgroupMapping.btb_tx_group=default

3.3 使用するための注釈を追加する

@グローバルトランザクション

拡張:データベースを使用したところ、実行時に主キーが不足しているというエラーが報告されたため、undo_log テーブルに増分主キー ID を追加しました。上記の undo_log テーブルを作成するための SQL は ID を追加したもので、正式な SQL には ID がありません。ご留意ください! ! ! !

質問:単一のソースにエラーがあります。 理由は、データベースであり、プロキシ構成を次のように設定する必要があるためです。 私の実際の状況によると、これは構成ファイルを参照しており、そうでない場合はエラーが報告されます。

#単一データソース seata.enable-auto-data-source-proxy=true
#複数のデータソースseata.enable-auto-data-source-proxy=false

Docker+nacos+seata1.3.0のインストールと使用に関する記事はこれで終了です。Docker+nacos+seataのインストールと使用に関する詳細については、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nacos docker スタンドアロンモードのデプロイメントの実装プロセスの詳細な説明
  • docker に nacos をインストールしてデータベースを構成する詳細なチュートリアル
  • dockerでnacosをデプロイする方法を教えます

<<:  LinkedIn がウェブサイト閲覧を簡素化するためにリニューアル

>>:  あまり多くのコードを書かずに、ハイパーリンクを使ってシンプルで美しいカスタムチェックボックスを実装できます。

推薦する

mysql5.7.19 zip 詳細なインストールプロセスと構成

MySQL v5.7.19 正式版(32/64 ビットインストール版および zip 解凍版) 1. ...

Docker 学習: コンテナ コンテナの具体的な使用方法

コンテナは Docker のもう一つの中心的な概念です。簡単に言えば、コンテナとは、独立して実行され...

MySQL innodb B+ツリーの高さを取得する方法

序文MySQL の InnoDB エンジンがインデックスの保存に B+tree を使用する理由は、デ...

広告を閉じる効果を実現するJavascript

参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...

クールなネオンライト効果を実現する純粋な CSS (デモ付き)

私は最近、YouTube の CSS アニメーション効果チュートリアル シリーズをフォローしています...

Vue で動的なスタイルを実現するためのさまざまな方法のまとめ

目次1. 三項演算子の判定2. 動的に設定されるクラス3. 方法判定4. 配列バインディング5. e...

VMware15.5でcentos8.1をインストールし、物理メモリが不足する問題に対処する最も完全なチュートリアル

1. 仮想マシンの準備1. 新しい仮想マシンを作成する 2. 仮想マシンのカスタマイズを選択する 3...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

react-diagram シリアル化 Json 解釈 ケース分析

このドキュメントの目的はreact-diagramフレームワーク モデルの Json シリアル化を説...

HTMLを使用してシンプルなメールテンプレートを作成する

今日は、「ローテク」の問題について書きたいと思います。ちなみに、私は JavaScript Week...

MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

目次タイムスタンプ比較クエリで遭遇する落とし穴タイムスタンプクエリ範囲の問題タイムスタンプ比較クエリ...

React setStateデータ更新メカニズムの詳細な説明

目次setStateを使用する理由setStateの使用法非同期または同期更新要約するsetStat...

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...

MySQL の遅いクエリとクエリ再構築方法の記録

序文スロークエリとは何か、またスロークエリを最適化するにはどうすればよいか。以下では、これら 2 つ...

IE、Firefox、Chromeブラウザではスペースの表示が異なります

&nbsp;&nbsp;IE、Firefox、Chrome ブラウザでの表示効果は、...