J'ai un certain nombre de services Web qui forment une application Web. Les clients peuvent accéder à ces services via des appels d'API REST.
Ces services devraient-ils pouvoir communiquer directement entre eux? Si c'est le cas, cela ne les rendrait-il pas contraires au concept des microservices?
Le client doit-il les appeler directement les uns après les autres pour obtenir les données dont il a besoin pour charger une page Web sur le client?
Ou devrais-je avoir une autre couche au-dessus de mes services, qui gère une demande du client, récupère les données de cette demande, puis les renvoie au client?
architecture
rest
microservices
cod3min3
la source
la source
Réponses:
Si vous voulez que vos services ressemblent à cette image, alors oui: ce n'est pas comme si vous ne pouviez pas le faire, mais la plupart du temps cela aura de mauvaises conséquences. La communication via REST ne découplera pas significativement vos services. Lorsque certaines interfaces de service changent, tous les services dépendants doivent très probablement être modifiés et redéployés. De plus, lors du redéploiement du service, vous devrez désactiver tous les services dépendants, ce qui n'est pas considéré comme une bonne conception pour les normes de haute disponibilité.
En fin de compte, vous aurez une application de microservices qui est plus lente que l'application monolithique alternative, mais ayant presque tous les mêmes problèmes!
Je dois être en désaccord avec @Robert Harvey
La base de données d'intégration est un contre -modèle bien connu
Une bien meilleure solution consiste à utiliser un modèle de publication-abonnement afin de rendre la communication entre vos services asynchrone:
S'il vous plaît jetez un œil à la manière CQRS / ES de mettre en œuvre cette méthode de communication, Greg Young et d'autres gars proposent des tonnes de belles vidéos sur le sujet. Juste google pour le mot clé "CQRS / ES". Dans cette approche, chaque service deviendra à la fois éditeur et abonné, permettant ainsi aux services d'être beaucoup moins couplés.
Voici une bonne série d'articles sur les microservices qui éclaire la controverse autour du sujet. Explication très détaillée avec de belles illustrations.
la source
Vous aurez beaucoup de très bonnes idées en lisant ce que Udi Dahan a à dire sur la SOA .
En ce qui concerne spécifiquement la composition de l'interface utilisateur, l'article de Mauro Servienti sur la composition de l'interface utilisateur est un bon point de départ. Voir aussi la vidéo d'Udi, disponible ici .
Si deux services échangent des messages, vous obtiendrez un couplage. La principale réponse est qu'ils se couplent à l'API de l'autre service - le contrat que le service promet de maintenir stable même lorsque ses internes changent.
Au-delà de cela, des techniques telles que la découverte de services peuvent réduire la dépendance vis-à-vis d'un fournisseur de services spécifique, et les courtiers de messages peuvent dissocier les producteurs et les consommateurs (ils ont toujours besoin de comprendre les messages des autres, et comment interagir avec l'API du courtier de messages - il n'y a pas de magie ).
la source
Cela dépend de ce que vous entendez par «directement».
Selon l'architecture des microservices, il est parfaitement correct d'avoir des microservices qui invoquent d'autres microservices, soit sur votre propre serveur, soit même sur des serveurs externes, via une interface comme REST.
Ce qui ne va pas, c'est qu'un microservice en appelle un autre en utilisant des invocations de méthode directes; cela ferait des deux microservices une partie du même monolithe.
la source
Le couplage n'est pas un mauvais mot. Chaque application a déjà un certain degré de couplage; les applications qui parlent à vos microservices sont déjà couplées aux microservices, sinon elles ne fonctionneraient pas.
Ce que vous recherchez vraiment avec les microservices, c'est un couplage lâche ; vous pouvez y parvenir en demandant simplement à un microservice d'interroger l'autre via son API publique ou en utilisant un bus d'événements.
En pratique, cependant, un ou plusieurs de vos microservices (peut-être tous) parleront à un magasin de données central comme une base de données SQL. Selon la façon dont vous souhaitez atteindre votre objectif, vous pouvez simplement demander à un microservice de modifier les données de la base de données d'une manière ou d'une autre, que l'autre microservice interrogera pour détecter la modification.
la source
Il semble qu'en parlant de SOA et d'architecture en général, les gens se retrouvent pris dans la sémantique et le jargon. Qu'est-ce qui rend un service "micro"? En fin de compte, c'est un ensemble de caractéristiques qui, quel que soit le «système de notation» que vous utilisez, ne rendent pas le service «non micro». Qu'est-ce que la justice de la Cour suprême a dit au sujet de l'indécence? "Je le saurai quand je le verrai."
Je suis sûr que certaines personnes diront que c'est une non-réponse, mais elles manquent de raison. Les architectures de micro-services visent à éviter plusieurs problèmes, parmi lesquels la question du «couplage serré». Donc, si vous finissez par créer un enchevêtrement de micro-services qui dépendent de trop de détails les uns des autres, vous avez créé un couplage étroit qui - que vous utilisiez un bus de messages pub / sub ou des appels directs - détruit votre capacité à composer de nouvelles solutions à partir des pièces, à reconfigurer des pièces individuelles sans faire tomber l'ensemble du système, etc., etc.
la source
Ça dépend; cependant, je suggère de fournir des capacités directement utilisables au client et de masquer (encapsuler) les détails de la façon dont les résultats sont assemblés (par exemple via plusieurs micro services).
Si trop de logique est impliquée dans la combinaison des résultats individuels de micro-services par le client, cela peut provoquer par inadvertance une logique métier de se glisser dans le client. Il peut également exposer plus de votre architecture interne au client que vous ne le souhaiteriez, gênant la refactorisation ultérieure des microservices.
Donc, cela signifie qu'avec les microservices, il est parfois utile d'avoir un microservice wrapper qui fournit au client un point de terminaison ayant des abstractions utiles et qui effectue une coordination de niveau supérieur d'autres microservices (peut-être maintenant plus internes).
(De plus, les allers-retours vers le client sont probablement plus chers que vos microservices entre eux.)
Si vous regardez la direction prise par GraphQL, par exemple, vous trouverez des clients émettant des requêtes directement pertinentes à un point de terminaison, qui peuvent ou non être implémentées comme une collection de micrservices. Comme l'architecture des microservices est cachée derrière GraphQL, cela rend l'architecture plus facile à refactoriser et aussi plus conviviale pour le client. Voir, par exemple, https://stackoverflow.com/a/38079681/471129 .
la source
Le principal objectif des micro-services est de coupler votre application de manière lâche. Par conséquent, les services ne peuvent pas s’appeler. Sinon, il sera couplé étroitement. Mais qu'allons-nous faire si nous avons deux services qui doivent partager des données? La réponse est Message Broker. Ainsi, le service qui obtient les données du client peut partager les données avec le courtier de messages central, puis les services doivent utiliser ces données peuvent les consommer, les transformer et les placer dans son propre stockage de données. Je recommande Kafka car vous pouvez joindre des données de différents sujets à la volée avec Kafka Stream. PS. mieux séparer vos micro-services par fonctionnalité.
la source