2017-10-18 25 views
0

Je construis une application printemps-boot + Grails en utilisant Grails 3.3.0 et printemps-boot 1.5.6.RELEASEContexte de construction (client à la consommation) d'application de printemps spécifique

Je contrôleur au service des données JSON à l'application client à la consommation .

ExampleController.groovy

class ExampleCotnroller { 

    def endpointServerJosn(){ 
    } 
} 

Récemment, un plus grand public a été introduit et les données attend JSON similaires, mais à partir d'une autre source.

J'ai donc ajouté un drapeau à mon application.yml another.client = true et modifié mon contrôleur:

Mise à jour ExampleController.groovy

class ExampleCotnroller { 

    def endpointServerJosn(){ 
     if(another.client){ 
      //server data from this client's source 
     }else{ 
      //server data from other client's source 
     } 
    } 
} 

Mais je suis plus mis en attendent de clients et cela va gâcher mon contrôleur car je ne trouve pas ma solution évolutive par conception. Ici, chaque client possède son propre contrôleur d'API esclave pour récupérer les données.

client 1 envoie la demande -> maître (mon contrôleur) intercepte, appelle un minerai API plus esclaves liés au client, extrait des données et des granulats, il et envoie des données de retour

simiallarly, client 2 envoie une demande -> maître (mes contrôleurs) INTERCEPTE, appelle un ou plusieurs API esclaves liés au client 2

Je pensais avoir un contrôleur abstrait comme:

Est-il possible de réaliser une solution évolutive avec la conception ci-dessus?
class AbstractApplicationController{ 

     def endpointServerJson(); 
} 

class FirstCilentController extends AbstractApplicationController { 
} 

class SecondClientController extends AbstractApplicationController { 
} 

L'application peut-elle choisir quel contrôleur utiliser en fonction de la configuration dans yml externe ou application.yml?

Répondre

0

À mon avis, vous décrivez le problème de Multitenancy. De wikipedia:

Le terme « logiciel mutualisée » fait référence à une architecture logicielle dans laquelle une seule instance de logiciel fonctionne sur un serveur et sert plusieurs [...] utilisateurs qui partagent un accès commun avec des privilèges spécifiques à l'instance de logiciel.

Source: https://en.wikipedia.org/wiki/Multitenancy

Je vous conseille de commencer des recherches sur le concept de mutualisée longuement avant d'appliquer le code plus.Il y a beaucoup de ressources là-bas, mais ce lien est une excellente introduction:

https://fizzylogic.nl/2016/01/24/make-your-spring-boot-application-multi-tenant-aware-in-2-steps/

Enfin, si en effet vous êtes soumis à des contraintes de temps terribles. Il me semble que vous devriez créer une couche d'accès aux données agnostique client ou un ensemble de services sous votre contrôleur qui fournit des méthodes pour récupérer des données et accepte l'identificateur de client comme argument. Par exemple:

class ExampleCotnroller { 

    def endpointServerJosn() { 
     return clientDataService.getData(clientID); 
    } 

}