
Esta es la segunda parte de una guía práctica de HashiCorp Consul de 2 partes. La parte anterior se centró principalmente en comprender los problemas que el Cónsul resuelve y cómo los resuelve. Esta parte está dedicada a la aplicación práctica de Consul en la vida real. Empecemos.
Basándonos en la mayor parte de la teoría discutida en la parte anterior , pasemos a un ejemplo práctico de Cónsul.
¿Qué estamos construyendo?
Vamos a crear una aplicación web Django que almacene sus datos persistentes en MongoDB . Los pondremos en un contenedor usando Docker . Compílelos y ejecútelos con Docker Compose .
Para mostrar cómo se escalará nuestra aplicación web en este contexto, vamos a ejecutar dos instancias de la aplicación Django. Además, para hacer esto aún más interesante, ejecutaremos MongoDB como un conjunto de réplicas con un nodo principal y dos nodos secundarios.
, 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 , .
Continuaremos explorando diversas tecnologías y proporcionándole la información más valiosa. Háganos saber lo que le gustaría escuchar de nosotros la próxima vez, o si tiene alguna pregunta sobre este tema, estaremos encantados de responderla.