数据来源:陈同学 | 异构API数据处理实践

首先用下图阐述业务场景。

基础服务为各个业务服务(服务A/B/C) 提供API,同时基础服务数据又来源于第三方服务商。

各个服务商之间API的数据结构不同,本文不涉及不同服务商之间的安全通讯方式。

为什么需要多个服务商?

例举我所遇到的两个因素

系统稳定性考虑

以发送短信为例,若只有一个服务商,若服务商因某些因素中断服务,将导致依赖于短信的业务受到严重影响。

若对接了多个服务商,当其中一个无法使用,自动切换到可用的服务商即可。

切换服务商

因各种因素导致商务合作终止,从而切换服务商

异构数据的场景举例

先举两个例子加以说明:

  • 简单数据异构场景

    假设通过企查查、天眼查的API获取工商信息,对于企业名称字段,企业可能分别名称是ENTNAMEorg_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数据处理实践相关推荐

  1. 基于 MaxCompute 的实时数据处理实践

    简介: MaxCompute 通过流式数据高性能写入和秒级别查询能力(查询加速),提供EB级云原生数仓近实时分析能力:高效的实现对变化中的数据进行快速分析及决策辅助.当前Demo基于近实时交互式BI分 ...

  2. 【2017年第1期】智慧城市多源异构大数据处理框架

    刘岩1,王华2,秦叶阳3,朱兴杰1 1. 泰康保险集团股份有限公司数据信息中心,北京  102206 2. 中国人民大学,北京  100872 3. 北京大学,北京  100871 摘要:智慧城市建设 ...

  3. Flink实时数据处理实践经验(Flink去重、维表关联、定时器、双流join)

    Flink实时数据处理实践经验 文章目录 Flink实时数据处理实践经验 1. 数据输入与预处理 2. 实时数据处理 3. 实时数仓架构 4. 优化方案 Java.大数据开发学习要点(持续更新中-) ...

  4. java api 设计_Java API设计实践

    使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...

  5. 京东千万并发 API 网关实践之路!

    来源:京东零售技术(id:jd-sys) 链接:京东API网关实践之路 概述 1 背景 京东作为电商平台,近几年用户.业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生. API网关 ...

  6. java 最小化 api_Java的API设计实践

    Introduction 了解在设计Java API时应该应用的一些API设计实践.通常,这些实践很有用,并确保API可以在模块化环境中正确使用,例如OSGi和Java平台模块系统(JPMS).有些做 ...

  7. 核心API最佳实践——JDK日志分级

    核心API最佳实践--JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小] 日志(Log)是什么?字典对其的解释是"对某种机器工作 ...

  8. 云原生架构下的 API 网关实践: Kong (二)

    Kong 是 Mashape 开源的一款云原生架构下的分布式 API 网关,其性能和可扩展性在同类组件中,表现都很优异.Kong 官方提供了很多直接可用的插件,此外,Kong 还可以通过插件扩展已有功 ...

  9. 广告深度学习计算:异构硬件加速实践

    丨目录: - 前沿 1. 算力需求与供给 1.1 算力需求:模型复杂度 1.2 算力供给:异构硬件计算能力 1.3 问题与优化方法 2. 算法-系统-硬件协同性能优化 2.1 算法优化 2.2 系统优 ...

最新文章

  1. java编程连接mysql_Java编程学习之JDBC连接MySQL
  2. mysql修改表结构大表_在线修改MySQL大表的表结构
  3. mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...
  4. JPEG2000开发SDK及其特点
  5. 机器成为家人!华为发布2025十大趋势展望...
  6. vSAN其实很简单-如何处理“vSAN磁盘写满”问题?
  7. HDU 1301 - Jungle Roads( Prim求最小生成树 )
  8. 目标检测——如何让模型过拟合
  9. HDU-1429 胜利大逃亡(续)
  10. 记一次复杂的正则匹配——匹配但不包含
  11. 一个完整的Java Web项目需要掌握哪些技术
  12. android自定义pickerview,一个非常好用的Android PickerView库
  13. SpringBoot项目整合JasperReport报表生成PDF并下载
  14. 模糊逻辑基本原理与编程
  15. CSS精灵优化Retina显示屏下的网站图像
  16. RK系列SDK -- Android HFP蓝牙通话音频处理(蓝牙音箱方案)
  17. 试验设计方法与Design-Expert软件应用目录
  18. php 随机字符串函数,PHP 生成随机字符串的方法函数
  19. Linux 使用docker搭建MySQL服务的一些细节问题
  20. 使用Portia时docker-compose失败 /bin/sh: 1: /app/provision.sh: Permission denied

热门文章

  1. 智慧停车系统是怎么运行的?
  2. Anaconda——最省心的 Python 版本
  3. 各种群体寻优算法的比较
  4. Spring MVC中的Model, ModelMap, 和ModelAndView
  5. MT6737/MT6737T/MT6737M处理器参数差异分析资料
  6. 3DMAX 隐藏显示物体的快捷键
  7. 湖南天才少女姚婷:刚毕业就被华为156万年薪邀请,来历不简单
  8. html转换到pdf转换器,HTML转换到PDF转换器
  9. 多少卡路里,我应该吃是错误的
  10. 花青素近红外荧光染料Cyanine5 hydrazide,Cy5 hydrazide,1427705-31-4深蓝色粉末状