跨微服务的数据共享,有两个常用的方法:反应式模式、请求/响应模式。

反应式模式基于已经发生的事件做出本地反应,但不会回复响应,主要的实现方式就是事件消息通信。

最通用的请求/响应式模式实现RESTAPI,通过HTTP协议传输对象。相对反应式模式,实现起来更简单。

这两种方式并非对立的,两者之间互相补充,往往在同一架构中使用同时使用这两种数据共享模式。

跨微服务数据共享会引发一个问题,即领域隔离问题。

多个微服务之间传输领域对象,领域对象的管理问题虽然不复杂,但是很关键。

一个存在潜在风险的处理方式是将公用的领域对象抽离成单独的包,风险在于微服务失去了领域对象的修改权限,往领域模型内自由添加属性变得比较困难。如果限于某个业务的需求,在抽离包中修改了领域对象,会间接影响所有使用该对象的微服务。

另一个备选方案是生成模型的简单副本,微服务汇集本地所有的共享传输对象,拷贝出副本或副本包提供给其他微服务使用。
这种方式的使用,主要基于使用数据传输对象(Data Transfer Object,DTO)。数据使用方不需要维护这些DTO,直接使用反序列化,将传输数据转换为DTO对象。
这种方案的一个关键点是为不同版本API创建不同的DTO对象,否则会给接口使用方带来很大的麻烦。因为,一旦DTO结构发生变化,直接影响数据使用方的反序列化处理。

最灵活的方案是使用“裸响应”,例如直接使用JSON传输。数据使用方可以选择性的反序列化部分属性,这也减弱了数据使用方因传输属性变动而受到的影响。