AG-Merge

Spring Cloud 跨服务数据聚合框架

解决问题

解决Spring Cloud服务拆分后分页数据的属性或单个对象的属性拆分之痛, 支持对静态数据属性(数据字典)、动态主键数据进行自动注入和转化, 其中聚合的静态数据会进行一级混存(guava).

示例

具体示例代码可以看ace-merge-demo模块

|------- ace-eureka 注册中心

|------- ace-data-merge-demo 查询数据,此处聚合示例

|------- ace-data-provider 数据提供者

Maven添加依赖

com.github.wxiaoqi

ace-merge-core

2.0-SNAPSHOT

启动类加注解

@EnableAceMerge

application.yml配置

# 跨服务数据合并

merge:

enabled: true

guavaCacheNumMaxSize: 1000

guavaCacheRefreshWriteTime: 10 # min

guavaCacheRefreshThreadPoolSize: 10

aop: # 启动注解的方式,自动聚合

enabled: true

代码示例(@MergeField标志对象的数据需要聚合)

@Retention(RetentionPolicy.RUNTIME)

@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})

public @interface MergeField {

/**

* 查询值

* @return

*/

String key() default "";

/**

* 目标类

* @return

*/

Class extends Object> feign() default Object.class;

/**

* 调用方法

* @return

*/

String method() default "";

/**

* 是否以属性值合并作为查询值

* @return

*/

boolean isValueNeedMerge() default false;

}

聚合对象

public class User {

private String name;

// 需要聚合的属性

@MergeField(key="test", feign = IService2.class,method = "writeLog")

private String sex;

// 需要聚合的属性

@MergeField(feign = IService2.class,method = "getCitys",isValueNeedMerge = true)

private String city;

public User(String name, String sex, String city) {

this.name = name;

this.sex = sex;

this.city = city;

}

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

public User(String name) {

this.name = name;

}

public User(String name, String sex) {

this.name = name;

this.sex = sex;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}

聚合数据来源方法(示例为通过FeignClient,也可以是本地的spring bean对象)

特别要求:入参必须为一个String,返回值必须为Map. 其中返回值的构成,就是聚合对象属性的key和对应的value.

@FeignClient("test")

public interface IService2 {

@RequestMapping("car/do")

public Map writeLog(String test);

@RequestMapping("car/city")

public Map getCitys(String ids);

}

对应的远程服务接口

/**

* @author ace

* @create 2017/11/20.

*/

@RestController

@RequestMapping("car")

public class Service2Rest {

private Logger logger = LoggerFactory.getLogger(Service2Rest.class);

@RequestMapping("do")

public Map writeLog(String test){

logger.info("service 2 is writing log!");

Map map = new HashMap();

map.put("man","男");

map.put("woman","女");

return map;

}

@RequestMapping("city")

public Map getCity(String ids){

logger.info("service 2 is writing log!"+ids);

Map map = new HashMap();

map.put("1","广州");

map.put("2","武汉");

return map;

}

}

聚合对象的Biz类(下面的方式是采用aop扫描注解的方式)

@Service

@Slf4j

public class UserBiz {

@Autowired

private MergeCore mergeCore;

/**

* aop注解的聚合方式

* 其中聚合的方法返回值必须为list,

* 如果为复杂对象,则需要自定义自己的聚合解析器(实现接口IMergeResultParser)

*/

@MergeResult(resultParser = TestMergeResultParser.class)

public List getAopUser() {

ArrayList users = new ArrayList();

for (int i = 1000; i > 0; i--) {

users.add(new User("zhangsan" + i, "man", "1"));

users.add(new User("lisi" + i, "woman", "2"));

users.add(new User("wangwu" + i, "unkonwn", "2"));

}

return users;

}

/**

* 手动聚合方式

* @return

*/

public List getUser(){

ArrayList users = new ArrayList();

for (int i = 1000; i > 0; i--) {

users.add(new User("zhangsan" + i, "man", "1"));

users.add(new User("lisi" + i, "woman", "2"));

users.add(new User("wangwu" + i, "unkonwn", "2"));

}

try {

// list 聚合

mergeCore.mergeResult(User.class,users);

// 单个对象聚合

// mergeCore.mergeOne(User.class,users.get(0));

} catch (Exception e) {

log.error("数据聚合失败",e);

}finally {

return users;

}

}

}

JAVA数据聚合服务_Spring Cloud 跨服务数据聚合小框架相关推荐

  1. sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...

    Spring Cloud微服务架构中的数据权限DataPermision实现方案 一.出现原因 在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermis ...

