У меня есть фляжное приложение, которому нужно сделать запрос на сервер grpc, когда запрос сделан на конечную точку фляги.
@main.route("/someroute", methods=["POST"])
def some_function():
# Do something here
make_grpc_request(somedata)
return create_response(data=None, message = "Something happened")
def make_grpc_request(somedata):
channel = grpc.insecure_channel('localhost:30001')
stub = some_proto_pb2_grpc.SomeServiceStub(channel)
request = some_proto_pb2.SomeRequest(id=1)
response = stub.SomeFunction(request)
logger.info(response)
Но я продолжаю получать ошибку InactiveRpcError of RPC that terminated with: StatusCode.UNAVAILABLE failed to connect to all addresses
Простое размещение клиентского кода в обычном файле .py
работает нормально, и выполнение запроса внутри BloomRPC тоже работает нормально, так что это не может быть проблемой сервера.
Это как-то связано с тем, как работает фляга, и я просто что-то упускаю?
Я также безуспешно пытался использовать https://github.com/public/sonora:
with sonora.client.insecure_web_channel("localhost:30001") as channel:
stub = some_proto_pb2_grpc.SomeServiceStub(channel)
request = some_proto_pb2.SomeRequest(id=1)
response = stub.SomeFunction(request)
докер-compose.yml
version: "3.7"
services:
core-profile: #This is where the grpc requests are sent to
container_name: core-profile
build:
context: ./app/profile/
target: local
volumes:
- ./app/profile/:/usr/src/app/
env_file:
- ./app/profile/database.env
- ./app/profile/jwt.env
- ./app/profile/oauth2-dev.env
environment:
- APP_PORT=50051
- PYTHONUNBUFFERED=1
- POSTGRES_HOST=core-profile-db
ports:
- 30001:50051
expose:
- 50051
depends_on:
- core-profile-db
core-profile-db:
image: postgres:10-alpine
expose:
- 5432
ports:
- 54321:5432
env_file:
- ./app/profile/database.env
app-flask-server-db:
image: postgres:10-alpine
expose:
- 5433
ports:
- 54333:5433
env_file:
- ./app/flask-server/.env
flask-server:
build:
context: ./app/flask-server/
dockerfile: Dockerfile-dev
volumes:
- ./app/flask-server:/usr/src/app/
env_file:
- ./app/flask-server/.env
environment:
- FLASK_ENV=docker
ports:
- 5000:5000
depends_on:
- app-flask-server-db
volumes:
app-flask-server-db:
name: app-flask-server-db
Службы grpc работают внутри контейнера докеров, используя тот же файл docker-compose.yml, что и сервер flask.
Было бы полезно включить файл docker-compose.yml
в ваш вопрос. Я подозреваю (!?), что вы пытаетесь получить доступ к серверу gRPC как localhost
, но Compose DNS дал ему другое имя (имя службы).
Спасибо, Даз, я добавил файл docker-compose.yml
.
Итак, ваше приложение Python должно ссылаться на службу gRPC как core-profile:50051
Имя хоста — служба Compose core-profile
, и, поскольку служба Python также находится в сети Compose, она должна использовать 50051
. localhost:30001
— это способ доступа к нему с хоста Compose.
Хорошо, теперь это работает. Как глупо с моей стороны. Вы можете добавить это как ответ, и я приму это.
Я рад слышать, что это работает!
Ваше приложение (служба) Python должно ссылаться на службу gRPC как core-profile:50051
.
Имя хоста — служба Compose core-profile
, и, поскольку служба Python также находится в сети Compose, она должна использовать 50051
.
localhost:30001
— это то, как вы бы получили к нему доступ с хоста Compose.
Как у вас обстоят дела?