willning 发表于 2022-9-9 16:20:59

用服务端命令开发和调用WebAPI,实现服务器间数据通讯

本帖最后由 willning 于 2023-3-6 14:33 编辑

集团企业或大型企业通常会有多个数据中心,各自角色不同,服务的实体也不一样。这些数据中心相互独立,各自管理,但也存在大量的数据交互需求。如集团总部需要从子公司抽取数据、向子公司下发管理员权限等;生产服务器从销售服务器拉去订单数据、回写订单排产计划等。如果这些数据中心无法互通,企业就会遇到大家耳熟能详的“数据孤岛”问题。如果你遇到了以下的问题,本方案将能助你一臂之力:
[*]管理员集中授权:如总部统一授予或吊销各分公司的系统管理员权限
[*]多级数据填报:如子公司人员填写原始数据,经子公司审批和汇总处理后,自动提交给总部
[*]管理策略下发:如总部为不同的分公司下发预算数据,并设置提醒规则
[*]多系统的数据互通:如工厂的排产系统从各地销售分公司抓取订单数据

本教程将以“集团企业总部向子公司下发管理员权限”为例,介绍服务器间数据互通的原理和实现。

方案
在服务器间进行数据交互有多种方式,其中比较典型的如下:

技术方案安全风险 开发/配置复杂度 通讯效率(小数据量) 通讯效率(大数据量)
数据库发布订阅高中低 中
文件共享 中低低 高
消息队列 低高高 低
WebAPI 低低中中

从对比中可以看到,基于HTTP的WebAPI管理难度低、安全风险小,通讯效率适中,是服务器间数据通讯中应用范围最广的方案。具体到活字格上,您可以通过创建服务端命令构建支持OAuth2认证的WebAPI,也能通过“发送HTTP请求”官方插件调用WebAPI。


示例
我们以集团企业中,总部信息化部门集中管理子公司用系统管理员的应用场景为例,展示如何使用活字格实现服务器间数据通讯。

下面是该示例的网络拓扑简图,由总部、上海、西安分公司、上海分公司、西安实验室等角色构成,分别部署在4个服务器集群和1个活字格云服务。各角色之前没有架设专线,均接入互联网。



为了实现该业务场景,我们需要做4个步骤:

Step 1:开发和发布WebAPI
你需要开发一个用于管理用户和角色的应用,发布到总部之外的4个角色的服务器(集群)上。该应用不需要提供页面,仅需包含服务端命令,即WebAPI。你可以在服务端命令的【常规】选项卡中配置HTTP方法,查看该WebAPI的URL。如下图中的服务端命令,可以通过https://{server_name}:{port}/{app_name}/ServerCommand/removeUserRole 调用。



在示例中,我们分别开发了获取用户列表、创建用户、将用户加入组、从组中移除用户、删除用户等服务端命令。如需了解如何在应用中,而不是管理控制台上管理用户和权限组,可以下载和查看工程文件:

Step 2:配置OAuth2访问权限
对于大多数企业应用场景,强烈建议你在服务端命令的【常规】选项卡中“权限设置”区域,不勾选“匿名用户”,以确保数据安全。因为我们是从其他服务器上,以WebAPI的形式调用这个服务端命令,在权限设置中勾选“登录用户”即可,剩下的事情交给OAuth2。OAuth2的配置在管理控制台上,你可以登录到管理控制台,在【设置】→【安全设置】页面下方找到“第三方授权”区域,管理WebAPI的访问授权。

我们推荐你为每个需要访问该服务器的角色,如示例中的“总部”创建独立的第三方授权。因为活字格的授权是按照OAuth2设计的,在创建第三方授权时,可以按照下面的建议填写:

项目用途 推荐设置
客户端名称帮助你区分这些授权的用途 调用方集群的名称,如“总部”
客户端标识符 OAuth2认证时的“用户名”不能修改
客户端密钥OAuth2认证时的“密码” 不能修改,建议定期点击“重置密钥”,避免密钥意外泄露带来的安全风险
授权方式 OAuth2的认证方式仅提供给使用活字格开发的应用调用时,可以选client_credentials;保持最大兼容性,可以选password,client_credentials
API作用域
该授权能用在哪里 服务端命令的作用域是FGC_AllAppsServerCommands
令牌生命周期每次获得的Token,多少秒后过期 如果你希望通过缓存的方式减少调用次数,提升性能,可以设置为7200或更长。


需要特别注意的是,创建完第三方授权后,需要点击下方的【保存设置】按钮,活字格服务管理器重启后才能生效。

