前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >微服务架构 | 如何设计基础通用的数据包?

微服务架构 | 如何设计基础通用的数据包?

作者头像
码农架构
发布于 2022-04-13 08:56:16
发布于 2022-04-13 08:56:16
87800
代码可运行
举报
文章被收录于专栏:码农架构码农架构
运行总次数:0
代码可运行

导读:本文主要围绕进行数据接口传值时JSON序列化对于空值问题的处理,通过里流式查降低内存使用。总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发 。

作为后端开发在进行接口调试或者与其他部门日常对接工作的时候,至于数据接口都是一一对应,但是不免很多时候在进行业务针对数据接口有赋空值现象。<key,Null>类型这种现象,但是如果这样赋值在JSON序列化的时候通常会不参与序列到导致服务层无法解析对应的值。

当A服务调用服务数据包结构如下

当 type 和 extendData 两个字段赋值为Null时候的数据包,如果AB服务分开部署(不在同一个JVM)中,那么对于B服务而言在JSON序列化以后得到的数据包如下

两个对应数据相应丢失。

对于上诉场景后端面对的频率非常高,但是此类问题如何基础底层框架一次性解决能?

一、设计基础数据包


后端数据包中除了场景的VO、DO、DTO、BO之类,先前有文章整理过,不熟悉的朋友可以翻阅文章

我这里基于基类设计,对于数据对象而言通常可分为四大部分

▐ 基础数据对象-IData
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 数据对象
 */
public interface IData {
 /**
  * 读-主键
  * 
  * @return
  */
 String getFdId();

 /**
  * 写-主键
  * 
  * @param fdId
  */
 void setFdId(String fdId);

 /**
  * 读-机制类数据
  * 
  * @return
  */
 Map<String, Object> getMechanisms();

 /**
  * 写-机制类数据
  * 
  * @param mechanisms
  */
 void setMechanisms(Map<String, Object> mechanisms);

 /**
  * 读-动态数据
  * 
  * @return
  */
 Map<String, Object> getDynamicProps();

 /**
  * 写-动态属性
  * 
  * @param dynamicProps
  */
 void setDynamicProps(Map<String, Object> dynamicProps);

 /**
  * 读-固定的扩展属性
  * 
  * @return
  */
 @JsonIgnore
 Map<String, Object> getExtendProps();
}
▐ 展示数据对象接口-IViewObject

为什么需要设计IViewObject 展示数据对象接口?

比如在使用Hibernate 时候我们将数据层分为几层数据,因此我们一下所有的数据层都需继承IData

而IViewObject就是展示数据对象和接受数据对象的暴露数据包,所以要想解决空值问题,需要再这一层设计完善

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 界面展现对象接口
 */
public interface IViewObject extends IData {
 /**
  * 读-空值字段
  * 
  * @return
  */
 public List<String> getNullValueProps();

 /**
  * 写-空值字段
  * 
  * @param props
  */
 public void setNullValueProps(List<String> props);

 /**
  * 加-空值字段
  * @param props
  */
 public void addNullValueProps(String... props);
}

VO的字段为null表示不修改Entity,若要讲Entity字段设置为null,请调用addNullValueProps

▐ 展现对象基类-AbstractVO

封装基类数据自然想到了抽象类来实现,这里将继续延续上面的思路往下

AbstractVO 实现IViewObject 方便展示层封装的拓展属性可以继续给其他层级使用。

实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 展示对象基类
 */
public abstract class AbstractVO implements IViewObject {
 private String fdId;

 private transient final Map<String, Object> extendProps = new HashMap<>(16);

 private Map<String, Object> dynamicProps;

 private Map<String, Object> mechanisms;

 private List<String> nullValueProps;

 @Override
 public String getFdId() {
  return fdId;
 }

 @Override
 public void setFdId(String fdId) {
  if (fdId != null) {
   IDGenerator.validate(fdId);
  }
  this.fdId = fdId;
 }

 @Override
 public Map<String, Object> getExtendProps() {
  return extendProps;
 }

 @Override
 public Map<String, Object> getDynamicProps() {
  return dynamicProps;
 }

 @Override
 public void setDynamicProps(Map<String, Object> dynamicProps) {
  this.dynamicProps = dynamicProps;
 }

 @Override
 public Map<String, Object> getMechanisms() {
  return mechanisms;
 }

 @Override
 public void setMechanisms(Map<String, Object> mechanisms) {
  this.mechanisms = mechanisms;
 }

 @Override
 public List<String> getNullValueProps() {
  return nullValueProps;
 }

 @Override
 public void setNullValueProps(List<String> nullValueProps) {
  this.nullValueProps = nullValueProps;
 }

 @Override
 public void addNullValueProps(String... props) {
  if (nullValueProps == null) {
   nullValueProps = new ArrayList<>();
  }
  for (String prop : props) {
   nullValueProps.add(prop);
  }
 }

 @Override
 public int hashCode() {
  return new HashCodeBuilder()
    .append(getClass().getName())
    .append(getFdId()).toHashCode();
 }

 @Override
 public boolean equals(Object other) {
  if (other == null) {
   return false;
  }
  if (!(other instanceof IViewObject)) {
   return false;
  }
  if (!getFdId().equals(((IViewObject) other).getFdId())) {
   return false;
  }
  return getClass().getName()
    .equals(other.getClass().getName());
 }
}

二、业务实现引用


我们举个实际例子。下面是一个 Mapper 类:

基础数据包完善后改如何对接业务场景呢?结合下面的案例来实现场景引用,记得先前写过一篇大文件分片上传的文章以及超大文件断点续传

在定义附件基础信息对象中我们可以这样依赖

