詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
AG-Merge
Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
解決問題
解決Spring Cloud服務(wù)拆分后分頁數(shù)據(jù)的屬性或單個(gè)對象的屬性拆分之痛, 支持對靜態(tài)數(shù)據(jù)屬性(數(shù)據(jù)字典)、動態(tài)主鍵數(shù)據(jù)進(jìn)行自動注入和轉(zhuǎn)化, 其中聚合的靜態(tài)數(shù)據(jù)會進(jìn)行 一級混存 (guava).
舉個(gè)栗子:
兩個(gè)服務(wù),A服務(wù)的某張表用到了B服務(wù)的某張表的值,我們在對A服務(wù)那張表查詢的時(shí)候,把B服務(wù)某張表的值聚合在A服務(wù)的那次查詢過程中
示例
具體示例代碼可以看 ace-merge-demo 模塊
|------- ace-eureka 注冊中心 |------- ace-data-merge-demo 查詢數(shù)據(jù),此處聚合示例 |------- ace-data-provider 數(shù)據(jù)提供者
Maven添加依賴
<dependency> <groupId>com.github.wxiaoqi</groupId> <artifactId>ace-merge-core</artifactId> <version>2.0-SNAPSHOT</version> </dependency>
推薦倉庫配置
<repositories>
<repository>
<id>oss</id>
<name>oss</name>
<url>https://oss.sonatype.org/content/groups/public</url>
</repository>
</repositories>
啟動類加注解
@EnableAceMerge
application.yml配置
# 跨服務(wù)數(shù)據(jù)合并 merge: enabled: true guavaCacheNumMaxSize: 1000 guavaCacheRefreshWriteTime: 10 # min guavaCacheRefreshThreadPoolSize: 10 aop: # 啟動注解的方式,自動聚合 enabled: true
代碼示例( @MergeField 標(biāo)志對象的數(shù)據(jù)需要聚合)
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
public @interface MergeField {
/**
* 查詢值
* @return
*/
String key() default "";
/**
* 目標(biāo)類
* @return
*/
Class<? extends Object> feign() default Object.class;
/**
* 調(diào)用方法
* @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;
}
}
聚合數(shù)據(jù)來源方法(示例為通過FeignClient,也可以是本地的spring bean對象)
特別要求:入?yún)⒈仨殲橐粋€(gè)String,返回值必須為Map<String,String>. 其中返回值的構(gòu)成,就是聚合對象屬性的key和對應(yīng)的value.
@FeignClient("test")
public interface IService2 {
@RequestMapping("car/do")
public Map<String, String> writeLog(String test);
@RequestMapping("car/city")
public Map<String, String> getCitys(String ids);
}
對應(yīng)的遠(yuǎn)程服務(wù)接口
/**
* @author ace
* @create 2017/11/20.
*/
@RestController
@RequestMapping("car")
public class Service2Rest {
private Logger logger = LoggerFactory.getLogger(Service2Rest.class);
@RequestMapping("do")
public Map<String,String> writeLog(String test){
logger.info("service 2 is writing log!");
Map<String,String> map = new HashMap<String, String>();
map.put("man","男");
map.put("woman","女");
return map;
}
@RequestMapping("city")
public Map<String,String> getCity(String ids){
logger.info("service 2 is writing log!"+ids);
Map<String,String> map = new HashMap<String, String>();
map.put("1","廣州");
map.put("2","武漢");
return map;
}
}
聚合對象的Biz類(下面的方式是采用aop掃描注解的方式)
@Service
@Slf4j
public class UserBiz {
@Autowired
private MergeCore mergeCore;
/**
* aop注解的聚合方式
* 其中聚合的方法返回值必須為list,
* 如果為復(fù)雜對象,則需要自定義自己的聚合解析器(實(shí)現(xiàn)接口IMergeResultParser)
*/
@MergeResult(resultParser = TestMergeResultParser.class)
public List<User> getAopUser() {
ArrayList<User> users = new ArrayList<User>();
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<User> getUser(){
ArrayList<User> users = new ArrayList<User>();
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);
// 單個(gè)對象聚合
// mergeCore.mergeOne(User.class,users.get(0));
} catch (Exception e) {
log.error("數(shù)據(jù)聚合失敗",e);
}finally {
return users;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
jmeter中json提取器如何提取多個(gè)參數(shù)值
關(guān)于jmeter中的正則表達(dá)式及json提取器可以提取響應(yīng)值,但是實(shí)際可以需要上個(gè)接口的多個(gè)響應(yīng)值,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11
AndroidHttpClient使用Cookie應(yīng)用分析
今天想把一個(gè)用使用了HttpClient的自動簽到小程序移植到Android上,還好Android的SDK自帶了HttpClient的包.當(dāng)然也可以繼續(xù)使用DefaultHttpClient,但用為Android定制的AndroidHttpClient自然更好2012-11-11
mybatis插件優(yōu)雅實(shí)現(xiàn)字段加密的示例代碼
在很多時(shí)候,我們都需要字段加密,比如郵箱,密碼,電話號碼等,本文主要介紹了mybatis插件優(yōu)雅實(shí)現(xiàn)字段加密的示例代碼,感興趣的可以了解一下2023-11-11
Springboot詳解線程池與多線程及阻塞隊(duì)列的應(yīng)用詳解
本例應(yīng)用線程池、多線程、阻塞隊(duì)列處理一個(gè)流程任務(wù)。本例處理一個(gè)訂單流程,主要包括生成訂單、訂單處理、訂單入庫,下面我們一起看看2022-06-06
java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector
這篇文章主要為大家介紹了java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
Java中JUC包(java.util.concurrent)下的常用子類
相信大家已經(jīng)對并發(fā)機(jī)制中出現(xiàn)的很多的常見知識點(diǎn)進(jìn)行了總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中JUC包(java.util.concurrent)下的常用子類的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Mybatis使用JSONObject接收數(shù)據(jù)庫查詢的方法
這篇文章主要介紹了Mybatis使用JSONObject接收數(shù)據(jù)庫查詢,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

