2.5. 多发比对网关部署说明

本章节介绍比对服务网关的部署方法,以及微服务伪多发的配置注意事项。

2.5.1. 多发比对网关简介

多发比对网关是基于 OpenResty 的服务,支持将请求发送给多个对接不同数据库的微服务;这些微服务正确集成了伪多发后,将 SQL 执行数据汇报给比对服务,实现多个异构库微服务的数据比对。

../_images/%E7%BD%91%E5%85%B3%E7%AE%80%E4%BB%8B.png

多发网关支持的特性包括:

  • 支持配置多个目标端

  • 支持多目标端 Session 保持

  • 以业务请求为维度生成 TraceID

2.5.2. 多发比对网关部署

部署时需要的物料包括:

  1. 网关的发布物

  2. Openresty-1.13.6.2 程序

部署时需要的步骤包括:

  1. 建立目录结构,复制资源

  2. 修改端口与 host 配置

  3. 修改配置文件

2.5.2.1. 网关的发布物

网关的发布物中包含一个 conf 配置,以及一系列 lua 文件。以 SEE 网关为例,发布物中会有如下目录结构:

see
 - config.lua
 - file_persist.lua
 - log_csv.lua
 - nginx-see-tenant.conf
 - README
 - html
    - multiplex-gateway.html
    - papaparse-5.4.1.min.js
    - tailwindcss-3.4.17.js

2.5.2.2. Openresty-1.13.6.2 程序

需要下载 Openresty-1.13.6.2 源码包,并编译安装。

下载地址: https://openresty.org/download/openresty-1.13.6.2.tar.gz

编译方式:

yum install pcre-devel openssl-devel gcc curl zlib-devel
tar -xvf openresty-1.13.6.2.tar.gz
cd openresty-1.13.6.2/
./configure --prefix=/path/to/install -j2
make -j2
sudo make install

需要将 /path/to/install 改为您需要安装 Openresty 程序的位置,推荐放在 /opt/openresty-1.13.6.2 ;这样编译完成后, 二进制程序会在 /opt/openresty-1.13.6.2/nginx/sbin/nginx

如果对编译方式仍有疑问,可参考官方构建文档 https://openresty.org/en/installation.html#building-from-source

2.5.2.3. 建立目录结构

网关的配置与 Openresty 是不放在一起的,需要建立一个独立的目录,如 multiplex-gateway ,然后将发布物复制进去,步骤:

  1. 将网关配置复制进来

  2. 设置 run.sh 启动脚本

首先创建目录结构:

mkdir -p data conf

然后将发布物中的内容全部复制到 conf 目录下。

然后处理 run.sh ,发布物中的 run.sh 脚本复制到 multiplex-gateway 目录下,并修改启动脚本中的 NGINX_BIN 路径,例如:

#!/bin/bash
#
# nginx 管理脚本模板
#

# ======= 可配置部分 =======
NGINX_BIN="/opt/openresty-1.13.6.2/nginx/sbin/nginx"  # Nginx 二进制路径
WORK_DIR="$(readlink -f $(dirname $0))"               # 工作路径
CONF_DIR="$WORK_DIR/conf"                             # 配置目录(默认在 WORK_DIR/conf)
LOGS_DIR="$WORK_DIR/logs"
CONF_FILE="$CONF_DIR/nginx-see-tenant.conf"           # 配置文件
PID_FILE="$WORK_DIR/logs/nginx.pid"                   # PID 文件路径
# ==========================

start() {
        echo "Starting nginx with config: $CONF_FILE"
        mkdir -p "$LOGS_DIR"
        $NGINX_BIN -p "$WORK_DIR" -c "$CONF_FILE"
}

stop() {
        if [ -f "$PID_FILE" ]; then
                echo "Stopping nginx..."
                kill -QUIT $(cat "$PID_FILE")
        else
                echo "No PID file found at $PID_FILE"
        fi
}

reload() {
        if [ -f "$PID_FILE" ]; then
                echo "Reloading nginx config..."
                kill -HUP $(cat "$PID_FILE")
        else
                echo "No PID file found, nginx may not be running"
        fi
}

status() {
        if [ -f "$PID_FILE" ]; then
                if ps -p $(cat "$PID_FILE") > /dev/null 2>&1; then
                        echo "nginx is running (PID: $(cat "$PID_FILE"))"
                else
                        echo "nginx PID file exists but process not found"
                fi
        else
                echo "nginx is not running"
        fi
}

case "$1" in
        start)   start ;;
        stop)    stop ;;
        reload)  reload ;;
        status)  status ;;
        restart) stop; sleep 1; start ;;
        *)
                echo "Usage: $0 {start|stop|reload|restart|status}"
                exit 1
