异构融媒体生产系统对接交互实践

荔枝云平台作为江苏省唯一的县级融媒体中心 省级技术平台,完成了与44 个县级融媒体中 心本地系统的对接。在项目推进过程中,研发 了融合媒体接口网关,制定了规范的系统对接 步骤,适配了国内所有主流融媒体生产系统的 接口,积累了异构融媒体生产系统交互的经验。 本文重点介绍了对接交互实现方案,并对如何 做好对接交互工作提出了建议。

摘要

一 项目背景

荔枝云平台作为江苏省唯一的县级融媒体中心省级技术平台,在承担各县级融媒体中心技术系统建设过程中发现:各个县级融媒体中心的本地系统种类繁多、架构体系各不相同,以往建设中又没有遵循统一的标准。因此各县原有的技术系统与省平台之间双向交互成为县级融媒体中心技术项目建设工作的重点和难点。荔枝云项目组攻坚克难,截至2020 年底,完成了荔枝云省级技术平台与44 个县级融媒体中心本地系统的对接。在项目推进过程中,研发了融合媒体接口网关,制定了规范的系统对接步骤,适配了国内所有主流融媒体生产系统的接口,积累了丰富的异构融媒体生产系统交互的经验。

常见的与异构系统交互有多种方式,包括:接口、共享数据库、共享文件、使用中间件等。其中共享数据库、共享文件方式存在很大的安全隐患,使用中间件方式各个系统改造的工作量巨大,通过接口交互可以同时保证交互的安全性和高效性。

二 接口相关的概念

融媒体生产系统提供的接口均为RESTful(Representational State Transfer,表征性状态转移)架构风格的HTTP/HTTPS 接口。REST 专门针对网络应用设计,降低了开发的复杂性,提高系统的可伸缩性。

有交互需求的技术系统发起HTTP/HTTPS 接口请求,接口请求一般包含4 个部分,分别是统一资源定位符、方法、头和体。

1. 统一资源定位符URL

统一资源定位符是完整地描述互联网上网页和其他资源地址的一种标识方法。一般形式:< 协议>://< 主机>:< 端口>/< 路径>/< 文件名>

2. 方法

HTTP 定义了与服务器交互的不同方法(Method), 基本方法有4 种, 分别是GET、POST、PUT 和DELETE。在实际应用中,一般只用GET、POST 方法,更新资源、删除资源也用POST方法。

GET 方式和POST 方式的区别如下:

(1)对请求参数的处理方式不同(直观的区别)

GET 请求:请求的数据会附加在URL 之后,以“?”分隔URL 和传输数据,如有多个参数则用“&”连接。URL 采用的是ASCII 编码方式,而不是Unicode 编码格式,即所有的非ASCII 字符都要在编码之后再传输。

POST 请求:POST 请求会把请求的数据放置在HTTP 请求包的Body 数据中,数据包的形式可以是“参数名1= 参数值1 & 参数名2= 参数值2”,也可以是JSON 格式(键值对)。JSON 格式是更常用的方式。

(2)传输数据的大小不同

HTTP 没有对传输数据的大小进行限制,也没有对URL 的长度进行限制。而在实际程序开发中,存在以下限制;

GET:特定浏览器和服务器对URL 的长度有限制。因此,在采用GET 方式提交数据时,传输数据会受到URL 长度限制。

POST:由于不是通过URL 传值,在理论上数据的大小不受限制。但实际上,各个Web 服务器会对采用POST 方式提交的数据大小进行限制。

(3)安全性不同

POST 方式的安全性比GET 方式的安全性高。使用GET 方式时,在地址栏里可以直接看到请求数据,采用这种方式可能受到Cross-site request forgery攻击。

POST 方式需要抓包才能获取到数据,变相地提高了安全性。

3. 头(Headers)和体(Body)

HTTP 报文是面向文本的,报文中的每一个字段都是ASCII 码串,各个字段的长度是不确定的。HTTP 请求报文由请求行、头、空行和请求数据4 个部分组成。

接口请求发送后,接收到请求的服务会给出回复,服务返回的应答消息称为HTTP 响应。HTTP 响应报文由3 个部分组成,分别是状态行、消息报头和响应正文。HTTP 响应的格式与请求的格式十分类似。响应报文和请求报文的区别在于第一行中用状态信息代替了请求信息。状态行通过提供一个状态码来说明所请求的资源情况。状态行格式:HTTP-VersionStatus-Code Reason-PhraseCRLF。其中:

◆ HTTP-Version 表示服务器HTTP 的版本;

◆ Status-Code 表示服务器返回的响应状态代码;状态代码由3 位数字组成:常见状态代码、状态描述、说明,如表1。

◆ Reason-Phrase 表示状态代码的文本描述;

◆ CRLF 表示回车并换行。

image.png

三 异构系统交互