写在最后

跬步至千里,小流成江海,开发工作有大小,业务需求有缓急,但终究要落到眼下,从一砖一瓦的基石开始,从一行一列的编码开始,希望本文中能帮助到更多的研发同学。

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java-单机版的书店管理系统(练习设计模块和思想_系列 八 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 七 ) http://blog.csdn.net/qq_26525215/article/details/51190696
谙忆
2021/01/21
9360
Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
项目练习目标 : 1、Java应用程序基本分析 2、培养面向对象编程的基本思想 3、Java基本设计模式综合应用 4、掌握分层和接口的基本设计 5、构建合理的Java应用程序包结构 6、综合应用JSE所学习的知识 7、在应用中合理使用集合框架 8、在应用中综合使用swing的常用组件 9、基本的表现层的实现机制 10、IO流和文件的基本操作 11、培养良好的Java编程习惯 12、培养调试Java程序的能力,培养改错的能力
谙忆
2021/01/21
6030
Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
微服务架构开发实战:SpringCloudBus的设计原理
本节将介绍Spring Cloud Bus的设计原理。理解原理有利于更好地基于Spring Cloud Bus来进行二次开发。
愿天堂没有BUG
2022/10/28
4580
微服务架构开发实战:SpringCloudBus的设计原理
SpringCloud微服务实战:城市数据API微服务的实现
城市数据API微服务包含了城市数据查询组件。城市数据查询组件提供了城市数据查询的接口。
愿天堂没有BUG
2022/10/28
3800
SpringCloud微服务实战:城市数据API微服务的实现
微服务架构案例(02):业务架构设计,系统分层管理
整合流程基础SpringSecurity,JWT等组件开发。所属代码包:mopsz-admin-client。
知了一笑
2019/11/05
8910
微服务架构案例(02):业务架构设计,系统分层管理
四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢?
Java团长
2020/06/04
1.4K0
微服务开源框架TARS 之 基础组件
本文源自herman的系列文章之一《鹅厂开源框架TARS之基础组件》。相关代码已按TARS开源社区最新版本更新。
TARS基金会
2020/09/01
1.1K0
微服务开源框架TARS 之 基础组件
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) ): http://blog.csdn.net/qq_26525215/article/details/51117135
谙忆
2021/01/21
4500
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到D
用户1174983
2018/02/05
1.2K0
SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 ) http://blog.csdn.net/qq_26525215/article/details/51136848
谙忆
2021/01/21
1K0
Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )
微服务项目:尚融宝(27)(后端搭建:注册功能)
注意:将controller包中的UserInfoController移植到controller.api包下
一个风轻云淡
2022/11/15
2180
微服务项目:尚融宝(27)(后端搭建:注册功能)
Mybatis源码解析-执行流程(旧)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
冬天vs不冷
2025/01/20
1100
Mybatis源码解析-执行流程(旧)
手把手教你利用Spring Boot实现通用的接口参数校验
Spring 已经提供了一些注解用于接口参数的验证,但我个人认为这些注解提供的功能还是有限,因此自定义了一些注解。本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP,结合自定义注解实现通用的接口参数校验。
业余草
2020/11/12
8090
手把手教你利用Spring Boot实现通用的接口参数校验
Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
      林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
bear_fish
2018/09/20
1.1K0
Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
【微服务架构】介绍KivaKit框架
关键点 KivaKit是一个模块化Java框架,用于开发需要Java 11+虚拟机但与Java 8源代码兼容的微服务 KivaKit提供了实现应用程序的基本功能,包括命令行解析和应用程序配置 KivaKit组件是轻量级组件,使用广播/侦听器消息传递系统传递状态信息 KivaKit迷你框架,包括转换、验证、资源和日志迷你框架,通过消息传递使用和报告状态信息 KivaKit配置并运行Jetty、Jersey、Swagger和Apache Wicket,以一致的方式提供微服务接口 关键的KivaKit基类也可以
架构师研究会
2022/03/08
4450
微服务项目:尚融宝(41)(核心业务流程:借款额度审批)
列表的结果需要关联查询,数据字典的数据也需要展示对应的文本内容而不是值,除了定义VO的方式,我们也可以使用扩展实体类的方式 
一个风轻云淡
2022/11/15
3760
微服务项目:尚融宝(41)(核心业务流程:借款额度审批)
SpringBoot实现通用的接口参数校验,注解实战
本文介绍基于 SpringBoot和 JDK8编写一个结合自定义注解实现通用的接口参数校验。
搜云库技术团队
2020/02/13
1.1K0
微服务架构之服务冶理Dubbo-服务引用
注:公众号关于dubbo解读文章均基于apache-dubbo-incubating-2.7.1版本,发版于5月26号,此版本注册中心(多数是zookeeper)在某些特殊场景下会出现重复URL地址数据无法删除,导致消费方拿到的是失效地址,从而导致调用失败的问题。如果你也在使用此版本进行源码学习,在网络漂移(下班回家再调试源码)的情况下需要手动删除zookeeper的dubbo节点路径
公众号_松华说
2019/07/16
8650
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
那么如何新增一个自定义的授权模式,比如像下面这样根据手机号和短信验证码进行登录呢?
JAVA日知录
2020/07/31
2.6K0
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上 引子 PropertyAccessor TypeConverter ConfigurablePropertyAccessor TypeConverterSupport TypeConverterDelegate AbstractPropertyAccessor AbstractNestablePropertyAccessor DirectFieldAccessor PropertyAccessor使用Demo PropertyV
大忽悠爱学习
2022/05/10
9550
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上
推荐阅读
相关推荐
Java-单机版的书店管理系统(练习设计模块和思想_系列 八 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档