springboot cloud 는 eureka 를 사용 하여 분포 식 사무 구성 요소 인 Seata 를 통합 하 는 방법

머리말

요즘 계속 프로젝트 로 바 빠 요.저도 아르 바 이 트 생 이에 요.긴 말 하지 않 고 우리 seata 놀 이 를 시작 합 시다.
본문
아무 말 도 하지 않 습 니 다.우 리 는 관례 에 따라 먼저 위의 그림(그림 에서 규범 에 맞지 않 는 사용 은 무시 하 십시오).

간단하게 보면 우리 가 평소에 사용 하 는 것 보다 Seata Server 마이크로 서비스 가 많다 는 것 을 알 수 있다.
마찬가지 로 이 Seata Server 마이크로 서비스 도 eureka 에 등록 해 야 합 니 다.
그러면 우 리 는 먼저 이 seata server 를 만 들 고 나머지 는 원래 의 업무 서비스 통합 설정 입 니 다.
이 편 은 seata server 버 전 으로 1.4.1 을 사용 하여 git 에서 다운로드 할 수 있 습 니 다.물론 나 도 너희들 에 게 준비 해 준 것 이다.
seata server 1.4.1 모 네트워크 디스크 공유 주소:
링크:https://pan.baidu.com/s/1Oj1NkKwU4jeLjJ3Pu9hT2Q
추출 코드:9at 6
첫 번 째,다운로드 하여 압축 풀기:

두 번 째 단 계 는 seata server 용 데이터 베 이 스 를 만 듭 니 다.

CREATE TABLE `branch_table` (
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint(4) DEFAULT NULL,
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int(11) DEFAULT NULL,
  `begin_time` bigint(20) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(96) DEFAULT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `branch_id` bigint(20) NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
생 성 완료 후:

세 번 째 단 계 는\seata-1.4.1\seata-server-1.4.1\seata\\conf 의 설정 파일 에 대한 정 보 를 수정 합 니 다.
1. registry.conf



ok,registry.conf 이 파일 은 이 설정 항목 을 수정 합 니 다.
2. file.conf :

위의 두 파일 설정 이 완료 되 었 습 니 다(저장 기억).저 희 는 먼저 저희 등록 센터 eureka 서 비 스 를 달 린 다음 에 seata server 를 시작 하려 면 누 르 십시오.

시작 성공 을 볼 수 있 습 니 다.(전 제 는 eureka 가 시작 되 었 다 는 것 입 니 다):

세 번 째 단 계 는 분포 식 사무 seata 구성 요 소 를 사용 하 는 마이크로 서 비 스 를 설정 합 니 다.
내 가 있 는 이곳 의 예시 실천 에 필요 한 것 은 두 개의 마이크로 서비스 가 있다.

그럼 우리 두 마이크로 서 비 스 는 무엇 을 해 야 합 니까?
1.대응 하 는 마이크로 서비스 에 대응 하 는 서로 다른 데이터베이스 에(seata 를 사용 하고 싶 으 면)undolog 이 시계:

SQL 구문:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime(0) NULL,
  `log_modified` datetime(0) NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
SET FOREIGN_KEY_CHECKS = 1;
2.중요 한 단계 입 니 다.jar 패 키 지 를 가 져 옵 니 다.(seata 구성 요 소 를 사용 하려 면 모두 서 비 스 를 가 져 와 야 합 니 다)

<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-seata</artifactId>
			<version>2.1.0.RELEASE</version>
			<exclusions>
				<exclusion>
					<artifactId>seata-all</artifactId>
					<groupId>io.seata</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<artifactId>seata-all</artifactId>
			<groupId>io.seata</groupId>
			<version>1.4.1</version>
		</dependency>
3.더욱 중요 한 것 은 바로 설정 하 는 것 이다.
먼저 seata 의 마이크로 서 비 스 를 사용 하려 면 어떤 설정 을 해 야 하 는 지 알 아야 합 니 다.
1.resources 에 2 개의 프로필,file.conf 와 registry.conf 를 추가 합 니 다.
2.yml 설정 seata 트 랜 잭 션 그룹 인자 추가
3.코드 조정 데이터 원본 에이전트,seata 에이전트 에 게 전달
1. registry.conf


이상 은 비 즈 니스 마이크로 서비스 에 있 는 registry.conf 가 변경 해 야 할 설정 정보 입 니 다.이 글 에서 사용 할:

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10
 
  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka/"
    application = "seata-server"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = 0
    password = ""
    cluster = "default"
    timeout = 0
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}
 
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "file"
 
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
    apolloAccesskeySecret = ""
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}
file.conf

이 편 에서 사용 할 완전한 것 을 보 여 줍 니 다:

transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  # the client batch send request enable
  enableClientBatchSendRequest = true
  #thread factory for netty
  threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
  }
  shutdown {
    # when destroy server, wait seconds
    wait = 3
  }
  serialization = "seata"
  compressor = "none"
}
service {
#    ,        ,   yml       ,   register.conf    seata-server
  vgroupMapping.test_tx_group = "seata-server"
  #only support when registry.type=file, please don't set multiple addresses
  seata_tc_server.grouplist = "127.0.0.1:8091"
  #degrade, current not support
  enableDegrade = false
  #disable seata
  disableGlobalTransaction = false
}
client {
  rm {
    asyncCommitBufferLimit = 10000
    lock {
      retryInterval = 10
      retryTimes = 30
      retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
  }
  tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
  }
  undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
  }
  log {
    exceptionRate = 100
  }
}
2.yml 설정 파일 에 설정 항목 을 추가 하고 현재 서비스 가 seata 분포 식 트 랜 잭 션 구성 요 소 를 사 용 했 으 며 가입 해 야 할 분포 식 트 랜 잭 션 그룹 이 무엇 인지 알려 야 합 니 다.

spring:
  cloud:
    alibaba:
      seata.tx-service-group: test_tx_group
3.그 다음 에 데이터 원본 을 seata 에 맡 겨 대리 해 야 합 니 다.
기본 자동 로드 데이터 원본 제거
dao 층 스 캔 위치 설정

@MapperScan("com.cloud.client1.dao")
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
그 다음 에 seata 프 록 시 데이터 소스(빨간색 으로 표 시 된 곳 은 모두 확실하게 밟 은 구덩이 입 니 다.클래스 의 원본 과 스 캔 한 mapper 의 xml 위치 가 져 오기):

ok,여기까지 마이크로 서비스 usercent 의 통합 seata 분포 식 구성 요 소 는 완 성 된 셈 입 니 다.
마찬가지 로 우 리 는 다른 마이크로 서비스 coredata 에 대해 seata 분포 식 구성 요 소 를 계속 통합 합 니 다.
첫 번 째 단계 입 니 다.file.conf 와 registry.conf.
그리고 두 번 째 단 계 는 yml 설정 을 수정 하 는 것 입 니 다.

세 번 째 단 계 는 seata 데이터 원본 에이전트,application 의 주 해 를 추가 하여 데이터 원본 을 자동 으로 불 러 오고 dao 층 주 소 를 스 캔 하 는 것 입 니 다.yml 위의 설정 항목:

완료,두 업무 마이크로 서 비 스 는 모두 분포 식 사무 구성 요소 seata 를 통합 하 였 으 며,모두 같은 분포 식 사무 팀 에 설치 되 어 있 습 니 다(testtx_group).
그러면 여기까지 일 을 끝 냈 습 니 다.그 다음 에 분포 식 사무 스크롤 백 장면 의 예(어떻게 사용 하 는 지)를 들 어 보 겠 습 니 다.
나 는 이 편 에서 서 비 스 를 많이 하지 않 고 분포 식 서 비 스 를 두 개 만 했다.
보 여 주 는 예 내용:
1.상류 서비스 에 오류 가 발생 하고 분포 식 사 무 를 촉발 하 며 상하 류 서 비 스 는 모두 업무 가 다시 굴 러 갑 니 다.
2.하류 서비스 에 오류 가 발생 하면 분포 식 사 무 를 촉발 하고 상하 류 서 비 스 는 모두 업무 가 다시 굴 러 갑 니 다.(어느 정도 하류 에 오류 가 발생 하면 하류 에 만 있 으 면 분포 식 사무 가 필요 없고 오 류 를 통 해 단일 스크롤 백 을 전달 하 는 것 도 가능 하 다.그러나 서비스 호출 체인 이 길 고 중류 서비스 가 잘못 되면 전체 체인 의 서비스 가 다시 굴 러 가 야 한다.그러면 모두 seata 를 사용 할 필요 가 있다)

우 리 는 시 뮬 레이 션 을 시작 합 니 다.
첫 번 째 장면 상류 서비스 coredata 는 seata 전역 사무 주석@GlobalTransactional 태그 방법 을 사용 하여 먼저 Account 데 이 터 를 삽입 합 니 다.그리고 하류 서비스 usercent 를 호출 하여 데 이 터 를 삽입 합 니 다.
그 다음 에 상류 서비스 coredata 는 업무 논 리 를 계속 집행 하고 데 이 터 를 계속 삽입 합 니 다.
이 어 상류 서비스 coredata 를 모 의 하여 오 류 를 보고 하기 시 작 했 습 니 다.(우 리 는 name 길 이 를 통 해 고의로 오 류 를 발생 시 켰 습 니 다)
기대 결과:상하 류 두 서비스 가 현재 방법 사무 에 삽 입 된 데 이 터 를 모두 스크롤 백 합 니 다!
상위 서비스 coredata 방법:

fegin 을 통 해 하류 서비스 usercent 방법 을 호출 합 니 다.

하위 서비스 usercent 의 삽입 방법:

시 뮬 레이 션 시작:
1.먼저 eureka 를 달 려 라.

잠시 센터 에 등록 하고 다른 서 비 스 는 없습니다.

2.seata server 서 비 스 를 달 려 서 eureka 에 등록 합 니 다.
저 는 window 환경 입 니 다.


eureka 에 성공 적 으로 등록 한 것 을 볼 수 있 습 니 다.

3.상위 마이크로 서비스 coredata 와 하위 서비스 usercent 를 모두 달 립 니 다.

그리고 seata server 를 보면 두 서비스 가 모두 seata server 에 성공 적 으로 등록 되 었 고 모두 같은 사무 팀 test 에 있 는 것 을 볼 수 있 습 니 다.tx_그룹 내:

다음은 우리 가 모 의 한 장면 코드 를 호출 하기 시작 하면 끝 입 니 다.
처음에는 데이터 가 없 었 습 니 다.

상위 서비스 coredata 인 터 페 이 스 를 호출 하여 전체 프로 세 스 를 실행 합 니 다.


호출 시작:
우 리 는 중단 점 에서 상류 까지 데 이 터 를 한 번 삽입 한 적 이 있 고 하류 에 도 데 이 터 를 한 번 삽입 한 적 이 있다.

상위 서비스 와 하위 서 비 스 를 볼 수 있 는 데이터베이스 에 있 는 undolog 표 에 트 랜 잭 션 기록 이 나 타 났 습 니 다.현재 트 랜 잭 션 에 관 한 branchid 와 소재 하 는 사무 xid,그리고 두 서비스 내 undo 를 볼 수 있 습 니 다.log 표 에 기 록 된 xid 는 모두 일치 합 니 다.그들 이 모두 한 업무 에 있다 는 것 을 대표 합 니 다.


그런 후에 우 리 는 계속 아래로 집행 하여 고의로 상류 에 잘못 을 보고 하 게 했다.


이때 인터페이스 호출 이 끝 났 습 니 다.우 리 는 seata server 안의 정 보 를 볼 수 있 습 니 다.전체 사무 xid 가 22080 으로 끝 났 고 스크롤 백 에 성공 한 것 을 볼 수 있 습 니 다.

스크롤 백 성공 후,undo로그 테이블 의 기록 은 삭 제 됩 니 다:

물론 우리 두 서비스 에 도 데이터 가 없습니다.왜냐하면 굴 러 갔 기 때 문 입 니 다.

여기 서 누군가가 생각 할 수 있 습 니 다.당신 이 빈 것 을 찾 아 보면 스크롤 백 임 을 증명 할 수 있 습 니까?
이때 우 리 는 메 인 키 를 이용 하여 현재 값 을 증가 시 킬 수 있 습 니 다.데이터 스크롤 백 이 발생 한 장면 을 볼 수 있 습 니 다.

첫 장면 은 여기까지.
다음 에 우 리 는 두 번 째 장면 을 모 의 한다.
상위 서비스 coredata 는 seata 전역 트 랜 잭 션 주석@GlobalTransactional 태그 방법 을 사용 하여 먼저 Account 데 이 터 를 삽입 합 니 다.그리고 하류 서비스 usercent 를 호출 하여 데 이 터 를 삽입 합 니 다.
그리고 하류 서 비 스 는 실 수 를 직접 시 뮬 레이 션 하여 트 랜 잭 션 스크롤 백 을 촉발 합 니 다.기대 결과:상하 류 두 서비스 가 현재 방법 사무 에 삽 입 된 데 이 터 를 모두 스크롤 백 합 니 다!
즉,우 리 는 하류 서비스의 삽입 방법 에 대해 손 을 써 서 고의로 오 류 를 던 져 야 한 다 는 것 이다.


빠 른 호출:

하류 에서 오류 가 발생 한 것 을 볼 수 있다.

우리 의 seata server 가 어떻게 말 하 는 지 보 세 요.분포 식 사 무 를 출발 하여 스크롤 백 에 성공 하 였 습 니 다.

데이터베이스 안의 데이터 도 스크롤 백 되 었 습 니 다.비어 있 습 니 다.


자,이 springboot cloud 는 eureka 를 사용 하여 분포 식 사무 구성 요소 인 Seata 를 통합 합 니 다.
ps:요즘 바 빠 요.하지만 저 는 제 문장의 취 지 를 지 켜 서 여러분 들 이 실천 에 따라 이해 하고 배 울 수 있 도록 하 겠 습 니 다.저 는 그냥 아르 바 이 트 생 입 니 다.
스프링 클 라 우 드 통합 분포 식 사무 구성 요소 인 Seata 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 클 라 우 드 통합 분포 식 내용 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기