异构API数据处理实践
数据来源:陈同学 | 异构API数据处理实践
首先用下图阐述业务场景。
基础服务为各个业务服务(服务A/B/C) 提供API,同时基础服务数据又来源于第三方服务商。
各个服务商之间API的数据结构不同,本文不涉及不同服务商之间的安全通讯方式。
为什么需要多个服务商?
例举我所遇到的两个因素
系统稳定性考虑
以发送短信为例,若只有一个服务商,若服务商因某些因素中断服务,将导致依赖于短信的业务受到严重影响。
若对接了多个服务商,当其中一个无法使用,自动切换到可用的服务商即可。
切换服务商
因各种因素导致商务合作终止,从而切换服务商
异构数据的场景举例
先举两个例子加以说明:
简单数据异构场景
假设通过企查查、天眼查的API获取工商信息,对于企业名称字段,企业可能分别名称是
ENTNAME
、org_name
,有的甚至是中文字段名企业名称
复杂数据异构场景
假设对接企业ERP中财务数据,A企业可能是金蝶系统、B企业是用友系统、其他企业可能是Oracle EBS或SAP系统。
这种场景不仅需要将异构数据处理成统一结构,而且处理过程中需要进行复杂的数据转换过程。
异构数据处理简单Demo
数据处理的目的是可以通过配置,将不同服务商的异构数据统一解析,简化代码,增强拓展性。
这里以企业工商数据做演示。下面假设三种工商信息的数据结构,均使用JSON格式展示:
数据结构示例
- 自身标准数据结构
业务系统中以自身的数据结构为准,假设字段名称是正常翻译:
{"organizationName":"企业名称","taxpayerNumber":"纳税人识别号"
}
- A服务商API返回的数据结构
假设字段名称是不规则简写:
{"ENTNAME":"企业名称","TAXNUMBER":"纳税人识别号"
}
- B服务商API返回的数据结构
假设字段名称是中文首字母简写:
{"QYMC":"企业名称","NSRSBH":"纳税人识别号"
}
简单处理示例
先采用简单的方式处理,首先新建一个Domain表示企业工商信息:
public class Organization {private String organizationName; //企业名称private String taxpayerNumber; //纳税人识别号
}
将A服务商的数据转换为标准数据
假设JSONObject是阿里的fastjson
// JSONObject data = {"ENTNAME":"企业名称", "TAXNUMBER":"纳税人识别号"}
Organization org = new Organization();
org.setOrganizationName(data.getString("ENTNAME"));
org.setTaxpayerNumber(data.getString("TAXNUMBER"));
将B服务商的数据转换为标准数据
// JSONObject data = {"QYMC":"企业名称", "NSRSBH":"纳税人识别号"}
Organization org = new Organization();
org.setOrganizationName(data.getString("QYMC"));
org.setTaxpayerNumber(data.getString("NSRSBH"));
上面看上去非常简单,但实际上API字段非常繁多,首先会导致大量的累赘代码,其次是有N个服务商就会有N种冗余代码。
统一解析处理示例
使用注解在Domain上标记各个服务商的对应字段
定义用于数据自动转换的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FiledMapper {String serviceA() default ""; // A服务商字段String serviceB() default ""; // B服务商字段
}
使用注解标记Domain的属性
使用注解将异构数据的字段名与标准字段建立Mapping关系
public class Organization {@FiledMapper(serviceA="ENTNAME", serviceB="QYMC")private String organizationName; //企业名称@FiledMapper(serviceA="TAXNUMBER", serviceB="NSRSBH")private String taxpayerNumber; //纳税人识别号
}
使用反射统一解析数据
/*** 统一解析数据** @param source 数据源* @param targetClass 目标类* @param serviceProvider 服务提供商* @return 目标类instance* @throws Exception*/
public static Object parse(JSONObject source, Class targetClass, String serviceProvider) throws Exception {Object instance = targetClass.newInstance();Field[] fields = targetClass.getDeclaredFields();if (fields != null) {for (Field field : fields) {if (field.isAnnotationPresent(FiledMapper.class)) {FiledMapper filedMapper = field.getAnnotation(FiledMapper.class);field.setAccessible(true);field.set(instance, source.get("A".equals(serviceProvider) ? filedMapper.serviceA() : filedMapper.serviceB())); // 此处hardcode做演示}}}return instance;
}
数据处理测试
JSONObject dataA = JSON.parseObject("{\"ENTNAME\":\"企业A\", \"TAXNUMBER\":\"1001\"}");
JSONObject dataB = JSON.parseObject("{\"QYMC\":\"企业A\", \"NSRSBH\":\"1001\"}");
Organization orgA = (Organization) parse(dataA, Organization.class, "A");
Organization orgB = (Organization) parse(dataB, Organization.class, "B");
总结
本文仅提取了异构数据处理中的一个“点”做分析,为数据解析提供一种解决的思路。
异构API数据处理实践相关推荐
- 基于 MaxCompute 的实时数据处理实践
简介: MaxCompute 通过流式数据高性能写入和秒级别查询能力(查询加速),提供EB级云原生数仓近实时分析能力:高效的实现对变化中的数据进行快速分析及决策辅助.当前Demo基于近实时交互式BI分 ...
- 【2017年第1期】智慧城市多源异构大数据处理框架
刘岩1,王华2,秦叶阳3,朱兴杰1 1. 泰康保险集团股份有限公司数据信息中心,北京 102206 2. 中国人民大学,北京 100872 3. 北京大学,北京 100871 摘要:智慧城市建设 ...
- Flink实时数据处理实践经验(Flink去重、维表关联、定时器、双流join)
Flink实时数据处理实践经验 文章目录 Flink实时数据处理实践经验 1. 数据输入与预处理 2. 实时数据处理 3. 实时数仓架构 4. 优化方案 Java.大数据开发学习要点(持续更新中-) ...
- java api 设计_Java API设计实践
使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...
- 京东千万并发 API 网关实践之路!
来源:京东零售技术(id:jd-sys) 链接:京东API网关实践之路 概述 1 背景 京东作为电商平台,近几年用户.业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生. API网关 ...
- java 最小化 api_Java的API设计实践
Introduction 了解在设计Java API时应该应用的一些API设计实践.通常,这些实践很有用,并确保API可以在模块化环境中正确使用,例如OSGi和Java平台模块系统(JPMS).有些做 ...
- 核心API最佳实践——JDK日志分级
核心API最佳实践--JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小] 日志(Log)是什么?字典对其的解释是"对某种机器工作 ...
- 云原生架构下的 API 网关实践: Kong (二)
Kong 是 Mashape 开源的一款云原生架构下的分布式 API 网关,其性能和可扩展性在同类组件中,表现都很优异.Kong 官方提供了很多直接可用的插件,此外,Kong 还可以通过插件扩展已有功 ...
- 广告深度学习计算:异构硬件加速实践
丨目录: - 前沿 1. 算力需求与供给 1.1 算力需求:模型复杂度 1.2 算力供给:异构硬件计算能力 1.3 问题与优化方法 2. 算法-系统-硬件协同性能优化 2.1 算法优化 2.2 系统优 ...
最新文章
- java编程连接mysql_Java编程学习之JDBC连接MySQL
- mysql修改表结构大表_在线修改MySQL大表的表结构
- mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...
- JPEG2000开发SDK及其特点
- 机器成为家人!华为发布2025十大趋势展望...
- vSAN其实很简单-如何处理“vSAN磁盘写满”问题?
- HDU 1301 - Jungle Roads( Prim求最小生成树 )
- 目标检测——如何让模型过拟合
- HDU-1429 胜利大逃亡(续)
- 记一次复杂的正则匹配——匹配但不包含
- 一个完整的Java Web项目需要掌握哪些技术
- android自定义pickerview,一个非常好用的Android PickerView库
- SpringBoot项目整合JasperReport报表生成PDF并下载
- 模糊逻辑基本原理与编程
- CSS精灵优化Retina显示屏下的网站图像
- RK系列SDK -- Android HFP蓝牙通话音频处理(蓝牙音箱方案)
- 试验设计方法与Design-Expert软件应用目录
- php 随机字符串函数,PHP 生成随机字符串的方法函数
- Linux 使用docker搭建MySQL服务的一些细节问题
- 使用Portia时docker-compose失败 /bin/sh: 1: /app/provision.sh: Permission denied
热门文章
- 智慧停车系统是怎么运行的?
- Anaconda——最省心的 Python 版本
- 各种群体寻优算法的比较
- Spring MVC中的Model, ModelMap, 和ModelAndView
- MT6737/MT6737T/MT6737M处理器参数差异分析资料
- 3DMAX 隐藏显示物体的快捷键
- 湖南天才少女姚婷:刚毕业就被华为156万年薪邀请,来历不简单
- html转换到pdf转换器,HTML转换到PDF转换器
- 多少卡路里,我应该吃是错误的
- 花青素近红外荧光染料Cyanine5 hydrazide,Cy5 hydrazide,1427705-31-4深蓝色粉末状