Ini adalah bagian kedua dari 2 bagian Panduan Cara Kerja untuk HashiCorp Consul. Bagian sebelumnya terutama difokuskan pada pemahaman masalah yang dipecahkan Konsul dan bagaimana menyelesaikannya. Bagian ini dikhususkan untuk penerapan praktis Konsul dalam kehidupan nyata. Ayo mulai.
Berdasarkan sebagian besar teori yang dibahas di bagian sebelumnya , mari beralih ke contoh praktis Konsul.
Apa yang kita bangun?
Kami akan membuat aplikasi web Django yang menyimpan data persistennya di MongoDB . Kami akan menempatkannya dalam wadah menggunakan Docker . Kompilasi dan jalankan dengan Docker Compose .
Untuk memperlihatkan bagaimana aplikasi web kita akan diskalakan dalam konteks ini, kita akan menjalankan dua contoh aplikasi Django. Juga, untuk membuatnya lebih menarik, kami akan menjalankan MongoDB sebagai set replika dengan satu node primer dan dua node sekunder.
, 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
.
, MongoDB , :
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 , Django, Django. .
, 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
Fabio Consul.
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, .
Dockerfile :
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 .
Fabio Django, Consul , .
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, .
python-consul .
$ 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 , .
, , . . Consul , . , .
Kami akan terus mengeksplorasi berbagai teknologi dan memberi Anda informasi paling berharga. Beri tahu kami apa yang ingin Anda dengar dari kami di lain waktu, atau jika Anda memiliki pertanyaan tentang topik ini, kami akan dengan senang hati menjawabnya.
Tautan
- Demo Konsul yang melengkapi panduan ini
- Konsul HashiCorp dan reponya di GitHub
- Panduan dan Kode Konsul HashiCorp