所以我有多个服务在同一个 docker 网络中与 Flask 一起运行 它们是这样设置的:
version: '3'
services:
login:
build:
context: ./repo_login
dockerfile: Development.Dockerfile
volumes:
- ./repo_login:/home/app
ports:
- "5007:5001"
restart: unless-stopped
environment:
ENV: 'development'
networks:
- qa_network
jobs:
build:
context: ./repo_jobs
dockerfile: Development.Dockerfile
volumes:
- ./repo_jobs:/home/app
ports:
- "5017:5001"
restart: unless-stopped
environment:
PYTHONUNBUFFERED: 1
ENV: 'development'
networks:
- qa_network
sla:
build:
context: ./repo_sla
dockerfile: Development.Dockerfile
volumes:
- ./repo_sla:/home/app
ports:
- "5008:5001"
restart: unless-stopped
environment:
ENV: 'development'
networks:
- qa_network
我知道我可以仅使用服务名称从一个服务向另一个服务提出请求,如下所示:
requests.post('http://jobs:5001/some/api', data=json.dumps(data), headers=headers)
但有没有办法知道请愿书来自哪个服务?
我已经尝试使用request.environ,但我只得到一个IP和端口,我不知道它的服务。我使用了下一个代码
@app.route('/some/api', methods=['POST'])
def execute_task():
try:
origin = request.environ['REMOTE_ADDR']
origin_port = request.environ['REMOTE_PORT']
logging.warning(f'the origin of the petition is: {origin} : {origin_port}')
except Exception as ex:
data = None
message = getattr(ex, 'message', str(ex))
logging.exception(ex)
您可以使用更高级的工具(例如服务发现系统)来完成这项工作。但如果您不想使用这些工具,有一个简单的解决方案。 您可以在
requester
应用程序中添加标头,例如:
import requests
headers = {'service': 'foo'}
requests.post('http://jobs:5001/some/api', data=json.dumps(data), headers=headers)
然后在您的
receiver
应用程序中,您可以检查标题:
from flask import request
serviceName = request.headers.get('service')
然后您将获得可以使用的服务名称。