使用.net DaprClient获取状态时,Dapr GRPC连接被拒绝



我尝试了一些链接(并尝试了发布的建议(https://github.com/dapr/dotnet-sdk/issues/609)在发布这个问题之前,如果之前重复过,请提前道歉。如果有任何建议,我将不胜感激。提前谢谢。

  • 我有一个.net核心应用程序,我能够在自带dapr_Redis、dapr_zipkin和dapr_placement容器的自托管dapr开发环境中保存、存储和检索状态。然而,该应用程序正在本地运行,一切都很好。我能够从dapr_redis中检索所有密钥,并在应用程序中使用它们。我用来测试这一切的命令是------------------>

    dapr run--app id DaprMyApp--dapr http端口3500--组件路径/组件dotnet运行

  • 现在,我把它们放在一个docker compose文件中,我的应用程序也被容器化了(ps:如果没有任何Dapr,应用程序在docker中运行得非常好)。当该行执行----->

  • 等待daprClient。GetStateEntryAsync<IList<ServicePrincipal>gt;(storeName,"LightApplications");

    显示以下错误Dapr。Dapr异常:状态操作失败:Dapr终结点指示失败。有关详细信息,请参阅InnerException--->Grpc。果心RpcException:状态(StatusCode="Internal",Detail="Error starting gRPC call。HttpRequestException:Connection rejected SocketException:Connection Rejected",DebugException="System.Net.Http.HttpRequestException:连接被拒绝--->系统网插座。SocketException(111):连接被拒绝

从daprd容器日志时间=";2022-03-30T22:23:13.1586783Z";level=info msg=";所有未处理的组分";app_id=DaprMyApp实例=6e094ea3b2范围=dapr.runtime类型=日志版本=1.6.1

时间=";2022-03-30T22:23:13.1588662Z";level=info msg=";启用gRPC跟踪中间件";app_id=DaprMyApp实例=6e094ea3b2范围=dapr.runtime.grpc.api类型=日志版本=1.6.1

时间=";2022-03-30T22:23:13.1589773Z";level=info msg=";启用gRPC度量中间件";app_id=DaprMyApp实例=6e094ea3b2范围=dapr.runtime.grpc.api类型=日志版本=1.6.1

时间=";2022-03-30T22:23:13.1592719Z";level=info msg=";API gRPC服务器正在端口50001上运行;app_id=DaprMyApp实例=6e094ea3b2范围=dapr.runtime类型=日志版本=1.6.1

时间=";2022-03-30T22:23:13.1598482Z";level=info msg=";enabled metrics http中间件";app_id=DaprMyApp实例=6e094ea3b2作用域=dapr.runtime.http类型=log ver=1.6.1

时间=";2022-03-30T2:23:13.1599458Z";level=info msg=";启用跟踪http中间件";app_id=DaprMyApp实例=6e094ea3b2作用域=dapr.runtime.http类型=log ver=1.6.1

时间=";2022-03-30T22:23:13.1601179Z";level=info msg=";http服务器正在端口3500上运行";app_id=DaprMyApp实例=6e094ea3b2范围=dapr.runtime类型=日志版本=1.6.1

时间=";2022-03-30T2:23:13.1601313Z";level=info msg=";请求正文大小参数为:4〃;app_id=DaprMyApp实例=6e094ea3b2作用域=dapr.runtime类型=日志版本=1.6。。。。。。。时间=";2022-03-30T22:23:13.1609711Z";level=info msg=";dapr已初始化。状态:正在运行。Init Elapsed 175.1433ms";app_id=DaprCirus实例=6e094ea3b2作用域=dapr.runtime类型=日志ver=1.6.1

  • docker组合文件看起来像

    版本:";3.8〃;服务:应用程序:图片:DaprMyApp:最新部署:副本:1端口:-";5001:5001";#-";50001:50001";依赖于:-redis卷:-类型:绑定来源:c:\trust
    目标:/root/.dotnet/https环境:-DAPR_HOST=主机.docker.internal-DAPR_GRPC_PORT=5001-ASPNETCORE_URLS=https://+:5001;http://+:5000

    app-dapr:
    image: "daprio/daprd:latest"
    #command: [ "./daprd", "-app-id", "DaprMyApp", "-components-path", "/components" ]
    command: ["./daprd",
    "-app-id", "app",
    "-placement-host-address", "placement:50006",
    "-dapr-http-port", "3500",
    "-dapr-grpc-port", "50001",
    "-components-path", "/components"]
    ports:
    - "3500:3500"
    - "50001:50001"
    volumes:
    - "./components/:/components"
    depends_on:
    - redis
    network_mode: "service:app"   
    redis:
    image: "redis:alpine"
    ports:
    - "6379:6379"
    

Components文件夹中的StateStoreYaml当应用程序在本地运行时,用例1 redis:6379中测试的WHen被localhost:6379替换。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: redis:6379
- name: redisPassword
value: ""
- name: actorStateStore
value: "true"

DataPoint2当所有容器按照docker compose文件中的描述出现时。以下命令也可以正常工作(如中所述进行测试https://github.com/dapr/dapr/issues/2838)Invoke-RestMethod-Method Post-ContentType"application/json"-Body"[{quot;key":"name","value"Bruce Wayne"}]"-Uri"http://localhost:3500/v1.0/state/statestore'

DataPoint3如果我单独启动sidecar->

  • dapr run--应用程序id DaprMyApp--dapr http端口3500--组件路径/组件

  • 从上面的日志中检查GRPC显示的端口检查Dapr sidecar是否正在监听GRPC端口54799Dapr sidecar启动并运行。你开始行动了!Dapr日志将显示在此处。

  • 然后将此端口添加到DAPR_GPRC_port到机器的环境变量

  • 然后使用dotnet run在另一个窗口中单独运行应用程序。效果完美,

我希望让应用程序与DAPR sidecar对话,并在docker中从Redis容器中获取信息。提前感谢您的指点。

我能够用docker compose运行这项工作,并在本地docker上关闭集群模式。所有3个容器都可以正常工作(daprd、app和redis),并且能够在redis中保存和检索应用程序的状态。我以前使用docker堆栈部署进行测试。

感谢

最新更新