Introduction
J'ai toujours cru que PHP avait désormais progressé dans le domaine de l'ingénierie. Dans le passé, les développeurs PHP considéraient la vitesse comme une beauté, et vitesse et évolutivité étaient toujours contradictoires. Les projets PHP d'aujourd'hui, en particulier les projets de plus grande envergure, ont progressivement évolué vers un niveau qui nécessite à la fois de l'ingénierie et de l'échelle. Ingénierer un code, c’est évoluer vers une architecture de plus en plus complexe. Pour les architectures complexes, les microservices sont souvent un bon choix.
J'avais besoin de cette question dans un projet récent. J'ai besoin de développer un service de cartographie. Ce service ne se présente bien sûr pas sous la forme d'une simple bibliothèque de classes, mais possède sa propre base de données et sa propre interface de service. Dans ce cas, la meilleure option est la servitisation. Bien sûr, il existe de nombreuses façons de fournir des services, telles que Thrift, HTTP, etc. Mais j'ai évalué l'environnement actuel du département. PHP est le langage dominant, et la progression de mon projet est également relativement serrée. À mes yeux, Thrift, HTTP et d'autres méthodes utilisent toutes des protocoles réseau pour réaliser le découplage des services. solution. Je pense que cette approche n'est pas nécessaire lorsque le projet n'est pas clairement dans un état critique. L’inconvénient de l’utilisation de la servitisation du protocole réseau est qu’elle introduit une complexité significative. Cette complexité nécessite souvent un investissement en main d’œuvre, en ressources matérielles et en temps. J'espère donc pouvoir fournir une "bibliothèque de classes de service" dans le langage PHP pour le développement.
Ce à quoi je pense, c'est le Composer de PHP.
Modification du compositeur
Créer une bibliothèque de services
Tout d'abord, je dois séparer ma "bibliothèque de services" de mon application (nommée xxx/main1). Cette indépendance, j'ai au lieu de choisir de créer un répertoire à l'intérieur. l'application (en fait j'ai pensé à créer un répertoire tel que Services). Cependant, si le code est couplé au programme commercial, j'estime qu'en raison de la paresse humaine, il est difficile de se contrôler du début à la fin et d'insister pour ne pas utiliser diverses fonctions pratiques dans l'application. Mon choix est donc de créer un nouveau projet dans le référentiel Git et de le nommer xxx/mapService.
composer.json
Il y a maintenant deux projets Git (xxx/main1 et xxx/mapService). J'ai ajouté l'instruction suivante au fichier composer.json dans main1 :
Et dans le composer.json de). mapService Comme suit :
Cette configuration indique le projet main1, l'adresse Git de mapService et la version qui doit être utilisée.
Bien sûr, vous devez faire attention aux points suivants :
Enfin, utilisez composer update -vvv pour télécharger le mapService dont nous avons besoin et placez-le dans le répertoire du fournisseur.
Mises à jour et modifications
Notre éditeur actuel est dans le projet main1. Si nous éditons ou modifions le projet mapService et que nous souhaitons le fusionner dans la branche master de mapService, nous pouvons entrer directement dans le répertoire vender/xxx/mapService. Effectuez les opérations correspondant à Git. Cela permet des modifications directes du code.
Configuration indépendante
Cette combinaison structurelle n'est que la première étape pour achever la longue marche de milliers de kilomètres. Ce qui est plus important plus tard, c'est que lors de l'écriture de ce service, je dois toujours me rappeler de ne pas tout utiliser dans main1, afin de maintenir l'indépendance de mapService (l'indépendance est l'une des conditions nécessaires à la servitisation). Par exemple, le premier problème que j’ai rencontré était que le fichier de configuration devait être indépendant.
Ma méthode d'implémentation consiste à créer une classe Config directement dans mapService, et la configuration est directement écrite dans cette classe.
J'ai toujours pensé que l'implémentation de ce fichier de configuration était un peu frustrante, car de cette façon, ce fichier de configuration entre dans la bibliothèque Git. Mais je ne peux vraiment pas penser à une meilleure solution. Il existe un moyen dans Laravel de créer Config dans le dossier de configuration de Laravel en implémentant ServiceProvider, mais cette méthode ne s'applique qu'à Laravel. Il n’y a pas d’universalité. D'un autre côté, je pense que la base de données utilisée par le service fait elle-même partie du service, et cela ne semble rien avoir à voir avec sa mise dans la bibliothèque Git du service. "Structure des répertoires" Interaction avec la base de données
Node.php implémente une interface spécifique
La chose la plus importante à propos du service est le protocole d'interface. Créez donc un dossier Contrats et interfacez les services fournis. La gestion des exceptions de l'interface doit essayer d'utiliser des exceptions au lieu de codes d'erreur pour l'interaction. Et ces exceptions doivent être personnalisées autant que possible. De cette manière, il existe la possibilité d’un traitement unifié au niveau supérieur.La différence entre le sous-arbre et le sous-module de Git
En fait, ces trois méthodes sont les mêmes dans la fin Utilisez un projet comme bibliothèque de classes pour un autre projet. SubTree et SubModule sont des solutions Git. Composer est une solution pour le langage PHP En plus de la fonction d'ajout d'un projet à un autre projet, il fournit également des solutions telles que l'ajout de versions et de solutions de dépendances. Si votre projet est en PHP, utiliser Composer est sans aucun doute un meilleur choix.
Serviceisation ultérieure du protocoleSi mon mapService souhaite devenir un service de protocole plus tard, alors ce projet mapService peut être simplifié en un SDK. Pour la logique métier de couche supérieure, utilisez simplement composer update pour le mettre à jour.
Enregistrement et découverte des servicesCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!