Skip to content

ctl report

jimin edited this page Dec 21, 2023 · 1 revision

一、项目信息

社区名称:Seata 项目名称:实现 Seata 运维 ctl 工具 导师:季敏 学生:董峻铎

二、项目目标

  1. 命令行支持集群节点健康检查状态返回
  2. 命令行支持配置中心、注册中心配置
  3. 命令行支持配置项的打印和动态修改
  4. 命令行支持事务的模拟,用以检查服务是否可用

三、项目进度

  1. 搭建命令行工具 seata-ctl,对接 Seata 集群接口
  2. 实现 Seata 服务的 Admin API 接口,以支持状态和配置管理
  3. seata-ctl 支持集群节点的健康状态检查
  4. seata-ctl 支持配置中心、注册中心配置
  5. seata-ctl 支持事务模拟,用以检查服务是否可用

四、配置说明

4.1 配置能力

| | 内存持久化 | 存储持久化 | 动态修改 | | --- | --- | --- | --- | | 注册中心配置 |

  • [x]

| × |

  • [x]

| | 配置中心配置 |

  • [x]

| × |

  • [x]

| | 其他配置项配置 |

  • [ ]

|

  • [x]

|

  • [x]

|

4.2 配置项支持列表

seata.server.max-commit-retry-timeout
seata.server.max-rollback-retry-timeout
seata.server.rollback-retry-timeout-unlock-enable
seata.server.enable-check-auth
seata.server.retry-dead-threshold
seata.server.xaer-nota-retry-timeout
seata.server.undo.log-save-days

五、方案设计

5.1 整体方案

设计:复用 7091 端口服务,每个 seata-server 实现针对各基础组件的增删改查的 HTTP 接口 安全性:由 **7091** 端口服务的身份认证提供 (用户名&密码,JWT 做 auth) 针对 Seata 服务状态、注册中心、配置中心、存储的相关修改,广义上均为“CRUD”语义,因此 Action 进行了对应(get/set/delete),并增加了 reload 用于热加载/更新相关配置。 HTTP 接口形式为:

curl http://host:port/api/v1/admin/{type} -X GET/POST/DELETE

5.2 研发模块

  1. seata-server (a.k.a TC):扩展 7091端口服务,除了提供 Seata Console 功能之外增加上述 admin 功能
  2. seatactl:新 repo/project,通过 7091端口的认证方式,调用 admin HTTP 接口实现节点管理

5.3 技术选型

  1. seata-server admin 接口 增强:原有 Java SpringBoot 服务增加 HTTP 接口
  2. seatactl: 建立新的 repo,采用 Golang 开发,可以跟随 server 节点部署,也可以独立在其他环境使用
  3. 第三方依赖引入:无

5.4 状态检查

提示单机/集群部署状态。除展示 Server 相关硬件信息外,还包含 UP / DOWN 两种节点状态。

5.5 配置同步

六、项目演示

6.1 概览

$ seata-ctl -h
seata-ctl is a CLI tool for Seata

Usage:
  seata-ctl [flags]
  seata-ctl [command]

Available Commands:
  version     Print the version number of seata-ctl

Flags:
  -h, --help              help for seata-ctl
      --ip string         Seata Server IP (default "127.0.0.1")
      --password string   Password (default "seata")
      --port int          Seata Server Admin Port (default 7091)
      --username string   Username (default "seata")

Use "seata-ctl [command] --help" for more information about a command.

6.2 连接服务

$ seata-ctl --ip 127.0.0.1 --port 7091 --username seata --password seata
127.0.0.1:7091 > # input command here

6.3 help 命令

127.0.0.1:7091 > help
Usage:
  [command] [flag] 

Available Commands:
  get         Get the resource
  help        Help about any command
  quit        Quit the session
  reload      Reload the configuration
  set         Set the resource
  try         Try if this node is ready

6.4 get 命令

127.0.0.1:7091 > get -h    
Get the resource

Usage:
   get [flags]
   get [command]

Available Commands:
  config        Get the configuration
  status        Get the status

Flags:
  -h, --help   help for get

Use "get [command] --help" for more information about a command.

样例1:获取集群状态

127.0.0.1:7091 > get status
+-------+--------------------+--------+
| TYPE  | ADDRESS            | STATUS |
+-------+--------------------+--------+
| nacos | 192.168.163.1:7091 | ok     |
+-------+--------------------+--------+
| nacos | 192.168.163.2:7091 | ok     |
+-------+--------------------+--------+

样例2:获取配置 server.servicePort

127.0.0.1:7091 > get config --key server.servicePort   
+--------------------+-------+
| KEY                | VALUE |
+--------------------+-------+
| server.servicePort | 8091  |
+--------------------+-------+

6.5 set 命令

127.0.0.1:7091 > set -h                    
Set the resource

Usage:
   set [flags]
   set [command]

Available Commands:
  config        Set the configuration

Flags:
  -h, --help   help for set

Use "set [command] --help" for more information about a command.

样例1:修改注册中心类型

127.0.0.1:7091 > set config --key registry.type --value eureka
+---------------+--------+
| KEY           | VALUE  |
+---------------+--------+
| registry.type | eureka |
+---------------+--------+

样例2:修改配置中心类型

127.0.0.1:7091 > set config --key config.type --value nacos 
+-------------+-------+
| KEY         | VALUE |
+-------------+-------+
| config.type | nacos |
+-------------+-------+

样例3:修改配置项 server.undo.logSaveDay

set config --key server.undo.logSaveDays --value 5
+-------------------------+-------+
| KEY                     | VALUE |
+-------------------------+-------+
| server.undo.logSaveDays | 5     |
+-------------------------+-------+

6.6 try 命令

提交一个样例事务,用以测试服务是否可用:

127.0.0.1:7091 > try begin
Try an example txn successfully, xid=192.168.163.1:8091:522856277732237313
Commit it? (`yes` or `no`, default is `yes`) yes

Commit successfully!

127.0.0.1:7091 > try begin
Try an example txn successfully, xid=192.168.163.1:8091:522856277732237313
Commit it? (`yes` or `no`, default is `yes`) no

Rollback successfully!

6.7 quit 命令

退出连接:

127.0.0.1:7091 > quit
Quit the session

七、后续安排

  1. 持续完善 Seata 配置项动态修改,支持更多的配置项可动态配置
  2. 推进 seata-ctl 支持 Seata 存储的配置运维
  3. 整合已有的 Seata 脚本(例如 自定义配置上传配置中心 的相关脚本)统一能力至 seata-ctl

八、总结心得

在导师季敏的帮助下,项目阶段性通过组织会议对齐进度,可以适时地发现潜在的问题和风险。参与本项目的过程中,我在 CLI 工具的编写上也积累了宝贵的经验,同时对 Seata 分布式事务的一些关键配置运维有了更好的理解。感谢 OSPP 的这次活动,也感谢导师季敏和 Seata 社区的支持和鼓励!

Clone this wiki locally