荔枝云省级技术平台(简称:省平台)基于云计算、多租户等技术,采用公有云融合发展架构,通过构建媒体接口网关打通荔枝云和县级融媒体中心本地生产和发布系统,实现融合媒体生产流程再造,保障各县级融媒体中心的媒体生产和发布服务。整体的接口对接原则为双向交互,接口实现方面由调用方实现被调用方提供的接口。

省平台依据《县级融媒体中心省级技术平台规范要求》中的接口标准规范开发了融合媒体接口网关。融合媒体接口网关可以根据第三方系统在鉴权、文件推送、文稿推送和文稿与文件绑定的不同实现方式,灵活配置网关策略,实现了厂商的接口转换成标准接口的功能,能够快速高效地对接第三方应用系统。融合媒体接口网关对第三方系统的请求进行权限控制、负载均衡、日志管理、接口调用监控等。第三方所有请求都交给融合媒体接口网关。整体框架如图1。

image.png

荔枝云省级技术平台提供了标准的接口供各县应用调用。以新建多媒体稿件接口为例,大致的流程如下:

◆鉴权:验证调用接口者的身份;

◆文件推送:视音频和图片文件通过约定的方式推送至目标系统;

◆文稿推送:文稿通过约定的方式推送至目标系统;

◆文稿与文件绑定:文稿与文件形成绑定关系,以便后续生产。

1. 接口实现方式

调用各县级融媒体中心本地技术系统接口时,发现这些接口实现的方式多样,本文从鉴权、文件推送、文稿推送、文稿与文件绑定等四个方面归纳总结如下:

(1)接口的鉴权方式

接口的鉴权方式主要分为以下3 种:

◆ HTTP 接口携带特定参数。支持厂商:大洋、索贝、路特、轻快云等;

◆根据特定参数获取Token,在调用接口时携带。支持厂商有:新奥特、方正、千城智联等;

◆根据多个值计算密钥,在调用接口时携带。支持厂商有:厚健、太极、云骨等。

(2)文件推送的方式

文件推送的方式,主要分为以下4 种:

◆转换为文件流通过接口分片传输。支持厂商:大洋等;

◆文件上传至FTP 服务器。支持厂商有:索贝等;

◆直接接收文件外网访问地址。支持厂商有:方正、路特、新奥特、太极、上洋等;

◆图片文件Base64 加密后传递。支持厂商有:

吴江CMS、海门CMS 等。

(3)文稿推送

文稿推送各县都是通过http 接口传输。

(4)文稿与文件绑定的方式

文稿与文件绑定的方式,主要分为以下3 种:

◆调用创建文稿接口时,将文件传输后的文件http 地址填入接口对应参数。支持厂商:索贝、大洋、上洋等;

◆调用创建文稿接口时,直接使用云文件的外网地址。支持厂商:方正、路特、新奥特等;

◆调用创建文稿接口时,使用加密后的文件信息。支持厂商有:吴江APP CMS、海门APP CMS 等。

2. 国内平台实现方式

国内主要融媒体生产系统接口实现方式,分析如下:

(1)大洋智新平台

调用大洋智新接口同步稿件大体分为四步:获取Token、同步素材、素材入库、同步稿件。

其中的难点在于同步素材, 由于大洋提供的同步素材接口使用的是Nginx Upload_module上传组件, 使用Java 编写的话必须使用原生的HttpURLConnection 进行接口调用才能实现。具体做法如下:

◆获取出稿件相关的所有素材并循环每个素材取出素材对应的oss 地址;

◆根据oss 地址获取出文件流。由于使用的是VFS 方式获取文件流,一次只能获取一部分,如果需要获取完整的流需要循环将部分InputStre写入ByteArrayOutputStream 后再转为完整的InputStream;

◆调用接口使用断点续传将文件流推送给智新。由于Nginx Upload_module 上传组件存在单次请求接收的字节数限制,所以需要判断文件流大小是否超过限制,若超过限制则需要分多次上传,并且最后一次请求需要带特殊参数表明单个文件上传已结束;

◆文件同步完成后开始调用大洋接口进行素材入库,并且记录入库后生成的文件地址;

◆将稿件正文中的文件地址替换成素材入库后的文件地址,调用智新同步稿件接口,并且建立稿件和素材的关联关系。

(2)方正平台

实现包括两部分,一是验证调用者的身份,确保是合法的第三方建稿,具体是调用方正全媒体采编系统提供的Token 获取接口,获得合法的Token 后,才能调用建稿接口。二是建稿接口,第三方系统获得合法Token 后,用这个Token,并把数据打包成要求的格式,通过方正全媒体采编系统提供的建稿接口,把稿件推送到方正全媒体采编系统。

(3)厚健平台

