Как установить одинаковый порт на fastapi и eureka?

Мне нужен тот же порт в конфигурации uvicorn и eureka, я много искал и нашел только эту ссылку https://github.com/encode/uvicorn/issues/761 но это не работает, это мой код :

import py_eureka_client.eureka_client as eureka_client
import uvicorn
from fastapi import FastAPI
from contextlib import asynccontextmanager
from com.controladores import controladorRouter


@asynccontextmanager
async def lifespan(app: FastAPI):
    await eureka_client.init_async(
        eureka_server = "http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/",
        app_name = "msprueba",
        instance_port=8000,
        instance_host = "localhost"
    )
    yield

app = FastAPI(lifespan=lifespan)
app.include_router(controladorRouter)

if __name__ == "__main__":
    config = uvicorn.Config("com.main:app", host = "localhost", port=0)
    server = uvicorn.Server(config)
    server.run()

Я удалил код из ссылки только для того, чтобы показать реальный код, мне трудно поверить, что такую ​​простую задачу так сложно выполнить с помощью fastapi. Не поймите меня неправильно, fastapi — отличный инструмент, единственное, что я использую Springboot, и эту задачу гораздо проще выполнить в Springboot, есть ли помощь?

Я никогда не использовал eureka, но, насколько я понимаю, он запускает службу, которая прослушивает порт. Невозможно иметь две службы, прослушивающие один и тот же порт (вам понадобится балансировщик нагрузки). Возможно я ошибаюсь, но без ошибки, это то, что я могу сказать из вопроса

lsabi 31.03.2024 11:32

У меня нет ошибки, просто если я запускаю uvicorn main:app --reload, uvicorn устанавливает по умолчанию порт 8000, поэтому мне нужно получить этот порт и передать его в eureka, потому что, если позже кто-то запустит приложение с другой порт, ему/ей нужно будет изменить порт вручную в эврике

Alan Gaytan 01.04.2024 18:37

Разве вы не можете указать номер порта в переменной среды и использовать его из обоих приложений?

lsabi 02.04.2024 22:17

Да, могу, но мне нужен случайный доступный порт, потому что у меня много микросервисов.

Alan Gaytan 07.04.2024 16:58

Затем вы можете проверить, какой порт используется, с помощью команды bash, запущенной из Python. Однако в этом нет особого смысла, поскольку вы используете микросервисы, в которых вы определяете и IP, и порт. Также порт должен быть экспортирован из контейнера, иначе запросы не дойдут до приложения.

lsabi 07.04.2024 19:21

Я думал то же самое, но подумал, что это простой способ, позвольте мне попробовать эту идею, спасибо

Alan Gaytan 07.04.2024 22:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создаю переменную с портом следующим образом:

import socket
sock = socket.socket()
sock.bind(('', 0))
APLICACION_PUERTO = sock.getsockname()[1]
sock.close()

Мне нужно закрыть сокет, потому что если я попытаюсь использовать его на fastapi, он выдаст ошибку, которая уже используется.

Мое единственное сомнение заключается в том, что если я запущу несколько микросервисов и закрою сокет, я не знаю, возможно ли, что другое приложение будет использовать тот же порт, который я пытаюсь использовать.

Я думаю, что вероятность этого очень близка к нулю, но это может произойти.

Кроме того, теперь я не могу запустить команду uvicorn, и мне нужно запустить приложение с помощью python3 -m main, это совсем неплохо, но я думаю, что мне нужно этим поделиться.

Если кто-то знает другой лучший способ, поделитесь со мной этой идеей.

Другие вопросы по теме