詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
AG-Merge
Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
解決問題
解決Spring Cloud服務(wù)拆分后分頁(yè)數(shù)據(jù)的屬性或單個(gè)對(duì)象的屬性拆分之痛, 支持對(duì)靜態(tài)數(shù)據(jù)屬性(數(shù)據(jù)字典)、動(dòng)態(tài)主鍵數(shù)據(jù)進(jìn)行自動(dòng)注入和轉(zhuǎn)化, 其中聚合的靜態(tài)數(shù)據(jù)會(huì)進(jìn)行 一級(jí)混存 (guava).
舉個(gè)栗子:
兩個(gè)服務(wù),A服務(wù)的某張表用到了B服務(wù)的某張表的值,我們?cè)趯?duì)A服務(wù)那張表查詢的時(shí)候,把B服務(wù)某張表的值聚合在A服務(wù)的那次查詢過程中
示例
具體示例代碼可以看 ace-merge-demo 模塊
|------- ace-eureka 注冊(cè)中心 |------- 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>
推薦倉(cāng)庫(kù)配置
<repositories> <repository> <id>oss</id> <name>oss</name> <url>https://oss.sonatype.org/content/groups/public</url> </repository> </repositories>
啟動(dòng)類加注解
@EnableAceMerge
application.yml配置
# 跨服務(wù)數(shù)據(jù)合并 merge: enabled: true guavaCacheNumMaxSize: 1000 guavaCacheRefreshWriteTime: 10 # min guavaCacheRefreshThreadPoolSize: 10 aop: # 啟動(dòng)注解的方式,自動(dòng)聚合 enabled: true
代碼示例( @MergeField 標(biāo)志對(duì)象的數(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; }
聚合對(duì)象
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對(duì)象)
特別要求:入?yún)⒈仨殲橐粋€(gè)String,返回值必須為Map<String,String>. 其中返回值的構(gòu)成,就是聚合對(duì)象屬性的key和對(duì)應(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); }
對(duì)應(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; } }
聚合對(duì)象的Biz類(下面的方式是采用aop掃描注解的方式)
@Service @Slf4j public class UserBiz { @Autowired private MergeCore mergeCore; /** * aop注解的聚合方式 * 其中聚合的方法返回值必須為list, * 如果為復(fù)雜對(duì)象,則需要自定義自己的聚合解析器(實(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; } /** * 手動(dòng)聚合方式 * @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è)對(duì)象聚合 // mergeCore.mergeOne(User.class,users.get(0)); } catch (Exception e) { log.error("數(shù)據(jù)聚合失敗",e); }finally { return users; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(8)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07Java編程數(shù)組中最大子矩陣簡(jiǎn)便解法實(shí)現(xiàn)代碼
這篇文章主要介紹了Java編程數(shù)組中最大子矩陣簡(jiǎn)便解法實(shí)現(xiàn)代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用java數(shù)組 封裝自己的數(shù)組操作示例
這篇文章主要介紹了使用java數(shù)組 封裝自己的數(shù)組操作,結(jié)合實(shí)例形式分析了java數(shù)組索引、遍歷等相關(guān)封裝操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03Java實(shí)現(xiàn)Swing組件定制Button示例
這篇文章主要介紹了Java實(shí)現(xiàn)Swing組件定制Button,涉及java Swing組件Button相關(guān)屬性設(shè)置與使用操作技巧,需要的朋友可以參考下2018-01-01SpringBoot詳細(xì)分析自動(dòng)裝配原理并實(shí)現(xiàn)starter
相對(duì)于傳統(tǒng)意義上的Spring項(xiàng)目,SpringBoot具有開箱即用,簡(jiǎn)化配置,內(nèi)置Tomcat等等等等一系列的特點(diǎn)。在這些特點(diǎn)中,最重要的兩條就是約定優(yōu)于配置和自動(dòng)裝配2022-07-07SpringBoot處理大量請(qǐng)求數(shù)據(jù)的傳輸問題的方法小結(jié)
在Spring?Boot項(xiàng)目常常需要中處理大量請(qǐng)求數(shù)據(jù)的傳輸問題,這篇文章主要為大家整理了一些常用的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01java工廠實(shí)例BeanFactoryPostProcessor和BeanPostProcessor區(qū)別分析
這篇文章主要為大家介紹了BeanFactoryPostProcessor和BeanPostProcessor區(qū)別示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07