JAVA数据聚合服务_Spring Cloud 跨服务数据聚合小框架
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 跨服务数据聚合小框架相关推荐
- sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...
Spring Cloud微服务架构中的数据权限DataPermision实现方案 一.出现原因 在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermis ...
- hystrix 单独使用_Spring cloud微服务架构-Hystrix工作原理(微服务故障熔断)
流程图 下图显示了通过Hystrix向服务依赖项请求时发生的情况: 以下各节将更详细地说明此流程: 1.构造一个HystrixCommand或HystrixObservableCommand对象 第一 ...
- mysql微服务查询问题_【mysql】微服务架构下跨服务查询的聚合有什么好的方案?...
微服务架构中,每个服务都有自己的独立数据库. 然而现在有个需求,需要生成一张实时的报表,该报表包含两个服务的数据. 如服务A,服务B.B中仅包含A的主键id作为关联. 而此报表的搜索条件包含A服务实体 ...
- springcloud项目的启动顺序_Spring Cloud微服务项目完整示例,含注册中心,网关,断路器等等...
Spring Cloud微服务项目完整示例 目的是为了演示基于Spring Cloud微服务框架,搭建一个接近业务实际场景的项目,只实现了后端项目,前端可以使用VUE或者其他框架. 后端框架包括注册中 ...
- blog微服务架构代码_Spring Cloud微服务架构代码结构详细讲解
上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity ...
- eureka 客户端服务启动了又失败了_Spring cloud Eureka服务注册与发现详解
一.Eureka概述 (1)Eureka是什么 Eureka是一个用于服务注册与发现的框架,本身是一个基于Rest的服务. (2)Eureka的组件有哪些? Eureka的组件可分为Eureka Se ...
- java断路器触发条件_Spring Cloud:第四章:Hystrix断路器
Hystrix "豪猪",具有自我保护的能力.hystrix 通过如下机制来解决雪崩效应问题. 资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务 ...
- consul java 注册中心_Spring Cloud微服务架构实战之Consul注册中心02:consul入门案例...
获取springcloud实战项目详细视频教程,请留言联系. 1.创建项目 我们创建聚合项目来讲解 Consul,首先创建一个 pom 父工程. 2.添加依赖 pom.xml 4.0.0 com.ex ...
- feign调用多个服务_Spring Cloud多个微服务之间调用代码实例
这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user ...
- 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构
Spring Cloud Alibaba Sidecar 介绍 自 Spring Cloud Alibaba 2.1.1 版本后增加了 spring-cloud-alibaba-sidecar 模块作 ...
最新文章
- 中标麒麟桌面版yum安装mysql_中标麒麟Neokylin6桌面版如何本地yum安装软件
- 让陌生人迅速相爱的36个问题
- C#WebBrowser控件使用教程与技巧收集
- leetcode 322. Coin Change | 322. 零钱兑换(动态规划)
- mysql数据库的优缺点
- Nokia 920全部CODE
- docker $PWD路径_Docker 技术系列之安装Redis单机版和集群版
- raster | R语言中的空间栅格对象及其基本处理方法(Ⅳ):数据聚合、重采样
- 虚拟化平台cloudstack(4)——几个异常
- 使用memcpy()时报错
- 「leetcode」112. 路径总和113. 路径总和II(详解)递归函数究竟什么时候需要返回值,什么时候不要返回值?
- 【袋鼠云内推】杭州-高级java开发-3~5以及5年以上
- Win10应用设计的那些事儿
- EXCEL如何批量调整图片大小?
- 助力金融科技产业发展 360金融AI之夜成功举办
- [Algorithm] Find The Vowels
- 云服务器ECS远程监控
- 汶川大地震中的SAP成都研究院
- “'react-scripts' 不是内部或外部命令,也不是可运行的程序或批处理文件。”解决方法
- 基于51单片机的小车五路寻迹程序与PWM驱动(有详细注释),下载可直接使用
热门文章
- 2010中国移动开发者大会21日开幕 揭密五大亮
- 简信CRM:CRM科学服务体系,促进企业销售增长
- 探索学习 Vue 组件篇 第二篇 组件类型:非单文件组件
- 命令查看计算机出厂时间,Check cosmetics or perfume production date and shelf life by the batch code....
- 【cs230】吴恩达Deep Learning-3/3
- Words study
- 什么是CDN,简单了解CDN
- HashSet的遍历和使用特点
- 基于深度学习的目标检测的IOU损失函数介绍
- 博士申请 | 蒙纳士大学(苏州)陈存建老师招收人工智能方向全奖博士生