k8s部署Eureka和Seata_2020.05.28

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s部署Eureka和Seata_2020.05.28相关的知识,希望对你有一定的参考价值。

参考技术A

学习基于记录,而不止于记录。

希望自己能坚持下去~

spring boot版本:2.2.7.RELEASE
Seata版本:1.2.0

1)打包Eureka spring boot项目成jar包
2)编写Dockerfile文件

3)打包成镜像

注意: 后面的点不能省略,代表当前路径

这里我使用了Harbor私人仓库,如果没有使用的话则直接在需要部署的机器上打包成k8s资源
4)推向私人仓库

5)如果不用私人仓库则跳过第四步,编写yaml文件
server.yaml

6)生成k8s资源并检查状态

我使用的是自定义配置,但是官方文档给出的案例是注册中心是nacos的配置方式,这个貌似是阿里自己的。
而我们是想用Eureka注册中心,所以yaml编写有差异。

    有必要说一下的是,这个只是简单的测试,为了方便使用的是NodePort的类型暴露服务,k8s环境只有master和一个node机器,这样的话也就意味着部署的机器ip固定是node节点机器ip,但是生产环境下node节点机器肯定不止一台,所以说会使用traefik建立路由,统一使用一个域名进行访问,这样ip地址就会被域名代替,这样无论在哪一台机器上都是可以正常访问和运行的。

Seata集成与部署

Seata安装以及Spring boot集成

Seata使用docker安装的方式
官方文档: Seata部署指南

前提: Nacos安装成功,具有docker环境

安装的三个角色(GitHub中的三个目录)

Github地址: seata/script at 1.4.0 · seata/seata (github.com)

  • client: 可以理解为集成Seata的Spring boot程序。在github中该目录中主要存放undo_log.sql文件和项目的配置文件,其中undo_log.sql文件主要在业务数据库中执行存放。
  • config-serverd: 这里可以理解为配置中心,也就时Nacos。在github中该目录主要存放各种配置中心需要导入的配置,这里以Nacos为例子:config.txt时需要导入的配置,nacos-config.shnacos-config.py是可以将config.txt导入Nacos的脚本。
  • server: 这里理解为Seata Server 部署的环境。在github中该目录中保存的是需要执行的数据库文件。(注意,这些脚本与undo_log.sql不同,它们不放在业务数据库中)

Seata Server 部署

建立MySQL环境

在数据库中新建seata的数据库,并执行一下的SQL文件:

seata/mysql.sql at 1.4.0 · seata/seata (github.com)

编写配置文件

  • 获取配置文件

    在GitHub中下载Seat Server Release文件(这里下载仅仅是为了获取配置文件,关于部署将使用docker方式),然后解压文件:

    # 下载文件
    wget -c https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
    # 解压文件
    unzipseata-server-1.4.2.zip
  • 将配置文件报错到自己定义的目录中

    # 新建目录
    mkdir /home/{user}/seata/config
    # 将配置文件放入到自定义目录中
    cp /home/{user}/seata/seata/seata-server-1.4.2/config/file.conf /home/{user}/seata/config
    cp /home/{user}/seata/seata/seata-server-1.4.2/config/registry.conf /home/{user}/seata/config
  • 修改配置文件file.conf

    # transaction log store, only used in seata-server
    store {
      ## store mode: file、db、redis, 
      mode = "db" # 这里修改为db
      ## rsa decryption public key
      publicKey = ""
      ......
    ## database store property 在这里完善Seata将使用的数据库相关属性
      db {
        ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
        datasource = "druid"
        ## mysql/oracle/postgresql/h2/oceanbase etc.
        dbType = "mysql" # 表示使用mysql数据库
        driverClassName = "com.mysql.cj.jdbc.Driver" 
        ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
        url = "jdbc:mysql://192.168.1.1:3306/seata?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false"
        user = "root"
        password = "root"
        minConn = 5
        maxConn = 100
        globalTable = "global_table"
        branchTable = "branch_table"
        lockTable = "lock_table"
        queryLimit = 100
        maxWait = 5000
      }
      ......
    }
  • 修改配置的registry.conf文件

    registry {
      # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
      type = "nacos" # 因为使用的配置中心是Nacos,所以这里选择nacos
    
      # 这里填写nacos的相关属性
      nacos {
        application = "seata-server"
        serverAddr = "192.168.1.1:8848"
        group = "SEATA_GROUP"
        namespace = ""
        cluster = "default"
        username = "nacos"
        password = "nacos"
      }
      ......
    }
    config {
      # file、nacos 、apollo、zk、consul、etcd3
      type = "file"
      ......
      file {
          # 这里说名一下,因为使用docker部署的话没有命令直接配置file.conf
          # 文件,因此直接在registry.conf里生命file.conf文件的位置
          #(这里file.conf的位置是在docker容器内的位置,
          # 在执行docker名令时会将实际的自定义配置文件目录与docker环境中的目录进行映射)
        name = "file:/root/seata-config/file.conf"
      }
    }