Step 3:使用Postman测试WebAPI
为了避免返工,我们推荐在调用WebAPI前,先使用Postman或类似工具进行测试。

3.1 获取Token
向 {Server}:22345/UserService/connect/token发起POST请求,x-www-form-urlencoded编码的参数如下表:


参数说明示例
client_id客户端标识符使用被调用服务器的活字格服务器管理器中配置的第三方授权的对应值
client_secret客户端密钥使用被调用服务器的活字格服务器管理器中配置的第三方授权的对应值
scope申请的权限范围固定为: FGC_AllAppsServerCommands
grant_type申请方式固定为:client_credentials
access_token(输出)可供使用的Token
expires_in(输出)Token的有效期(单位是秒)




3.2 调用WebAPI
向Step 1中创建的服务端命令的地址发POST请求,在HEAD中追加Authorization键值,值为Bearer加空格加上一步返回的access_token


Step 4:在服务端命令中调用WebAPI
使用Postman调试成功后,你可以利用活字格的“发送HTTP请求命令”官方插件,调用第三方的WebAPI。这里的API可以是现有的软件产品或SaaS服务,也可以是开发团队自己封装的“桥接”服务,也可以是位于其他应用甚至企业服务器上,用活字格开发的服务端命令。

考虑到安全因素(如防止数据被截取、篡改,Token泄露等),我们一律建议你在服务端命令中使用“发送HTTP请求命令”。调用OAuth2认证的WebAPI时,我们需要做两个步骤,即获取Token和执行调用。

3.1 获取Token
包含活字格在内,标准的OAuth2均支持Token的缓存机制,即在发放Token时,同步提供Token的过期时间。在过期时间到来前,Token都是有效的,可以重复使用。这个机制可以很有效的降低对被调用WebAPI的压力。所以,我们需要做的事情是先检查数据表中缓存的Token,如果不存在或者无效,则发送请求申请新的Token,否则使用数据库中缓存的Token。

将请求结果写入tokenResponse变量,这样你就可以用tokenResponse.access_token和tokenResponse.expires_in获取Token和有效期限了。记得将这两个信息存储到数据库中,这样下次调用就可以直接从数据库读取,而无需再发请求。



3.2 调用WebAPI
对于需要OAuth2鉴权的WebAPI,如活字格的服务端命令,你在发起请求时需要在请求头(HEAD)中加入一个名为Authorization的键值,值为 Bearer加空格加Token。


在请求体中,我们就可以按照被调用WebAPI的要求准备参数,通过结果变量处理调用结果了。为了方便使用,我们准备了一个示例工程。你只需要将common_servicse表和“调用活字格WebAPI服务”私有服务端命令导入,就可以参考“demo”服务端命令来开发自己的调用逻辑了。


Step 5:将服务器返回的数据显示到页面上(可选)
对于页面交互触发的服务器间数据通讯,你可能需要将被调用方服务器返回的结果填充到页面上。在实现这个功能时,你需要留意传递到页面的数据的类型:

[*]对象(调用服务端命令默认返回的是对象):你可以直接用res.ABC的方式,获取到该对象的属性,再利用“设置单元格命令”,将数据填充到单元格中;对于数组类型的属性,可以先利用“循环”命令遍历该数组,然后用“表格操作命令”将数组中元素的数据作为一行,填充到表格中。
[*]JSON字符串(发送HTTP请求命令默认返回的是JSON字符串):你可以用“JSON数据源”官方插件中提供的“导入JSON到表格命令”和“导入JSON数据到单元格”两个命令,将单值和数组填充到页面;也能先用“JSON序列化/反序列化”官方插件中提供的“Json反序列化”命令,将JSON字符串转换成对象,然后就可以按照上面讲到的方法做展示了。

具体操作可以参考示例工程: (配套的MySQL数据表创建脚本:)

常见问题
Q:这个方案可以用来调用编码开发的WebAPI吗?
A:可以,如果这个WebAPI支持OAuth2,数据传输采用JSON格式的话。事实上,通过编码开发的方式,将第三方软硬件包装成一个WebAPI供活字格调用,是非常典型的系统集成方式。你也可以利用这个思路,封装一些高性能要求的业务需求,如批量处理等,将低代码+编码的混合开发模式落地。

Q:这个方案可以用在集群之间的数据通讯吗?
A:可以。将这里的服务器IP、端口替换为集群的网关IP和端口即可。

Q:在调用第三方API的时候,对方需要组织一个复杂的对象,该怎么做?
A:使用【对象与集合操作工具】插件。






页: [1]
查看完整版本: 用服务端命令开发和调用WebAPI,实现服务器间数据通讯