AG-Merge
Framework d'agrégation de données de Spring Cloud Cross-Service
Résoudre le problème
Résolvez la douleur de diviser les propriétés de la pagination des données après avoir divisé le service Cloud Spring ou les attributs des objets individuels. Il prend en charge l'injection automatique et la transformation des attributs de données statiques (dictionnaire de données) et des données de clé primaire dynamique, parmi lesquelles les données statiques agrégées seront stockées mixtes de premier niveau (goyave).
Prenez un châtaignier:
Deux services, un tableau du service A utilise la valeur d'un tableau du service B. Lorsque nous interrogeons le tableau du service A, nous agrégeons les valeurs d'un tableau du service B dans le processus de service de requête A.
Exemple
Pour un exemple de code spécifique, vous pouvez voir le module Ace-Merge-Demo.
| -------- Centre d'enregistrement Ace-Eureka | -------- Ace-Data-Merge-Demo Query Data, Exemple d'agrégation ici | -------- Ace-Data-Provider Datavider
Maven ajoute des dépendances
<dependency> <proupId> com.github.wxiaoqi </rompuprid> <letfactId> Ace-Merge-core </refactive> <version> 2.0-snapshot </-version> </ Dependency>
Configuration de l'entrepôt recommandé
<Depositories> <Fepository> <id> OSS </id> <name> oss </name> <url> https://oss.sonatype.org/content/groups/public </url> </papository> </sispository>
Démarrer l'annotation des cours
@EnableAcemerge
Configuration application.yml
# Merge des données de service croisé Merge: Activé: True GuavacachemAxSize: 1000 GuavacachereFreshwriteTime: 10 # Min GuavacachereFreshThreadPoolSize: 10 AOP: # Comment démarrer les annotations, Aggrégation automatique activé: True
Exemple de code (les données de l'objet Flag @MergeField doivent être agrégées)
@Retention (retentionPolicy.runtime) @target (value = {elementType.Method, elementType.Type, elementType.field}) public @Interface Mergefield {/ ** * Query Value * @return * / String key () Default ""; / ** * Classe cible * @return * / class <? étend objet> feign () objet par défaut.class; / ** * Méthode d'appel * @return * / string méthode () par défaut ""; / ** * s'il faut fusionner les valeurs d'attribut comme valeurs de requête * @return * / booléen isvalueneedmerge () par défaut false;} Objets agrégés
classe publique User {Nom de chaîne privée; // Attributs qui nécessitent une agrégation @mergeField (key = "test", feign = iService2.class, method = "writeLog") private String Sex; // Attributs qui nécessitent une agrégation @mergefield (feign = iService2.class, méthode = "getCitys", isValueNeedMerge = true) private String City; Utilisateur public (nom de chaîne, String Sex, String City) {this.name = name; this.sex = sexe; this.city = ville; } public String getCity () {return City; } public void setCity (String City) {this.city = ville; } public utilisateur (nom de chaîne) {this.name = name; } Utilisateur public (nom de chaîne, String Sex) {this.name = name; this.sex = sexe; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public String getSEX () {return sexe; } public void setSex (String Sex) {this.sex = sexe; }} Méthode de la source de données agrégée (l'exemple est via FeignClient, ou il peut s'agir d'un objet de bean de ressort local)
Exigences spéciales: le paramètre d'entrée doit être une chaîne et la valeur de retour doit être map <string, string>. La composition de la valeur de retour est la clé et la valeur correspondante de l'attribut d'objet agrégé.
@FeignClient ("Test") Interface publique Iservice2 {@RequestMapping ("Car / Do") Map public <String, String> WriteLog (String Test); @RequestMapping ("Car / City") Public Map <String, String> getCitys (String IDS);}Interface de service à distance correspondante
/ ** * @author ace * @create 2017/11/20. * / @ RestController @ requestmapping ("car") public class Service2rest {private logger logger = loggerfactory.getLogger (service2rest.class); @RequestMapping ("DO") MAP PUBLIC <String, String> WriteLog (String Test) {Logger.info ("Service 2 Écrit Log!"); Map <string, string> map = new hashmap <string, string> (); map.put ("man", "mâle"); map.put ("femme", "femme"); carte de retour; } @RequestMapping ("City") Public Map <String, String> getCity (String ids) {logger.info ("Service 2 écrit log!" + Ids); Map <string, string> map = new hashmap <string, string> (); map.put ("1", "guangzhou"); map.put ("2", "wuhan"); carte de retour; }} Classe de biz qui agrége les objets (la méthode suivante consiste à utiliser l'annotation de scan AOP)
@ Service @ slf4jpublic class userBiz {@Autowired private Mergecore Mergecore; / ** * Méthode d'agrégation de l'annotation AOP * La valeur de retour de la méthode d'agrégation doit être répertoriée, * S'il s'agit d'un objet complexe, vous devez personnaliser votre propre analyseur d'agrégation (implémentation de l'interface iMerGereSultParser) * / @MergereSult (resultParser = TestMergerSultParser.Class) Liste publiquent ArrayList <User> (); pour (int i = 1000; i> 0; i--) {users.add (nouvel utilisateur ("zhangsan" + i, "man", "1")); users.add (nouvel utilisateur ("Lisi" + i, "femme", "2")); users.add (nouvel utilisateur ("wangwu" + i, "unkonwn", "2")); } retourne les utilisateurs; } / ** * Méthode d'agrégation manuelle * @Return * / public List <Derser> getUser () {ArrayList <User> Users = new ArrayList <User> (); pour (int i = 1000; i> 0; i--) {users.add (nouvel utilisateur ("zhangsan" + i, "man", "1")); users.add (nouvel utilisateur ("Lisi" + i, "femme", "2")); users.add (nouvel utilisateur ("wangwu" + i, "unkonwn", "2")); } essayez {// lister l'agrégation MergeCore.MergeResult (user.class, utilisateurs); // AGLÉGATION D'OBJET UNIQUE // MERGECORE.MergeOne (user.class, users.get (0)); } catch (exception e) {log.Error ("Échec de l'agrégation de données", e); } enfin {return utilisateurs; }}}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.