在Nacos中添加Seata相关配置

  • 修改config.txt文件

    transport.type=TCP
    transport.server=NIO
    transport.heartbeat=true
    transport.enableClientBatchSendRequest=false
    transport.threadFactory.bossThreadPrefix=NettyBoss
    transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
    transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
    transport.threadFactory.shareBossWorker=false
    transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
    transport.threadFactory.clientSelectorThreadSize=1
    transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
    transport.threadFactory.bossThreadSize=1
    transport.threadFactory.workerThreadSize=default
    transport.shutdown.wait=3
    # 修改下一行,记住修改的东东,后面要用
    # service.vgroupMapping.my_test_tx_group=default
    service.vgroupMapping.default_tx_group=default
    # 这里需要修改为 Seata的网络访问地址
    # service.default.grouplist=127.0.0.1:8091
    service.default.grouplist=192.168.1.1:8091
    service.enableDegrade=false
    service.disableGlobalTransaction=false
    client.rm.asyncCommitBufferLimit=10000
    client.rm.lock.retryInterval=10
    client.rm.lock.retryTimes=30
    client.rm.lock.retryPolicyBranchRollbackOnConflict=true
    client.rm.reportRetryCount=5
    client.rm.tableMetaCheckEnable=false
    client.rm.sqlParserType=druid
    client.rm.reportSuccessEnable=false
    client.rm.sagaBranchRegisterEnable=false
    client.tm.commitRetryCount=5
    client.tm.rollbackRetryCount=5
    client.tm.defaultGlobalTransactionTimeout=60000
    client.tm.degradeCheck=false
    client.tm.degradeCheckAllowTimes=10
    client.tm.degradeCheckPeriod=2000
    # 这里需要修改成db
    # store.mode=file
    store.mode=db
    store.file.dir=file_store/data
    store.file.maxBranchSessionSize=16384
    store.file.maxGlobalSessionSize=512
    store.file.fileWriteBufferCacheSize=16384
    store.file.flushDiskMode=async
    store.file.sessionReloadReadSize=100
    # 接下来修改为自己数据库的信息
    store.db.datasource=druid
    store.db.dbType=mysql
    store.db.driverClassName=com.mysql.cj.jdbc.Driver
    store.db.url=jdbc:mysql://192.168.1.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
    store.db.user=root
    store.db.password=root
    store.db.minConn=5
    store.db.maxConn=30
    store.db.globalTable=global_table
    store.db.branchTable=branch_table
    store.db.queryLimit=100
    store.db.lockTable=lock_table
    store.db.maxWait=5000
    store.redis.host=127.0.0.1
    store.redis.port=6379
    store.redis.maxConn=10
    store.redis.minConn=1
    store.redis.database=0
    store.redis.password=null
    store.redis.queryLimit=100
    server.recovery.committingRetryPeriod=1000
    server.recovery.asynCommittingRetryPeriod=1000
    server.recovery.rollbackingRetryPeriod=1000
    server.recovery.timeoutRetryPeriod=1000
    server.maxCommitRetryTimeout=-1
    server.maxRollbackRetryTimeout=-1
    server.rollbackRetryTimeoutUnlockEnable=false
    client.undo.dataValidation=true
    client.undo.logSerialization=jackson
    client.undo.onlyCareUpdateColumns=true
    server.undo.logSaveDays=7
    server.undo.logDeletePeriod=86400000
    client.undo.logTable=undo_log
    client.log.exceptionRate=100
    transport.serialization=seata
    transport.compressor=none
    metrics.enabled=false
    metrics.registryType=compact
    metrics.exporterList=prometheus
    metrics.exporterPrometheusPort=9898
  • 将配置文件上传到Nacos配置中心中

    # 获取nacos-config.sh文件: https://github.com/seata/seata/blob/1.4.0/script/config-center/nacos/nacos-config.sh
    # 为文件授予执行权限
    sudo chmod +x nacos-config.sh
    # 执行下述命令, 其中-u后是nacos的用户名, -w是nacos的密码
    ./nacos-config.sh -h 192.168.1.1 -p 8848 -g SEATA_GROUP -u nacos -w nacos

