Мне нужен тот же порт в конфигурации 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, есть ли помощь?
У меня нет ошибки, просто если я запускаю uvicorn main:app --reload, uvicorn устанавливает по умолчанию порт 8000, поэтому мне нужно получить этот порт и передать его в eureka, потому что, если позже кто-то запустит приложение с другой порт, ему/ей нужно будет изменить порт вручную в эврике
Разве вы не можете указать номер порта в переменной среды и использовать его из обоих приложений?
Да, могу, но мне нужен случайный доступный порт, потому что у меня много микросервисов.
Затем вы можете проверить, какой порт используется, с помощью команды bash, запущенной из Python. Однако в этом нет особого смысла, поскольку вы используете микросервисы, в которых вы определяете и IP, и порт. Также порт должен быть экспортирован из контейнера, иначе запросы не дойдут до приложения.
Я думал то же самое, но подумал, что это простой способ, позвольте мне попробовать эту идею, спасибо






Я создаю переменную с портом следующим образом:
import socket
sock = socket.socket()
sock.bind(('', 0))
APLICACION_PUERTO = sock.getsockname()[1]
sock.close()
Мне нужно закрыть сокет, потому что если я попытаюсь использовать его на fastapi, он выдаст ошибку, которая уже используется.
Мое единственное сомнение заключается в том, что если я запущу несколько микросервисов и закрою сокет, я не знаю, возможно ли, что другое приложение будет использовать тот же порт, который я пытаюсь использовать.
Я думаю, что вероятность этого очень близка к нулю, но это может произойти.
Кроме того, теперь я не могу запустить команду uvicorn, и мне нужно запустить приложение с помощью python3 -m main, это совсем неплохо, но я думаю, что мне нужно этим поделиться.
Если кто-то знает другой лучший способ, поделитесь со мной этой идеей.
Я никогда не использовал
eureka, но, насколько я понимаю, он запускает службу, которая прослушивает порт. Невозможно иметь две службы, прослушивающие один и тот же порт (вам понадобится балансировщик нагрузки). Возможно я ошибаюсь, но без ошибки, это то, что я могу сказать из вопроса