esac

再为启动脚本增加可执行权限即可: chmod +x run.sh

最终完整的目录结构类似于:

├── conf
│   ├── config.lua
│   ├── file_persist.lua
│   ├── html
│      ├── multiplex-gateway.html
│      ├── papaparse-5.4.1.min.js
│      └── tailwindcss-3.4.17.js
│   ├── log_csv.lua
│   └── nginx-see-tenant.conf
├── data
└── run.sh

2.5.2.4. 修改端口与 host 配置

用户需要编辑 conf/nginx-see-tenant.conf ,以修改以下配置:

  • 监听地址

  • 监听端口

要使用网关,一定需要一个 host ,否则与各个微服务的 Session 会无法处理。假设用户使用 example.com 为 host ,需要找到 server { 下面的 server_name 进行修改。

备注

如果没有 DNS 服务,则可能需要配置 hosts 才可以访问网关,需要将 example.com 绑定到网关所在的地址。 方法示例 (Windows):编辑 C:WindowsSystem32driversetchosts 文件,添加如下内容: 10.20.30.40 example.com

默认端口为 8081 ,如果用户需要修改端口,需要找到 server { 下面的 listen 8081; ,修改为对应端口即可。

2.5.2.5. 修改配置文件

修改 conf/config.lua ,在网关上配置多发到哪些节点,以及 UUID 处理服务的请求地址。

配置示例:

-- 主节点
_M.PRIMARY_NODE = { scheme = "http", host = "10.20.191.231", port = 8081 }

-- 多发节点列表 shadow_servers
_M.SHADOW_NODES = {
        { scheme = "http", host = "10.20.30.217", port = 8081 },
        { scheme = "http", host = "10.20.199.58", port = 8081 },
}

-- UUID 插入类功能 uri 清单
_M.UUID_SERVICE_TIMEOUT_MILLIS = 10000
_M.UUID_SERVICE_ADDR = "http://10.20.191.231:9091/ukagent/getLastSyncUuidStatus"
_M.UUID_INSERT_FUNCTIONS = {
        { uri = "/acm/dssp/script/save.json" },
        { uri = "/acm/dssp/product/mulUploads.json" },
}

用户需要修改 PRIMARY_NODE SHADOW_NODES UUID_SERVICE_ADDR 这三项配置。

  • PRIMARY_NODE: 主节点配置,推荐配置为连 MySQL 或 Oracle 的微服务的地址

  • SHADOW_NODES: 多发节点列表,配置为需要多发到节点的微服务地址

  • UUID_SERVICE_ADDR: UUID 处理服务地址,配置为 UUID 处理服务地址;UUID 服务的部署方式参考下一节的说明

2.5.3. 伪多发配置注意事项

微服务需要配置伪多发,才能与网关正确配合,实现数据比对;配置伪多发时有一些注意事项:

  1. 需要在 jrescloud.properties 中配置 UUID 服务地址,参数为 multi.uuidServiceUrl ,如 multi.uuidServiceUrl=http://10.20.191.231:9091/ukagent/putSyncUuid

  2. 需要注意 unisql.conf 中配置正确的元数据 Schema ,否则伪多发可能因无法找到元数据而失败;配置参数为 unisql.table.column.metadata.schemas ,如 SEE 需要配置 unisql.table.column.metadata.schemas = 'acm','acm_job','sys'

备注

由于业务系统可能采用自动生成的 UUID 作为主键插入到数据库中,所以引入了 UUID 服务专门来处理这种情况,使得主库微服务与所有其他目标库微服务的数据保持 ID 一致,避免后续业务无法进行。

2.5.4. 多发比对网关启动

完成上述部署步骤后,可执行 ./run.sh start 进行启动。

启动后,如果界面上没有提示错误信息,则网关启动成功。正常情况下,只会有一句 Starting nginx with config: 的日志打印出来。

之后可以在浏览器上输入网关的地址来访问网关,以 SEE 为例,可访问 http://example.com:8081/acm/app.htm

启动后,Openresty 会自动创建一些目录,最终结构如下:

├── client_body_temp
├── conf
│   ├── config.lua
│   ├── file_persist.lua
│   ├── html
│      ├── multiplex-gateway.html
│      ├── papaparse-5.4.1.min.js
│      └── tailwindcss-3.4.17.js
│   ├── log_csv.lua
│   └── nginx-see-tenant.conf
├── data
│   └── multiplex-status.csv
├── fastcgi_temp
├── logs
│   ├── body.log
│   ├── debug.log
│   ├── error.log
│   ├── nginx.pid
│   └── primary_biz_access.log
├── proxy_temp
├── run.sh
├── scgi_temp
└── uwsgi_temp