docker启动Seata Server环境

docker run --name seata-server -p 8091:8091 -e SEATA_IP=192.168.1.1 -e STORE_MODE=db -e SEATA_CONFIG_NAME=file:/root/seata-config/registry -v /home/{user}/seate/config:/root/seata-config -d seataio/seata-server:1.4.2

其中 SEATA_CONFIG_NAME获取的是docker容器中registry.conf配置文件的位置

-v /home/{user}/seate/config:/root/seata-config是将本地的/home/{user}/seate/config的目录挂载到/root/seata-config目录中。

Spring Boot集成Seata环境

前提: 数据库和Mybatis plus已经集成上了,项目单独能够正常的运行。

业务数据库建表

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT(20)   NOT NULL COMMENT \'branch transaction id\',
    `xid`           VARCHAR(100) NOT NULL COMMENT \'global transaction id\',
    `context`       VARCHAR(128) NOT NULL COMMENT \'undo_log context,such as serialization\',
    `rollback_info` LONGBLOB     NOT NULL COMMENT \'rollback info\',
    `log_status`    INT(11)      NOT NULL COMMENT \'0:normal status,1:defense status\',
    `log_created`   DATETIME(6)  NOT NULL COMMENT \'create datetime\',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT \'modify datetime\',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT =\'AT transaction mode undo table\';

引用pom依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>${seata-boot.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>${seata-cloud.version}</version>
    <exclusions>
        <exclusion>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>

yml配置文件


## seata配置
seata:
  enabled: true
  application-id: ${spring.application.name}
  # 下面这个需要跟刚刚config.txt上传到nacos配置中心的相同
  # config.txt中:service.vgroupMapping.default_tx_group=default(自己看,自己理解)
  tx-service-group: default_tx_group 
  # 这里开启自动的数据源配置,否则后秒要自己手动配置
  enable-auto-data-source-proxy: true
  data-source-proxy-mode: AT
  use-jdk-proxy: false
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.1.1:8848
      group : "SEATA_GROUP"
      namespace: ""
      username: "nacos"
      password: "nacos"
  config:
    type: nacos
    nacos:
      server-addr: 192.168.1.1:8848
      namespace: ""
      group: "SEATA_GROUP"
      username: "nacos"
      password: "nacos"
  log:
    exception-rate: 100
  tcc-fence:
    enable: true
    config:
      log-table-name: tcc_fence_log
      clean-mode: hour
      clean-period: 1

以上是关于k8s部署Eureka和Seata_2020.05.28的主要内容,如果未能解决你的问题,请参考以下文章

springcloud in k8s springcloud项目部署到k8s

k8s集群部署eureka总结

k8s部署微服务springcloud从0-1(Eureka实现)

如果我们在 K8s 中部署应用程序时使用 Eureka Discovery、Ribbon 等 Spring Cloud,何时使用?

SpringCloud - Spring Cloud Alibaba 之 Seata分布式事务服务;Seata TC Server集群部署(二十二)

这个注册的 IP 网络都不通了,Eureka 注册中心竟然无法踢掉它!