调用厚建接口同步稿件大体分为三步:计算加密的认证信息、同步素材、同步稿件。厚建接口主要难点是需要替换掉正文中的部分样式。在调试的过程中发现同步过去的稿件正文在厚建系统中视频展示异常,经过双方排查后发现传递过去的正文中视频所用的class 在厚建系统中不支持,所以做了如下改动:在获取到最新版本的稿件正文后,除了需要将插入的素材地址修改成素材入厚建系统后生成的文件地址外,还需要将edui-upload-video、vjs-default-skin 、video-js 等class 去除。

(4)索贝平台

调用索贝平台接口主要的难点在最后的同步稿件接口,由于索贝提供的接口将素材与稿件的相关信息整合在一起导致接口参数的层级以及字段的对应关系复杂,需要程序员仔细梳理。

(5)新奥特

新奥特将整体的功能都封装成了很细的步骤,调用新奥特平台接口同步稿件需要13 步:获取Token、获取用户信息、创建文件夹、同步稿件、保存版本、创建素材资产、同步素材、修改文件状态、修改文件集状态、修改文件资产状态、签出文稿资产、增加文稿与素材的关联关系、保存文稿版本。主要的难点在于整体接口太多而且之间的关联关系复杂,需要理解很多新奥特内部定义的数据逻辑,如素材资产、文件、文件集的关系。

四 接口测试方法

各应用系统对接时,因为涉及到不同的异构技术系统,不同系统的开发人员又不在同一地办公。因此,在开始正式对接前必须采用标准的对接测试方法。

1. 文档要求

通过接口进行异构系统对接首先要提供相应的接口文档。接口文档必须包含以下内容:

首先接口分为四部分:方法、URI、请求参数、返回参数等。

方法包括:POST、GET 等,每个接口需要明确接口方法。

URI 为接口请求地址,需要明确调用的域名或IP 地址,URI 中若包含动态参数,需明确参数的含义并给出使用参数。

请求参数和返回参数,都分为5 列:字段、说明、类型、备注、是否必填。字段是类的属性;说明是中文释义;类型是属性类型,只有String、Number、Object、Array 四种类型;备注是一些解释,或者可以写一下例子,比如json 结构的情况,最好写上例子,好让前端能更好理解;是否必填说明该参数是否必须填值。返回参数结构有几种情况:

◆只返回接口调用成功还是失败(如新增、删除、修改等),则只有一个结构体;

◆要返回某些参数,则有两个结构体;

◆要返回列表,那么有三个结构体。

接口文档还需包括多个接口之间的逻辑关系,调用的先后顺序等。提供的接口需描述满足的业务场景等。

2. 接口测试工具

在正式编代码前, 接口测试工具推荐使用Postman。

Postman 是一款功能强大的调试与发送HTTP 请求的工具。方便填测试数据,查看响应,设置检查点、断言,能进行一定程度上的自动化测试。它可以把各种模拟用户HTTP 请求的数据发送到服务器,以便开发人员查看接口响应是否正确。它的基本功能包括:

(1)模拟各种HTTPrequests

从常用的GET、POST 到PUT、DELETE 等等。甚至还可以发送文件、送出额外的header。

(2)Collection 功能(测试集合)

通过collection 的归类,我们可以良好地分类测试软件所提供的API,而且collection 还可以输入(Import)或是分享(Share)出来,让团队里面的所有人共享你建立起来的Collection。

(3)人性化的response 整理

一般在用其他工具测试的时候,response 的内容通常都是纯文字的raw,但如果是JSON,就是塞成一整行的JSON。这会造成阅读的障碍,而Postman可以针对response 内容的格式自动美化。JSON、XML 或是HTML 都会整理成我们可以阅读的格式。

(4)内置测试脚本语言

支持编写测试脚本,可以快速检查request 的结果,并返回测试结果。

(5)设定变量与环境

一般我们在编辑request、校验response 的时候,总会需要重复输入某些字符,比如URL,Postman 允许我们设定变量来保存这些值,并且把变量保存在不同的环境中。

3. Mock 测试

Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。基本介绍如下:

◆对象:这个虚拟的对象就是mock 对象。mock对象就是真实对象在调试期间的代替品;

◆对象使用范畴:一些应用系统没有测试环境,又需要对接。这时候调用接口后的响应值需要模拟出一些数据;

◆关键步骤:使用一个接口来描述这个对象。在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象,还是mock 对象;

◆ 测试工具: 使用Mock Object 进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest 必须在Servlet 容器中才能构造出来)或者比较复杂的对象(如JDBC 中的ResultSet对象)从而使测试顺利进行的工具。

五 建议

为了更好更方便地实现异构系统之间的交互对接,在接口设计和实现方面,建议要重点考虑如下问题。

1. 颗粒度

异构系统间的接口交互可能会遇到较为复杂的场景,此时提供接口的系统需要考虑提供的接口颗粒度是否适合异构系统间的交互。

