1. Introduction
Dans les systèmes d'architecture de microservice, nous utilisons généralement un courtier de messages léger pour créer un sujet de message commun pour connecter toutes les instances de microservice dans le système. Étant donné que les messages générés dans ce sujet seront écoutés et consommés par toutes les instances, nous l'appelons le bus de message.
2. Message Proxy
Le courtier de messages est un modèle architectural de vérification, de transmission et de routage des messages. Il sert de planification de communication entre les applications et minimise les dépendances entre les applications, afin que les applications puissent découpler efficacement les processus de communication. Le courtier de messages est un produit middleware. Son noyau est un programme de routage de messages utilisé pour recevoir et distribuer des messages, et les transmettre à l'application correcte en fonction du flux de traitement des messages défini. Il comprend des protocoles de communication et de messagerie indépendants, permettant une communication réseau au sein des organisations et entre les organisations. Le but de la conception d'un proxy est de pouvoir transmettre des messages de l'application et effectuer des opérations spéciales. Voici des scénarios dans les applications d'entreprise où nous devons souvent utiliser le proxy de messages:
Il existe déjà de nombreux produits open source à utiliser, comme:
3. SpringCloud + Rabbitmq
(1) L'introduction et l'installation de RabbitMQ ne seront pas détaillées.
(2) pom.xml
<Dependances> <Dependency> <GroupId> org.springFramework.boot </rombandid> <Artifactid> printemps-boot-starter-amqp </ artifactid> </dependency> <dependency> <proupId> org.springframework.boot </proupId> <Artifactid> Spring-Boot-starter-test </tifactive> <proope> Test </ Scope> Boot-starter-test </partifactive> <proope> Tester> Spring-Boot-starter-test </partifactive> <scope> SPOTED> BOOT-Starter-Test </TitifActid> </dpendance> </dpendances>
(3) application.yml
Spring: Application: Nom: Rabbitmq-Hello Rabbitmq: Hôte: ***. ***. ***. ***. *** Port: 5672 Nom d'utilisateur: Mot de passe invité: invité
(4) expéditeur
@Component public class Sender {private static final logger log = loggerfactory.getLogger (Sender.class); @Autowired privé Amqptemplate Amqptemplate; public void Send () {String context = "Hello" + new Date (); Log.info ("Sender:" + Context); this.amqptemplate.ConvertandSend ("Hello", context); }}(5) récepteur
@Component @RabbitListener (réservoirs = "Hello") Récepteur de classe publique {private static final logger log = loggerfactory.getLogger (receiver.class); @Rabbithandler public void process (string hello) {log.info ("récepteur:" + bonjour); }}(6) Créer une classe de configuration Rabbitmq Rabbitconfig
@Configuration publique classe RabbitConfig {@bean public Queue HelloQueue () {return new Queue ("Hello"); }} (7) Créer une classe de test unitaire pour appeler la production de messages
@Runwith (springjunit4classrunner.class) @springboottest (classes = springCloudBusrabbitmqApplication.class) Classe publique HelloApplicationTests {@autowired Sender Private Sender; @Test public void hello () lève une exception {Sender.Send (); }} (8) Testez, exécutez HelloApplicationTtests
(9) Visitez l'hôte: 15672
4. Transformer Config-Client (intégrer le bus SpringCloud)
(1) pom.xml
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <GroupId> org.springframework.cloud </proupId> <Artifactid> Spring-Cloud-Starter-eureka </Retifactid> </Dependency> <Dedency> <ProupId> org.SpringFramework.Cloud </prouprid> <Artifactid> Spring-Cloud-Starter-Bus-amqp </ArtifActid> </Dedency> <GroupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-actuator </retifactid> </pependency> <pedidency> <proupId> org.springframework.boot </prouprid> <Artifactid> Spring-Boot-starter-test </ artifactid> <capy>
(2) bootstrap.properties
Spring.Application.name = configSpace printemps.cloud.config.label = maître printemps.cloud.config.profile = dev printemp.cloud.config.uri = http: // localhost: 5588 / eureka.client.ServiceUrl.defaultZone = http: // localhost: 5555 / eurek printemps.rabbitmq.host = 118.89.237.88 printemps.rabbitmq.port = 5672 printemps.rabbitmq.username = invité printemps.rabbitmq.password = invité management.security.enabled = false
(3) Pas besoin de changer les autres
V.
(1) Préparation du test
Un centre d'enregistrement de service, Eurekaserver, port 5555;
Un centre de configuration distribué, configserver, avec le port 5588;
Deux configurations distribuées, ConfigClient, les ports sont 5589 et 5590; (2) Visitez http: // localhost: 5589 / depuis
(3) visiter http: // localhost: 5590 / depuis
Rabbitmq:
(4) aller à l'entrepôt pour modifier la valeur du mot de passe
From = git-dev-v1.0 par SpringCloud Config-Server Username = SpringCloud Password = 1234567890
(5) Demande de poste http: // localhost: 5589 / bus / actualiser ou http: // localhost: 5590 / bus / actualiser
Après une demande réussie, Config-Client reliera le fichier de configuration.
(6) visiter à nouveau
Si le post demande: http: // localhost: 5590 / bus / actualiser, veuillez visiter http: // localhost: 5589 / depuis
De plus, l'interface / bus / rafraîchissement peut spécifier le service, c'est-à-dire d'utiliser le paramètre "nom d'utilisateur", tel que "/ bus / rafraîchir? Destination = nom d'utilisateur: **" pour actualiser tous les services dont le nom du service est le nom d'utilisateur, quelle que soit l'adresse IP.
(7) Architecture
(8) ajustement de l'architecture
Étant donné que l'interface / bus / actualisation du bus SpringCloud fournit des paramètres pour les mises à jour de configuration pour les services et les instances, notre architecture peut également effectuer certains ajustements en conséquence. Dans l'architecture précédente, la mise à jour de configuration du service requise pour envoyer une demande à une instance dans le service spécifique, puis déclenche la mise à jour de configuration de l'ensemble du cluster de service. Bien que les fonctions puissent être implémentées, le résultat est que les instances d'application que nous spécifions seront différentes des autres instances d'application dans le cluster, ce qui augmentera la complexité au sein du cluster et sera préjudiciable aux travaux de fonctionnement et de maintenance futurs. Par exemple, si l'instance de service doit être migrée, nous devons modifier la configuration dans le web hook, etc. Par conséquent, nous devons faire chaque nœud dans le pair du cluster de service autant que possible.
Par conséquent, nous avons fait quelques ajustements à l'architecture précédente, comme indiqué dans la figure ci-dessous:
Les modifications suivantes ont été apportées:
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.