  2. hystrix 单独使用_Spring cloud微服务架构-Hystrix工作原理(微服务故障熔断)

    流程图 下图显示了通过Hystrix向服务依赖项请求时发生的情况: 以下各节将更详细地说明此流程: 1.构造一个HystrixCommand或HystrixObservableCommand对象 第一 ...

  3. mysql微服务查询问题_【mysql】微服务架构下跨服务查询的聚合有什么好的方案?...

    微服务架构中,每个服务都有自己的独立数据库. 然而现在有个需求,需要生成一张实时的报表,该报表包含两个服务的数据. 如服务A,服务B.B中仅包含A的主键id作为关联. 而此报表的搜索条件包含A服务实体 ...

  4. springcloud项目的启动顺序_Spring Cloud微服务项目完整示例,含注册中心,网关,断路器等等...

    Spring Cloud微服务项目完整示例 目的是为了演示基于Spring Cloud微服务框架,搭建一个接近业务实际场景的项目,只实现了后端项目,前端可以使用VUE或者其他框架. 后端框架包括注册中 ...

  5. blog微服务架构代码_Spring Cloud微服务架构代码结构详细讲解

    上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity ...

  6. eureka 客户端服务启动了又失败了_Spring cloud Eureka服务注册与发现详解

    一.Eureka概述 (1)Eureka是什么 Eureka是一个用于服务注册与发现的框架,本身是一个基于Rest的服务. (2)Eureka的组件有哪些? Eureka的组件可分为Eureka Se ...

  7. java断路器触发条件_Spring Cloud:第四章:Hystrix断路器

    Hystrix "豪猪",具有自我保护的能力.hystrix 通过如下机制来解决雪崩效应问题. 资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务 ...

  8. consul java 注册中心_Spring Cloud微服务架构实战之Consul注册中心02:consul入门案例...

    获取springcloud实战项目详细视频教程,请留言联系. 1.创建项目 我们创建聚合项目来讲解 Consul,首先创建一个 pom 父工程. 2.添加依赖 pom.xml 4.0.0 com.ex ...

  9. feign调用多个服务_Spring Cloud多个微服务之间调用代码实例

    这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user ...

  10. 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构

    Spring Cloud Alibaba Sidecar 介绍 自 Spring Cloud Alibaba 2.1.1 版本后增加了 spring-cloud-alibaba-sidecar 模块作 ...

最新文章

  1. 中标麒麟桌面版yum安装mysql_中标麒麟Neokylin6桌面版如何本地yum安装软件
  2. 让陌生人迅速相爱的36个问题
  3. C#WebBrowser控件使用教程与技巧收集
  4. leetcode 322. Coin Change | 322. 零钱兑换(动态规划)
  5. mysql数据库的优缺点
  6. Nokia 920全部CODE
  7. docker $PWD路径_Docker 技术系列之安装Redis单机版和集群版
  8. raster | R语言中的空间栅格对象及其基本处理方法(Ⅳ):数据聚合、重采样
  9. 虚拟化平台cloudstack(4)——几个异常
  10. 使用memcpy()时报错
  11. 「leetcode」112. 路径总和113. 路径总和II(详解)递归函数究竟什么时候需要返回值,什么时候不要返回值?
  12. 【袋鼠云内推】杭州-高级java开发-3~5以及5年以上
  13. Win10应用设计的那些事儿
  14. EXCEL如何批量调整图片大小?
  15. 助力金融科技产业发展 360金融AI之夜成功举办
  16. [Algorithm] Find The Vowels
  17. 云服务器ECS远程监控
  18. 汶川大地震中的SAP成都研究院
  19. “'react-scripts' 不是内部或外部命令,也不是可运行的程序或批处理文件。”解决方法
  20. 基于51单片机的小车五路寻迹程序与PWM驱动(有详细注释),下载可直接使用

热门文章

  1. 2010中国移动开发者大会21日开幕 揭密五大亮
  2. 简信CRM:CRM科学服务体系,促进企业销售增长
  3. 探索学习 Vue 组件篇 第二篇 组件类型:非单文件组件
  4. 命令查看计算机出厂时间,Check cosmetics or perfume production date and shelf life by the batch code....
  5. 【cs230】吴恩达Deep Learning-3/3
  6. Words study
  7. 什么是CDN,简单了解CDN
  8. HashSet的遍历和使用特点
  9. 基于深度学习的目标检测的IOU损失函数介绍
  10. 博士申请 | 蒙纳士大学(苏州)陈存建老师招收人工智能方向全奖博士生