This is the second part of a 2-part How-to Guide to HashiCorp Consul. The previous part was primarily focused on understanding the problems that Consul solves and how it solves them. This part is devoted to the practical application of Consul in real life. Let's start.
Building on most of the theory discussed in the previous part, let's move on to a practical Consul example.
What are we building?
We are going to create a Django web application that stores its persistent data in MongoDB . We'll put them in a container using Docker . Compile and run them with Docker Compose .
To show how our web application will scale in this context, we're going to run two instances of the Django application. Also, to make this even more interesting, we'll run MongoDB as a replica set with one primary node and two secondary nodes.
, 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 , .
We will continue to explore various technologies and provide you with the most valuable information. Let us know what you would like to hear from us next time, or if you have any questions about this topic, we will be very happy to answer them.