télécharger: les microservices Spring Cloud combat réel pour créer un système de coupons au niveau de l'entreprise
Il existe de nombreux didacticiels sur la page d'accueil du commerce électronique, mais il existe peu de didacticiels complets et pratiques sur le système de coupons. Ce cours créera un système de coupons à la main, basé sur le cadre de développement de microservices Java traditionnel SpringCloud, combiné avec les outils couramment utilisés MySQL, Redis et Kafka, et complétera l'activité principale du système de coupons de commerce électronique à travers les trois microservices de coupon modèle, distribution et règlement. C'est un outil indispensable
pour que les amis s'installent, augmentent le salaire, changent d'emploi et se transforment .
Adapté à la foule
Les étudiants qui ont terminé la planification et les demandeurs d'emploi
qui se préparent pour les entretiens. Les étudiants intéressés par le système de coupons de commerce électronique.
Exigences de réserve technique.
Familier avec les applications de base du framework Spring et SpringMVC.
Comprendre les commandes courantes de MySQL, Redis et Kafka.
Ansible déploie le
déploiement simple prometheus + node-exportateur du système de surveillance prometheus
yum device ansible
yum install ansible
ansible hosts file
[alertmanagers]
10.9.119.1
[prometheus]
10.9.119.1
[node-exportateur]
10.9.119.1
10.9.119.2
10.9.119.3 Le
format de la hiérarchie des fichiers est le suivant:
prometheus
prometheus.yml
- hosts: prometheus
remote_user:
tâches root :- nom: créer un
fichier dir :
chemin: / opt / prometheus
état: répertoire # Créer s'il n'y a pas de répertoire - name: copier le fichier
désarchiver:
old-src: prometheus-2.24.0.linux-amd64.tar.gz
dest: / opt / prometheus - nom: créer un
fichier de lien :
old-src: /opt/prometheus/prometheus-2.24.0.linux-amd64
dest: / opt / prometheus / prometheus
state: link # 软 链接 - nom: copie du
modèle de fichier de service :
old-src: prometheus.service.j2
dest: /usr/lib/systemd/system/prometheus.service - nom: copier le
modèle de configuration yaml :
old-src: prometheus.yml.j2
dest: /opt/prometheus/prometheus/prometheus.yml
notifier:- redémarrer prométhée
- nom: créer des règles
fichier dir :
chemin: / opt / prometheus / prometheus / rules
état: répertoire - name: copy rules yaml # Il y a des symboles spéciaux dans le nœud, utilisez donc copy
copy:
old-src: node.yml
dest: /opt/prometheus/prometheus/rules/node.yml
notifier: # Cette action déclenchera les gestionnaires- redémarrer prométhée
- nom: démarrer le
service prometheus :
nom: prometheus
état: démarré
activé: oui
gestionnaires: - name: restart prometheus
service:
name: prometheus
state: restarted
prometheus.service.j2 Le module de copie peut être utilisé, et le modèle est utilisé ici
- nom: créer un
[Unité]
Description =
Documentation Prometheus =
After = network.target
[Service]
WorkingDirectory = / opt / prometheus / prometheus
ExecStart = / opt / prometheus / prometheus / prometheus
ExecReload = / bin / kill -HUP $ MAINPID
ExecStop = / bin / kill -KILL $ MAINPID
Type = simple
KillMode = control-group
Restart = on-failure
RestartSec = 3s
[Install]
WantedBy = multi-user.target
prometheus.yml.j2
Configuration globale
global:
scrape_interval: 30s #Grabbing distance time
evaluation_interval: 30s
#Rule moteur exécution distance temps query_log_file: ./promql.log
Configuration d'alarme
alerte:
alertmanagers: # Alertmanagers 配置
- static_configs: # Configuration statique d'Alertmanager
- cibles: # alertmanager envoi de la configuration de destination
{% pour alertmanager dans les groupes ['alertmanagers']%}- {
{alertmanager}}: 9093
{% endfor%}
rule_files: # Configuration du fichier de règles
- {
{alertmanager}}: 9093
- cibles: # alertmanager envoi de la configuration de destination
- "
Rules /*.yml" scrape_configs: # configuration de saisie - job_name: 'prometheus' #Task collection purpose classification
static_configs: # Capture purpose configuration statique- cibles:
{% pour prometheu dans les groupes ['prometheus']%}- "{
{prometheu}}: 9090" #Grabbing purpose
{% endfor%}
- "{
{prometheu}}: 9090" #Grabbing purpose
- cibles:
- nom_travail: "node"
static_configs:- cibles:
{% pour le nœud dans les groupes ['node-exporter']%}- "{
{Node}}: 9100"
{% endfor%}
règles de nœud
- "{
{Node}}: 9100"
- cibles:
groupes:
-
name: node.rules #
Règles de titre du groupe de règles d' alarme :- alert: node is Down
expr: up == 0
for: 30s #Duration, ce qui signifie que si aucune information n'est obtenue pendant 30 secondes, une alarme sera déclenchée
labels:
severity: serious # Label personnalisé
annotations sérieuses :
résumé: "Instance { {$ labels.instance}} down "#
Description récapitulative personnalisée :" { {$ labels.instance}} de la tâche { {$ labels.job}} est en panne depuis plus de 5 minutes. "# Description détaillée personnalisée - alert: node
Système de fichiers expr: 100 - (node_filesystem_free_bytes {fstype = ~ "ext4 | xfs"} / node_filesystem_size_bytes {fstype = ~ "ext4 | xfs"} * 100)> 80
pour: 2m
étiquettes:
gravité:
annotations d' avertissement :
résumé: " { { Erreur d'analyse KaTeX: 'EOF' attendu, a obtenu '}' à la position 16: labels.instance} ̲}: { { labels.mountpoint}} 分区 运用 过高 " description:" { { Erreur d'analyse KaTeX: 'EOF attendu ', a obtenu'} 'à la position 16: labels.instance} ̲}: { { labels.mountpoint}} 分区 运用 大于 80% (当前 值: { {$ value}}) "
- alert: node Memory
expr: 100- (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100> 80
pour: 2m
labels:
gravité:
annotations d' avertissement :
résumé: "{ { TeX'OF parse error ', erreur d'analyse de KaO attendue: erreur obtenu la position 16: labels.instance} ̲}: l'utilisation de la mémoire est trop élevée "de ... labels.instance}}: l'utilisation de la mémoire est supérieure à 80% (valeur actuelle: { {$ value}})" - alert: node CPU
expr: 100 - (avg (irate (node_cpu_seconds_total {mode = “idle”} [5m])) by (instance) * 100)> 80
for: 2m
labels:
severity: warning
annotations:
summary: “{ { Erreur d'analyse KaTeX: 'EOF' attendu, obtenu '}' à la position 16: labels.instance} ̲}: CPU 运用 过高 "d… labels.instance}}: CPU 运用 大于 80% (当前 值: { {$ value }}) ” Node-exporter node-exporter.yml
- alert: node is Down
-
hôtes: noeud-exportateur
remote_user:
tâches racine :- nom: créer un
fichier dir :
chemin: / opt / prometheus
état: répertoire - name: copier le fichier
désarchiver:
old-src: node_exporter-1.0.1.linux-amd64.tar.gz
dest: / opt / prometheus - nom: créer un
fichier de lien :
old-src: /opt/prometheus/node_exporter-1.0.1.linux-amd64
dest: / opt / prometheus / node_exporter
état: lien - nom: copie du
modèle de fichier de service :
old-src: node_exporter.service.j2
dest: /usr/lib/systemd/system/node_exporter.service - nom: démarrer le
service node_exporter :
nom: node_exporter
état: redémarré
activé: oui
node_exporter.service.j2
- nom: créer un
[Unité]
Description = Node Exporter
Documentation =
After = network.target
[Service]
WorkingDirectory = / opt / prometheus / node_exporter /
ExecStart = / opt / prometheus / node_exporter / node_exporter
ExecStop = / bin / kill -KILL $ MAINPID
Type = simple
KillMode = control-group
Restart = on-failure
RestartSec = 3s
[Install]
WantedBy = multi-user.target
alertmanager
alertmanager.yaml
- hosts: alertmanagers
remote_user:
tâches root :- nom: créer un
fichier dir :
chemin: / opt / prometheus
état: répertoire - name: copier le fichier
désarchiver:
old-src: alertmanager-0.21.0.linux-amd64.tar.gz
dest: / opt / prometheus - nom: créer un
fichier de lien :
old-src: /opt/prometheus/alertmanager-0.21.0.linux-amd64
dest: / opt / prometheus / alertmanager
état: lien - nom: copie du
modèle de fichier de service :
old-src: alertmanager.service.j2
dest: /usr/lib/systemd/system/alertmanager.service - nom: copier le
modèle de configuration yaml :
old-src: alertmanager.yml.j2
dest: /opt/prometheus/alertmanager/alertmanager.yml
notifier:- redémarrer alertmanager
- nom: démarrer le
service du serveur :
nom: alertmanager
état: redémarré
activé: oui
gestionnaires: - nom: redémarrer le
service alertmanager :
nom: alertmanager
état: redémarré
alertmanager.service.j2
- nom: créer un
[Unité]
Description =
Documentation AlertManager =
After = network.target
[Service]
WorkingDirectory = / opt / prometheus / alertmanager /
ExecStart = / opt / prometheus / alertmanager / alertmanager
ExecReload = / bin / kill -HUP $ MAINPID
ExecStop = / bin / kill -KILL $ MAINPID
Type = simple
KillMode = control-group
Restart = on-failure
RestartSec = 3s
[Install]
WantedBy = multi-user.target
alertmanager.yml.j2 这里 运用 了 邮箱 告警
global:
resolution_timeout: 5m # Lorsque l'état de l'alarme a un changement de déclenchement à résoudre, combien de temps cela prendra-t-il avant que l'annonce ne soit publiée.
smtp_from: "[email protected]"
smtp_smarthost: "smtp.qq.com: 465"
smtp_auth_username: "[email protected]" # Compte de messagerie
smtp_auth_password: "bcvizcgqbgojjjeb" # Mot de passe, non-
Qrequire_passe4_mot de passe smtp
route:
group_by: ['alertname'] # Quelle étiquette est utilisée comme groupe selon
group_wait: 10s # Temps d'attente du groupe 10s
group_interval: 10s # La distance et le temps entre les groupes supérieur et inférieur pour envoyer les alarmes 10s
repeat_interval: 24h # Repeat envoi de l'heure de l'alarme. La valeur par défaut 1h n'enverra pas la même alarme à plusieurs reprises.
Récepteur silencieux : 'default-receiver' # accepteur par défaut
Toutes les alarmes qui ne correspondent pas aux sous-routes suivantes seront enregistrées dans le nœud racine et envoyées au «récepteur par défaut»
routes: # Groupe
- récepteur: 'db'
group_wait: 10s
match_re:L'utilisation d'alarmes de correspondance régulières contient deux services, qui sont envoyés à db
service: mysql | redis #All service = mysql ou service = les alarmes redis sont allouées à l'extrémité de réception de la base de données - receiver: 'web'
group_by: [produit, environnement] # Utilisez les balises produit et environnement comme base de regroupement
match:
team: frontend # Toutes les balises d'alarme avec frontend sont envoyées aux
récepteurs Web : - name: 'default-receiver'
email_configs:- à: '[email protected]' # Destinataire de l'alarme
- name: 'db'
# Envoyer l'alarme par e-mail
email_configs: -to
: '[email protected]' - name: 'web'
email_configs: -to:
'[email protected]'
inhibit_rules: # Inhibit, mais les deux sont alarmés. Si le niveau est sévère, l'avertissement de niveau sera inhibé et seules les alarmes de niveau sévères se produiront- source_match: severity:
'critical' # L'alarme critique supprimera les informations d'alarme de niveau d'avertissement
target_match: severity
: 'warning'
égal: ['alertname', 'dev', 'instance']
- source_match: severity: