Ceci est la deuxième partie d'un guide pratique HashiCorp Consul en deux parties. La partie précédente était principalement axée sur la compréhension des problèmes que Consul résout et comment il les résout. Cette partie est consacrée à l'application pratique de Consul dans la vie réelle. Commençons.
En nous appuyant sur la plupart de la théorie discutée dans la partie précédente , passons à un exemple pratique de Consul.
Que construisons-nous?
Nous allons créer une application web Django qui stocke ses données persistantes dans MongoDB . Nous les mettrons dans un conteneur en utilisant Docker . Compilez et exécutez-les avec Docker Compose .
Pour montrer comment notre application Web évoluera dans ce contexte, nous allons exécuter deux instances de l'application Django. De plus, pour rendre cela encore plus intéressant, nous exécuterons MongoDB en tant qu'ensemble de répliques avec un nœud principal et deux nœuds secondaires.
, Django, , Fabio, , Consul, Django.
.
GitHub — pranavcode/consul-demo.
. - , . Ruby on Rails Postgres, Node.js MongoDB, Laravel MySQL.
?
Docker. HTTP.
, Consul Service Discovery. Django MongoDB. Consul Consul DNS.
Consul Fabio Django.
Consul, .
Consul , -, . , , .
.
: MongoDB, Django, Consul, Fabio Dockerization
, , .
MongoDB
MongoDB MongoDB. .
, . . MongoDB Replica Set .
consuldemo
.
MongoDB 27017 , , --replSet
.
replication: replSetName: "consuldemo"
, MongoDB, , , :
var config = { _id: "consuldemo", version: 1, members: [{ _id: 0, host: "mongo_1:27017", }, { _id: 1, host: "mongo_2:27017", }, { _id: 2, host: "mongo_3:27017", }], settings: { chainingAllowed: true } }; rs.initiate(config, { force: true }); rs.slaveOk(); db.getMongo().setReadPref("nearest");
, MongoDB , .
. , , . .
MongoDB :
mongod --bind_ip_all --port 27017 --dbpath /data/db --replSet "consuldemo"
MongoDB , .
MongoDB .
Django
Django, Blog, Docker.
, Django MongoDB, MongoDB Django ORM, Djongo. Django Djongo MongoDB. Djongo .
MongoDB :
... DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'db', } } ...
, MongoDB , :
... DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'db', 'HOST': 'mongodb://mongo-primary.service.consul', 'PORT': 27017, } } ... @velotiotech
:
· ENGINE: Django ORM.
· NAME: .
· HOST: , MongoDB.
· PORT: MongoDB .
Djongo PyMongo MongoClient Mongo. MongoDB, Django, , , django-mongodb-engine pymongo , .
. Django MongoDB, , Djongo , . . Djongo, .
Django, . , , :
from djongo import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() class Meta: abstract = True class Entry(models.Model): blog = models.EmbeddedModelField( model_container=Blog, ) headline = models.CharField(max_length=255)
MongoDB . , Django, :
from django.contrib import admin from.models import Entry admin.site.register(Entry)
CRUD- Entry Django Admin.
, Django-MongoDB , MongoDB MongoDB.
Django :
from django.shortcuts import render from pymongo import MongoClient def home(request): client = MongoClient("mongo-primary.service.consul") replica_set = client.admin.command('ismaster') return render(request, 'home.html', { 'mongo_hosts': replica_set['hosts'], 'mongo_primary_host': replica_set['primary'], 'mongo_connected_host': replica_set['me'], 'mongo_is_primary': replica_set['ismaster'], 'mongo_is_secondary': replica_set['secondary'], })
URL- :
from django.urls import path from tweetapp import views urlpatterns = [ path('', views.home, name='home'), ]
— URL- :
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('web', include('tweetapp.urls')), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Django, templates/home.html
, :
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Armata" rel="stylesheet"> <title>Django-Mongo-Consul</title> </head> <body class="bg-dark text-white p-5" style="font-family: Armata"> <div class="p-4 border"> <div class="m-2"> <b>Django Database Connection</b> </div> <table class="table table-dark"> <thead> <tr> <th scope="col">#</th> <th scope="col">Property</th> <th scope="col">Value</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Mongo Hosts</td> <td>{% for host in mongo_hosts %}{{ host }}<br/>{% endfor %}</td> </tr> <tr> <td>2</td> <td>Mongo Primary Address</td> <td>{{ mongo_primary_host }}</td> </tr> <tr> <td>3</td> <td>Mongo Connected Address</td> <td>{{ mongo_connected_host }}</td> </tr> <tr> <td>4</td> <td>Mongo - Is Primary?</td> <td>{{ mongo_is_primary }}</td> </tr> <tr> <td>5</td> <td>Mongo - Is Secondary?</td> <td>{{ mongo_is_secondary }}</td> </tr> </tbody> </table> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>
, , :
python ./manage.py migrate
:
python ./manage.py collectstatic --noinput
Django Gunicorn, HTTP- WSGI, :
gunicorn --bind 0.0.0.0:8000 --access-logfile - tweeter.wsgi:application
Django, , MongoDB.
- Django .
Consul
Consul Consul.
Consul Consul, .
Consul , MongoDB Replica Set
Consul MongoDB Replica Set, . MongoDB .
Consul, MongoDB , — MongoDB , .
, Consul MongoDB Primary MongoDB Secondary Consul Agent .
MongoDB JSON Consul /etc/config.d
.
MongoDB:
{ "service": { "name": "mongo-primary", "port": 27017, "tags": [ "nosql", "database" ], "check": { "id": "mongo_primary_status", "name": "Mongo Primary Status", "args": ["/etc/consul.d/check_scripts/mongo_primary_check.sh"], "interval": "30s", "timeout": "20s" } } }
, DNS, MongoDB Primary, MongoDB. MongoDB. MongoDB Primary.
, , MongoDB.
MongoDB :
{ "service": { "name": "mongo-secondary", "port": 27017, "tags": [ "nosql", "database" ], "check": { "id": "mongo_secondary_status", "name": "Mongo Secondary Status", "args": ["/etc/consul.d/check_scripts/mongo_secondary_check.sh"], "interval": "30s", "timeout": "20s" } } }
, , ?
, MongoDB , db.isMaster()
MongoDB shell.
:
#!/bin/bash mongo_primary=$(mongo --quiet --eval 'JSON.stringify(db.isMaster())' | jq -r .ismaster 2> /dev/null) if [[ $mongo_primary == false ]]; then exit 1 fi echo "Mongo primary healthy and reachable"
MongoDB ,
:
#!/bin/bash mongo_secondary=$(mongo --quiet --eval 'JSON.stringify(db.isMaster())' | jq -r .secondary 2> /dev/null) if [[ $mongo_secondary == false ]]; then exit 1 fi echo "Mongo secondary healthy and reachable"
. jq
— JSON — MongoDB JSON.
, , :
#!/bin/bash # Wait until Mongo starts while [[ $(ps aux | grep [m]ongod | wc -l) -ne 1 ]]; do sleep 5 done REGISTER_MASTER=0 REGISTER_SECONDARY=0 mongo_primary=$(mongo --quiet --eval 'JSON.stringify(db.isMaster())' | jq -r .ismaster 2> /dev/null) mongo_secondary=$(mongo --quiet --eval 'JSON.stringify(db.isMaster())' | jq -r .secondary 2> /dev/null) if [[ $mongo_primary == false && $mongo_secondary == true ]]; then # Deregister as Mongo Master if [[ -a /etc/consul.d/check_scripts/mongo_primary_check.sh && -a /etc/consul.d/mongo_primary.json ]]; then rm -f /etc/consul.d/check_scripts/mongo_primary_check.sh rm -f /etc/consul.d/mongo_primary.json REGISTER_MASTER=1 fi # Register as Mongo Secondary if [[ ! -a /etc/consul.d/check_scripts/mongo_secondary_check.sh && ! -a /etc/consul.d/mongo_secondary.json ]]; then cp -u /opt/checks/check_scripts/mongo_secondary_check.sh /etc/consul.d/check_scripts/ cp -u /opt/checks/mongo_secondary.json /etc/consul.d/ REGISTER_SECONDARY=1 fi else # Register as Mongo Master if [[ ! -a /etc/consul.d/check_scripts/mongo_primary_check.sh && ! -a /etc/consul.d/mongo_primary.json ]]; then cp -u /opt/checks/check_scripts/mongo_primary_check.sh /etc/consul.d/check_scripts/ cp -u /opt/checks/mongo_primary.json /etc/consul.d/ REGISTER_MASTER=2 fi # Deregister as Mongo Secondary if [[ -a /etc/consul.d/check_scripts/mongo_secondary_check.sh && -a /etc/consul.d/mongo_secondary.json ]]; then rm -f /etc/consul.d/check_scripts/mongo_secondary_check.sh rm -f /etc/consul.d/mongo_secondary.json REGISTER_SECONDARY=2 fi fi if [[ $REGISTER_MASTER -ne 0 && $REGISTER_SECONDARY -ne 0 ]]; then consul reload fi
. . .
, Consul MongoDB. :
consul agent -bind 33.10.0.3 \ -advertise 33.10.0.3 \ -join consul_server \ -node mongo_1 \ -dns-port 53 \ -data-dir /data \ -config-dir /etc/consul.d \ -enable-local-script-checks
consul_server
, Consul Server. MongoDB.
. MongoDB, , , , , MongoDB.
Consul , Django
Django Consul . Django, Gunicorn .
Consul :
{ "service": { "name": "web", "port": 8000, "tags": [ "web", "application", "urlprefix-/web" ], "check": { "id": "web_app_status", "name": "Web Application Status", "tcp": "localhost:8000", "interval": "30s", "timeout": "20s" } } }
Consul Django, Consul, , Django . Consul, :
consul agent -bind 33.10.0.10 \ -advertise 33.10.0.10 \ -join consul_server \ -node web_1 \ -dns-port 53 \ -data-dir /data \ -config-dir /etc/consul.d \ -enable-local-script-checks
Consul
Consul Consul. Consul , , MongoDB Django.
Consul , , Consul:
consul agent -server \ -bind 33.10.0.2 \ -advertise 33.10.0.2 \ -node consul_server \ -client 0.0.0.0 \ -dns-port 53 \ -data-dir /data \ -ui -bootstrap
Consul , , Consul.
Fabio
Django.
Fabio Consul, urlprefix-/<service>
. Consul Django :
{ "service": { "name": "web", "port": 8000, "tags": [ "web", "application", "urlprefix-/web" ], "check": { "id": "web_app_status", "name": "Web Application Status", "tcp": "localhost:8000", "interval": "30s", "timeout": "20s" } } }
Django — , , Consul Fabio.
Docker. , Consul.
MongoDB Consul
Consul, , MongoDB Docker, ENTRYPOINT , .
. Docker Consul. , Consul , Docker. , , .
, Foreman. , , .
, Golang, Foreman, Goreman. Procfile Heroku, , .
Procfile :
# Mongo mongo: /opt/mongo.sh # Consul Client Agent consul: /opt/consul.sh # Consul Client Health Checks consul_check: while true; do /opt/checks_toggler.sh && sleep 10; done
consul_check
, MongoDB , MongoDB .
, Procfile, .
FROM ubuntu:18.04 RUN apt-get update && \ apt-get install -y \ bash curl nano net-tools zip unzip \ jq dnsutils iputils-ping # Install MongoDB RUN apt-get install -y mongodb RUN mkdir -p /data/db VOLUME data:/data/db # Setup Consul and Goreman ADD https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip /tmp/consul.zip RUN cd /bin && unzip /tmp/consul.zip && chmod +x /bin/consul && rm /tmp/consul.zip ADD https://github.com/mattn/goreman/releases/download/v0.0.10/goreman_linux_amd64.zip /tmp/goreman.zip RUN cd /bin && unzip /tmp/goreman.zip && chmod +x /bin/goreman && rm /tmp/goreman.zip RUN mkdir -p /etc/consul.d/check_scripts ADD ./config/mongod /etc RUN mkdir -p /etc/checks ADD ./config/checks /opt/checks ADD checks_toggler.sh /opt ADD mongo.sh /opt ADD consul.sh /opt ADD Procfile /root/Procfile EXPOSE 27017 # Launch both MongoDB server and Consul ENTRYPOINT [ "goreman" ] CMD [ "-f", "/root/Procfile", "start" ]
. Ubuntu 18.04 , MongoDB Consul MongoDB Consul Docker, .
- Django Consul Agent
Consul Django Docker, MongoDB.
# Django django: /web/tweeter.sh # Consul Client Agent consul: /opt/consul.sh
Dockerfile - Django, MongoDB.
FROM python:3.7 RUN apt-get update && \ apt-get install -y \ bash curl nano net-tools zip unzip \ jq dnsutils iputils-ping # Python Environment Setup ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Setup Consul and Goreman RUN mkdir -p /data/db /etc/consul.d ADD https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip /tmp/consul.zip RUN cd /bin && unzip /tmp/consul.zip && chmod +x /bin/consul && rm /tmp/consul.zip ADD https://github.com/mattn/goreman/releases/download/v0.0.10/goreman_linux_amd64.zip /tmp/goreman.zip RUN cd /bin && unzip /tmp/goreman.zip && chmod +x /bin/goreman && rm /tmp/goreman.zip ADD ./consul /etc/consul.d ADD Procfile /root/Procfile # Install pipenv RUN pip3 install --upgrade pip RUN pip3 install pipenv # Setting workdir ADD consul.sh /opt ADD . /web WORKDIR /web/tweeter # Exposing appropriate ports EXPOSE 8000/tcp # Install dependencies RUN pipenv install --system --deploy --ignore-pipfile # Migrates the database, uploads staticfiles, run API server and background tasks ENTRYPOINT [ "goreman" ] CMD [ "-f", "/root/Procfile", "start" ]
Consul Server
Consul, ENTRYPOINT. , Consul.
, Ubuntu 18.04. Consul, , .
FROM ubuntu:18.04 RUN apt-get update && \ apt-get install -y \ bash curl nano net-tools zip unzip \ jq dnsutils iputils-ping ADD https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip /tmp/consul.zip RUN cd /bin && unzip /tmp/consul.zip && chmod +x /bin/consul && rm /tmp/consul.zip # Consul ports EXPOSE 8300 8301 8302 8400 8500 ADD consul_server.sh /opt RUN mkdir -p /data VOLUME /data CMD ["/opt/consul_server.sh"]
Docker Compose
Compose Docker , .
Compose , , Docker Compose .
Docker Compose , :
version: "3.6" services: consul_server: build: context: consul_server dockerfile: Dockerfile image: consul_server ports: - 8300:8300 - 8301:8301 - 8302:8302 - 8400:8400 - 8500:8500 environment: - NODE=consul_server - PRIVATE_IP_ADDRESS=33.10.0.2 networks: consul_network: ipv4_address: 33.10.0.2 load_balancer: image: fabiolb/fabio ports: - 9998:9998 - 9999:9999 command: -registry.consul.addr="33.10.0.2:8500" networks: consul_network: ipv4_address: 33.10.0.100 mongo_1: build: context: mongo dockerfile: Dockerfile image: mongo_consul dns: - 127.0.0.1 - 8.8.8.8 - 8.8.4.4 environment: - NODE=mongo_1 - MONGO_PORT=27017 - PRIMARY_MONGO=33.10.0.3 - PRIVATE_IP_ADDRESS=33.10.0.3 restart: always ports: - 27017:27017 - 28017:28017 depends_on: - consul_server - mongo_2 - mongo_3 networks: consul_network: ipv4_address: 33.10.0.3 mongo_2: build: context: mongo dockerfile: Dockerfile image: mongo_consul dns: - 127.0.0.1 - 8.8.8.8 - 8.8.4.4 environment: - NODE=mongo_2 - MONGO_PORT=27017 - PRIMARY_MONGO=33.10.0.3 - PRIVATE_IP_ADDRESS=33.10.0.4 restart: always ports: - 27018:27017 - 28018:28017 depends_on: - consul_server networks: consul_network: ipv4_address: 33.10.0.4 mongo_3: build: context: mongo dockerfile: Dockerfile image: mongo_consul dns: - 127.0.0.1 - 8.8.8.8 - 8.8.4.4 environment: - NODE=mongo_3 - MONGO_PORT=27017 - PRIMARY_MONGO=33.10.0.3 - PRIVATE_IP_ADDRESS=33.10.0.5 restart: always ports: - 27019:27017 - 28019:28017 depends_on: - consul_server networks: consul_network: ipv4_address: 33.10.0.5 web_1: build: context: django dockerfile: Dockerfile image: web_consul ports: - 8080:8000 environment: - NODE=web_1 - PRIMARY=1 - LOAD_BALANCER=33.10.0.100 - PRIVATE_IP_ADDRESS=33.10.0.10 dns: - 127.0.0.1 - 8.8.8.8 - 8.8.4.4 depends_on: - consul_server - mongo_1 volumes: - ./django:/web cap_add: - NET_ADMIN networks: consul_network: ipv4_address: 33.10.0.10 web_2: build: context: django dockerfile: Dockerfile image: web_consul ports: - 8081:8000 environment: - NODE=web_2 - LOAD_BALANCER=33.10.0.100 - PRIVATE_IP_ADDRESS=33.10.0.11 dns: - 127.0.0.1 - 8.8.8.8 - 8.8.4.4 depends_on: - consul_server - mongo_1 volumes: - ./django:/web cap_add: - NET_ADMIN networks: consul_network: ipv4_address: 33.10.0.11 networks: consul_network: driver: bridge ipam: config: - subnet: 33.10.0.0/16
. Docker Compose .
Consul
, Consul Web .
MongoDB Django Consul DNS.
root@82857c424b15:/web/tweeter# dig @127.0.0.1 mongo-primary.service.consul ; <<>> DiG 9.10.3-P4-Debian <<>> @127.0.0.1 mongo-primary.service.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8369 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;mongo-primary.service.consul. IN A ;; ANSWER SECTION: mongo-primary.service.consul. 0 IN A 33.10.0.3 ;; ADDITIONAL SECTION: mongo-primary.service.consul. 0 IN TXT "consul-network-segment=" ;; Query time: 139 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon Apr 01 11:50:45 UTC 2019 ;; MSG SIZE rcvd: 109
Django MongoDB .
33.10.0.100
, /web
Django, .
Fabio - Django
Fabio , - Django. Django.
URL- Fabio 33.10.0.100:9999
/web
, Django. , 33.10.0.100:9999/web
.
- Django MongoDB
Fabio Django , Django Consul.
MongoDB Django .
- Consul, - Django.
- Django - Consul
, MongoDB.
MongoDB Replica Set Primary service - Consul
MongoDB Replica Set Secondary service - Consul
, Consul .
MongoDB Replica Set Primary (mongo_2
), , .
MongoDB MongoDB
MongoDB
Consul MongoDB. MongoDB , . , MongoDB Primary (mongo_3
).
mongo_3
MongoDB MongoDB.
Django, , MongoDB (mongo_3
).
MongoDB Primary - Django.
, , MongoDB.
MongoDB , MongoDB.
MongoDB MongoDB,
, Django, Fabio .
Fabio , Consul .
Consul , .
Consul
Django , Docker Compose, Django, .
/ Consul Django.
HTTP- Consul / , Python Consul, python-consul. Python, Consul KV, .
, , / Consul, HTTP-.
# Flag to run Django app in debug mode
curl -X PUT -d 'True' consul_server:8500/v1/kv/web/debug
# Dynamic entries into Django app configuration
# to denote allowed set of hosts
curl -X PUT -d 'localhost, 33.10.0.100' consul_server:8500/v1/kv/web/allowed_hosts
# Dynamic entries into Django app configuration
# to denote installed apps
curl -X PUT -d 'tweetapp' consul_server:8500/v1/kv/web/installed_apps
, KV, Django, .
$ pipenv shell
Launching subshell in virtual environment…
. /home/pranav/.local/share/virtualenvs/tweeter-PYSn2zRU/bin/activate
$ . /home/pranav/.local/share/virtualenvs/tweeter-PYSn2zRU/bin/activate
(tweeter) $ pipenv install python-consul
Installing python-consul…
Adding python-consul to Pipfile's [packages]…
Installation Succeeded
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Success!
Updated Pipfile.lock (9590cc)!
Installing dependencies from Pipfile.lock (9590cc)…
▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 14/14 — 00:00:20
Consul python-consul.
import consul
consul_client = consul.Consul(
host='consul_server',
port=8500,
)
Django python-consul
.
# Set DEBUG flag using Consul KV store
index, data = consul_client.kv.get('web/debug')
DEBUG = data.get('Value', True)
# Set ALLOWED_HOSTS dynamically using Consul KV store
ALLOWED_HOSTS = []
index, hosts = consul_client.kv.get('web/allowed_hosts')
ALLOWED_HOSTS.append(hosts.get('Value'))
# Set INSTALLED_APPS dynamically using Consul KV store
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
index, apps = consul_client.kv.get('web/installed_apps')
INSTALLED_APPS += (bytes(apps.get('Value')).decode('utf-8'),)
/ Consul KV -.
Consul KV store Consul Web Django
, Consul, «service-configuration» pranavcode/consul-demo.
Consul KV .
Consul
Consul Consul Connect -.
Connect TLS.
Consul, . Consul.
{ "connect": { "enabled": true } }
, TLS, Django MongoDB.
{ "service": { "name": "web", "port": 8000, "tags": [ "web", "application", "urlprefix-/web" ], "connect": { "sidecar_service": { "proxy": { "upstreams": [{ "destination_name": "mongo-primary", "local_bind_port": 5501 }] } } }, "check": { "id": "web_app_status", "name": "Web Application Status", "tcp": "localhost:8000", "interval": "30s", "timeout": "20s" } } }
Connect - Connect Django. , .
{ "service": { "name": "web", "port": 8000, "tags": [ "web", "application", "urlprefix-/web" ], "connect": { "sidecar_service": { "proxy": { "upstreams": [{ "destination_name": "mongo-primary", "local_bind_port": 5501 }] } } }, "check": { "id": "web_app_status", "name": "Web Application Status", "tcp": "localhost:8000", "interval": "30s", "timeout": "20s" } } }
Consul Connect Intentions . , :
$ consul connect proxy -sidecar-for web
- Consul.
, Connect.
Consul , , Consul .
, Consul, service-segmentation
velotiotech/consul-demo.
Consul .
, Consul, . , , Consul , .
Nous continuerons d'explorer diverses technologies et de vous fournir les informations les plus précieuses. Faites-nous savoir ce que vous aimeriez entendre de nous la prochaine fois, ou si vous avez des questions sur ce sujet, nous serons très heureux d'y répondre.