Introduction à la page Web de rabbitmq (3)

introduction la page web rabbitmq


Un.、Virtual Hosts

Chaque RabbitMQ Les serveurs peuvent créer des serveurs de messages virtuels,On appelle ça un hôte virtuel. (virtual host) ,Abréviation:vhost.Chaque vhost Est essentiellement une petite entreprise indépendante RabbitMQ Serveur,Avoir sa propre file d'attente indépendante、Commutateur et relation de liaison, etc.,Bien et il a ses propres permissions indépendantes.vhost Comme une machine virtuelle et un serveur physique,Ils fournissent une séparation logique entre les instances,Exécuter les données en toute sécurité et en toute sécurité pour différents programmes,Il peut faire la même choseRabbitMQ De nombreux clients sont séparés,Peut également éviter les conflits de noms tels que les files d'attente et les commutateurs.vhost C'est complètement isolé.,Impossible de mettre vhostl Commutateur et vhost2 La file d'attente est liée,Ça garantit la sécurité.,Et assure la portabilité.Si utilisé RabbitMQ À une certaine échelle,Conseiller l'utilisateur sur les fonctions commerciales、Classification des scénarios,Et leur assigner vhost.

1.1、Virtual Hosts Description de la fonction

vhostVous pouvez limiter le nombre maximum de connexions et de files d'attente,Et peut être configurévhostPermissions des ressources utilisateur etTopicAutorité,Voir la description ci - dessous pour les permissions spécifiques.
  • In Admin -> Limits La page peut être définievhostNombre maximum de connexions et nombre maximum de files d'attente pour,Après avoir atteint la limite,Continuer à créer,Il y aura une erreur..
  • Les permissions de ressources utilisateur se réfèrent àRabbitMQ L'utilisateur exécute sur le clientAMQPLors de l'exécution d'une commande,Avoir des droits d'exploitation et d'utilisation sur les ressources.La permission est divisée en trois parties: configure、write、read ,Voir la description du tableau ci - dessous..RÉFÉRENCES:http://www.rabbitmq.com/access-control.html#permissions
AMQP 0-9-1 Operation   configure write read
exchange.declare (passive=false) exchange    
exchange.declare (passive=true)      
exchange.declare (with [AE](ae.html)) exchange exchange (AE) exchange
exchange.delete   exchange    
queue.declare (passive=false) queue    
queue.declare (passive=true)      
queue.declare (with [DLX](dlx.html)) queue exchange (DLX) queue
queue.delete   queue    
exchange.bind     exchange (destination) exchange (source)
exchange.unbind     exchange (destination) exchange (source)
queue.bind     queue exchange
queue.unbind     queue exchange
basic.publish     exchange  
basic.get       queue
basic.consume       queue
queue.purge       queue
 
Exemples:
    • Comme lors de la création d'une file d'attente,Appelle queue.declare Méthodes,Ceci est utilisé pour configure Autorité,Vérifie si le nom de la file d'attente correspond à configure Correspondance d'expression pour.
    • Par exemple, lors de la mise en file d'attente d'un commutateur,Appelle queue.bind Méthodes,À ce stade write Et read Autorité,Vérifie si le nom de la file d'attente correspond à write Correspondance d'expression pour,Le nom de l'interrupteur correspond - il à read Correspondance d'expression pour.
    • TopicLa permission estRabbitMQ PourSTOMPEtMQTTUne autorisation pour la mise en œuvre d'un protocole égal.Parce que ces accords sont basés surTopicConsommation,EtAMQPEst basé surQueueConsommation,Alors...AMQPLes permissions de ressources standard pour,EtTopicLes permissions ne s'appliquent pas non plusAMQPAccord.Alors...,On ne l'utilise généralement pas.,Seulement en serviceMQTTCe type de protocole peut être utilisé.

2.2、vhostExemple d'utilisation