颗粒度较粗即被调用端提供的接口可以在自己系统内部完成整个复杂场景的业务逻辑,可以减少调用端的接口开发成本。调用端只需实现较少的接口即可实现整个业务逻辑。缺点是灵活度不高,如果对接功能需要变动,两端可能都需要修改。

颗粒度较细即被调用端将整个业务逻辑拆分为若干个接口,调用端通过串联调用这些接口实现整个业务逻辑。这种方式调用方的开发成本会较高,但是后期如果需要调整的时候只需修改其中某个接口的调用即可。

建议在交互时遇到较为复杂的业务场景时,对接的双方评估业务是否会经常产生变动。若业务场景还存在变动的可能,推荐接口的颗粒度宜细,若业务逻辑较为简单或业务逻辑很固定,建议颗粒度宜粗。也可以接口被调用方将两种方式都实现,调用方根据实际情况选择实现哪个接口。

2. 安全

多个融媒体生成异构系统通过接口交互时,接口的安全也十分重要,一般的解决方案如下:

(1)Token 授权认证,防止未授权用户获取数据HTTP 协议是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。但是服务端希望能够准确地知道HTTP 请求是哪个用户发起的,从而判断它是否有权限继续这个请求。

Token 的设计方案是用户在客户端使用用户名和密码登录后,服务器会给客户端返回一个Token,并将Token 以键值对的形式存放在缓存(一般是Redis)中,后续客户端对需要授权模块的所有操作都要带上这个Token,服务器端接收到请求后进行Token 验证,如果Token 存在,说明是合法授权的请求。

(2)时间戳超时机制

客户端每次请求接口都带上当前时间的时间戳(timestamp),服务端接收到timestamp 后跟当前时间进行比对,如果时间差大于一定时间(比如:1 分钟),则认为该请求失效。时间戳超时机制是防御DoS 攻击的有效手段。

(3)URL 签名,防止请求参数被篡改客户端将原本发送给服务端的明文参数做一下签名,然后在服务端用相同的算法再做一次签名,对比两次签名就可以确保对应明文的参数有没有被中间人篡改过。

(4)防重放,防止接口被第二次请求,防采集

客户端第一次访问时,将签名sign 存放到服务器的Redis 中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp 限定时间内还是外 URL 都只能访问一次,如果被非法者截获,使用同一个URL 再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL 再次访问,则会被时间戳超时机制拦截。

(5)白名单

仅允许白名单中IP 地址访问接口。

(6)采用HTTPS 通信协议,防止数据明文传输

HTTP 协议是以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了客户端和服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP 协议不适合传输一些敏感信息,比如密码等。

为了解决HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议(HTTPS),为了数据传输的安全,HTTPS 在HTTP 的基础上加入了SSL 协议,SSL 依靠证书来验证服务器的身份,并为客户端和服务器之间的通信加密。

3. 健壮性

接口的健壮性主要体现在异常情况下接口调用的情况,要实现健壮性主要有以下几点建议:

(1)进行统一的业务处理响应

建议一个response 至少应当有4 个返回值,包括:isSuccess 调用是否成功、data 返回的响应数据、errorCode 错误码、errorMsg 错误信息等。并且所有的接口要有标准的统一的response。

(2)参数检查

在进行真正的逻辑处理前,应当对入参进行一系列的校验,以保持后续业务处理逻辑的轻量,有错误尽早结束处理。

(3)幂等机制

无论何时何处何人,只要是相同的请求,就应当有相同的响应,直到到达终态。这个原则并不关注上一次的执行结果,本次结果不应当因为上一次请求的部分成功或者失败而导致某些中间状态不一致导致请求失败。

(4)重试机制

对于特定的外部系统错误,可以尝试多次重试这种策略,当然这也是建立在对方的服务是幂等的前提下。这样做在某些网络不稳定的情况下可以提高响应成功率。

4. 接口可用性检测

接口的调用建议有可视化的页面记录,页面提供筛选功能,详情显示任务的名称、执行时间、执行状态( 成功、失败、执行中等)、执行进度、异常信息等。方便管理人员掌握当前接口的状态,以及对各种异常情况做分析处理。

5. 业务流程监控

复杂的业务场景需要使用到多个系统的接口来进行异构系统的交互,这种复杂的业务流程建议设置可视化的整体业务流程业务监控。业务流程监控建议提供筛选功能,详情显示该流程的所有需要调用的接口并对逻辑关系进行串联,显示每个接口的调用情况包括:执行时间、执行状态( 成功、失败、执行中等)、执行进度、异常信息等。


参考文献:

[1] Roy Thomas Fielding. Architectural Styles and the Designof Network-based Software Architectures, 2000.

[2] 国家广播电视总局. 县级融媒体中心省级技术平台规范要求, 2019.

转载请注明来源:《现代电视技术》 作者:江苏省广播电视总台 王亮