1. Connectez - vous en utilisant l'utilisateur AdministrateurWebInterface de gestion.
2.Page ajouter un nom v1 DeVirtual Hosts.(C'est aussi nécessaire pour le momentvhostAssigner un utilisateur,Ajouter un nouvel utilisateur)

3.In Admin -> Users Page ajouter un nom order-user Utilisateurs de,Et réglé à management Rôle.

 

4. De Admin Entrée order-user Interface de configuration de l'utilisateur pour,In Permissions Moyenne,Assigner aux utilisateursvhostPour/v1,Et définit une expression régulière pour le nom de la cible à correspondre pour chaque permission.
 

 

 

Nom du champ
Valeur 
Description 
Virtual Host 
/v1 
Spécifier l'utilisateurvhost,Les permissions suivantes sont limitées /v1 vhostMoyenne
Configure regexp
eq-.*
Seul le nom de l'opération peut êtreeq-Au débutexchangeOuqueue;Si elle est vide, aucune opération ne peut être effectuéeexchangeEtqueue 
Write regexp 
.*
Capable d'envoyer des messages à n'importe quel nomexchange,Et peut se lier à n'importe quelle file d'attente nommée et à n'importe quelle cible nommée
Changeur(Se réfère à la liaison du commutateur au commutateur),NULL indique aucune permission 
Read regexp 
^test$ 
Ne peut consommer que des nomstestMessages sur la file d'attente,Et ne peut être lié qu'à un nomtestCommutateur pour
5.Démonstration de code
public class Producer {
public static void main(String[] args) {
// 1、Créer une usine de connexion
ConnectionFactory factory = new ConnectionFactory();
// 2、Définir les propriétés de connexion
factory.setUsername("order-user");
factory.setPassword("order-user");
factory.setVirtualHost("v1");
Connection connection = null;
Channel channel = null;
// 3、Définir l'adresse et le port du lien pour chaque noeud
Address[] addresses = new Address[]{
new Address("192.168.0.1", 5672),
new Address("192.168.0.2", 5672)
};
try {
// Ouvert/Désactiver la récupération automatique de la connexion,La valeur par défaut est activée
factory.setAutomaticRecoveryEnabled(true);
// Définir chaque100Essayez de récupérer une fois en millisecondes,Par défaut5Secondes:com.rabbitmq.client.ConnectionFactory.DEFAULT_NETWORK_RECOVERY_INTERVAL
factory.setNetworkRecoveryInterval(100);
factory.setTopologyRecoveryEnabled(false);
// 4、Obtenir une connexion en utilisant une adresse dans la collection de connexions
connection = factory.newConnection(addresses, "Producteurs");
// Ajouter un auditeur de reconnexion
((Recoverable) connection).addRecoveryListener(new RecoveryListener() {
/**
* Rappel après reconnexion réussie
* @param recoverable
*/
public void handleRecovery(Recoverable recoverable) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(new Date()) + " Connexion rétablie!");
}
/**
* Rappel au début de la reconnexion
* @param recoverable
*/
public void handleRecoveryStarted(Recoverable recoverable) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(new Date()) + " Essayez de vous reconnecter.!");
}
});
// 5、Créer un canal à partir d'un lien
channel = connection.createChannel();
/**
* 6、Déclaration(Création)File d'attente
* Si la file d'attente n'existe pas,Pour créer
* RabbitMQ Les deux noms de file d'attente ne peuvent pas être déclarés identiques,File d'attente avec des propriétés différentes,Sinon, une erreur sera signalée
*
* queueDeclareDescription des paramètres:
* @param queue Nom de la file d 'attente
* @param durable Si la file d'attente est persistante
* @param exclusive Est - il exclusif?,Est privé ou non,Si ouitrue,Verrouille la file d'attente actuelle,Aucun autre canal n'est accessible,Et est automatiquement supprimé lorsque la connexion est fermée,Propriété non contrôlée par la durabilité et la suppression automatique
* @param autoDelete Supprimer automatiquement,Supprimer automatiquement lorsque le dernier consommateur est déconnecté
* @param arguments Paramètres de la file d'attente,Définir la durée de validité de la file d'attente、Longueur maximale du message、Cycle de vie de tous les messages dans la file d'attente, etc.
*/
channel.exchangeDeclare("test-exchange", "fanout");
channel.queueDeclare("queue1", false, false, false, null);
channel.queueBind("queue1", "test-exchange", "xxoo");
for (int i = 0; i < 100; i++) {
// Contenu du message
String message = "Hello World " + i;
try {
// 7、Envoyer un message
channel.basicPublish("test-exchange", "queue1", null, message.getBytes());
} catch (AlreadyClosedException e) {
// Connexion possible fermée,Attendez de vous reconnecter.
System.out.println("Message " + message + " Échec de l'envoi!");
i--;
TimeUnit.SECONDS.sleep(2);
continue;
}
System.out.println("Message " + i + " Envoyé!");
TimeUnit.SECONDS.sleep(2);
}
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 8、Fermez le canal
if (channel != null && channel.isOpen()) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
// 9、Fermer la connexion
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class VirtualHosts {
public static void main(String[] args) {
// 1、Créer une usine de connexion
ConnectionFactory factory = new ConnectionFactory();
// 2、Définir les propriétés de connexion
factory.setUsername("order-user");
factory.setPassword("order-user");
factory.setVirtualHost("v1");
Connection connection = null;
Channel prducerChannel = null;
Channel consumerChannel = null;
// 3、Définir l'adresse et le port du lien pour chaque noeud
Address[] addresses = new Address[]{
new Address("192.168.0.1", 5672),
new Address("192.168.0.2", 5672)
};
try {
// 4、Obtenir la connexion de l'usine de connexion
connection = factory.newConnection(addresses, "Consommateurs");
// 5、Créer un canal à partir d'un lien
prducerChannel = connection.createChannel();
prducerChannel.exchangeDeclare("test-exchange", "fanout");
prducerChannel.queueDeclare("queue1", false, false, true, null);
prducerChannel.queueBind("queue1", "test-exchange", "xxoo");
// Contenu du message
String message = "Hello A";
prducerChannel.basicPublish("test-exchange", "c1", null, message.getBytes());
consumerChannel = connection.createChannel();
// Créer un objet consommateur
Consumer consumer = new DefaultConsumer(consumerChannel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("Message reçu:" + new String(body, "UTF-8"));
}
};
consumerChannel.basicConsume("queue1", true, consumer);
System.out.println("En attente d'un message");
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
// 9、Fermez le canal
if (prducerChannel != null && prducerChannel.isOpen()) {
try {
prducerChannel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
// 10、Fermer la connexion
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

 

 

 2.3、Récupération de la connexion au cluster

Informations officielles: https://www.rabbitmq.com/api-guide.html#connection-recovery;Comme indiqué dans les documents officiels:
  • Adoption factory.setAutomaticRecoveryEnabled(true); Le commutateur pour la récupération automatique de la connexion peut être réglé,Activé par défaut
  • Adoption factory.setNetworkRecoveryInterval(10000); Vous pouvez définir l'intervalle entre les tentatives de récupération,Par défaut5Secondes: com.rabbitmq.client.ConnectionFactory.DEFAULT_NETWORK_RECOVERY_INTERVAL 
Quand la récupération de la connexion sera - t - elle déclenchée?? https://www.rabbitmq.com/api-guide.html#recovery-triggers
  • Si la récupération automatique de la connexion est activée,Sera déclenché par:
    • ConnectéI/OLancer en boucleIOExceiption
    • LireSocketDélai de prise
    • Impossible de détecter le battement de cœur du serveur
    • ConnectéI/OToute autre exception lancée dans la boucle
  • Si le client ne se connecte pas pour la première fois,Ne pas restaurer automatiquement la connexion.Nous devons essayer de nous connecter à nouveau.、Enregistrer les tentatives échouées、Limiter le nombre de retraits, etc..
ConnectionFactory factory = new ConnectionFactory();
// configure various connection settings
try {
Connection conn = factory.newConnection();
} catch (java.net.ConnectException e) {
Thread.sleep(5000);
// apply retry logic
}
    • Si le programme appelle Connection.Close ,Et ne récupère pas automatiquement la connexion.
    • Si oui Channel-level L'exception de,Et ne récupère pas automatiquement la connexion,Parce que ces exceptions sont généralement des problèmes sémantiques dans l'application(Par exemple, essayer de consommer une file d'attente qui n'existe jamais).
  • InConnectionEtChannelAllez.,Les auditeurs reconnectés peuvent être configurés,Début de la reconnexion et succès de la reconnexion,Déclenchera l'auditeur.Ajouter et supprimer des moniteurs,Il fautConnectionOuChannelConversion forcée enRecoverableInterface.
((Recoverable) connection).addRecoveryListener() 
((Recoverable) connection).removeRecoveryListener()

  gitCode source:https://gitee.com/TongHuaShuShuoWoDeJieJu/rabbit.git

版权声明
本文为[Les Contes de fées racontent ma fin]所创,转载请带上原文链接,感谢
https://javamana.com/2021/10/20211013211926389u.html

  1. What are the new features of Java 10?
  2. What are the new features of Java 9?
  3. Is the report too ugly? Try this open source project reportplus!
  4. Spring 2021 report released: who is the real brother?
  5. À bientôt, docker.
  6. Recommend a super easy to use markdown editor
  7. Java 17 new features overview
  8. New developer friendly features after Java 8
  9. Concise and efficient eclipse collections API
  10. Practice of deploying spring boot microservices on kubernetes
  11. Garbage collectors in the new JDK: Shenandoah, ZGC and improved G1
  12. À bientôt, docker.
  13. Oracle exécute le format syntaxique d'une procédure stockée ou d'un lot
  14. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  15. The Linux kernel will be implemented with the latest zstd
  16. JetBrains publishes the raw data of the developer ecosystem survey in 2021
  17. Linux 5.16 will support KVM and disable amd PSF function
  18. Linux 5.16 brings DisplayPort 2.0 initial support for amdgpu driver
  19. Announcement of the election results of the technical advisory committee of the Linux foundation in 2021
  20. Java虚拟机|JVM【适合初学者入门】
  21. Spring Cloud 2021.0.0-M2 发布
  22. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  23. Spring Cloud 2021.0.0-M2 發布
  24. Java虛擬機|JVM【適合初學者入門】
  25. Spring Cloud 2021.0.0-m2 Release
  26. Machine virtuelle Java | JVM [convient aux débutants]
  27. 10412 Xiaopeng cars announced sales results in September
  28. Apprendre le mécanisme des événements Java
  29. Java script RPC (07) - timeout timeout Processing from zero
  30. Introduction à la page Web de rabbitmq (3)
  31. MySQL read - Write Separation Cluster Construction and Integration with mycat
  32. Analyse du principe du conteneur du CIO printanier
  33. Java面向对象基础
  34. Java communique avec les capteurs industriels via socket et DTu, RTU
  35. Xiaopeng automobile delivered 10412 units in September, with a monthly sales volume of more than 10000 for the first time
  36. Java Object Oriented Foundation
  37. Introduction au développement Android PDF, un tour pour vous apprendre à comprendre netty
  38. Hadoop Foundation - 01 - concepts de base
  39. Hadoop Foundation - 02 - Basic Structure
  40. Hadoop Foundation - 03 - hdfs (Hadoop Distributed File System) Basic Concepts
  41. Hadoop Foundation - 04 - hdfs API Programming
  42. Hadoop Foundation - 05 - hdfs Project (word Frequency Statistics)
  43. Hadoop Foundation - 06 - hdfs Data Read and write
  44. The "monthly test" report card of the new car built under the lack of core: Xiaopeng and Weilai took the lead in "breaking 10000", and the ideal plummeted by 25%
  45. Introduction to making arch linux software package
  46. Hard core observation 407 HTTPS everywhere browser extension is about to retire
  47. How to use busybox on Linux
  48. In 2021, the talent incentive plan of Linux foundation open source software School Park was officially launched
  49. It's not windows or Linux. Shrink is the "God operating system"
  50. Install anydesk on Ubuntu Linux
  51. 2021, can we recommend using Linux to play games?
  52. not exist:org.springframework.kafka.listener.AbstractMessageListenerContaingetContainerProperties()
  53. Are you sure HTTPS is asymmetric encryption for content encryption? See the answers and reasons
  54. MySQL online slow log query
  55. Java JDK server installation
  56. 手把手教你使用Java开发在线生成pdf文档
  57. Questions d'entrevue dans la base de données MySQL (dernière version 2021)
  58. Java零基础小白入门必做题汇总(建议收藏)第一篇
  59. Day15 Java Foundation
  60. Day16 Java Foundation