首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google运行上的GRPC :上游连接错误或头前断开/重置。重置原因:远程重置

Google运行上的GRPC :上游连接错误或头前断开/重置。重置原因:远程重置
EN

Stack Overflow用户
提问于 2022-02-21 13:58:43
回答 1查看 1.5K关注 0票数 2

编辑

我描述的第一个错误似乎很容易再现。实际上,Google似乎无法在.NET5 GRPC服务器上运行任何GRPC查询(至少,它以前确实工作过,但从今天2月21日起,似乎发生了一些变化)。复制:

  1. 创建一个.NET5 GRPC服务器(.NET6也失败):
代码语言:javascript
复制
dotnet new grpc -o TestGrpc
  1. 更改Program.cs,使其侦听$PORT,通常如下:
代码语言:javascript
复制
        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
            var url = string.Concat("http://0.0.0.0:", port);
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls(url);
                });
        }
  1. 一个非常简单的Dockerfile,可以为服务器提供一个映像(对于一个更标准的文件,比如这里,也会失败):
代码语言:javascript
复制
FROM mcr.microsoft.com/dotnet/sdk:5.0

COPY . ./

RUN dotnet restore ./TestGrpc.csproj
RUN dotnet build ./TestGrpc.csproj -c Release
CMD dotnet run --project ./TestGrpc.csproj
  1. 构建并推送到。
  2. 创建一个启用了HTTP/2的云运行实例(Ketrel需要HTTP/2,因此我们需要设置HTTP/2端到端,但我也没有测试,但效果并不好)。
  3. 例如,使用Grpcurl并尝试:
代码语言:javascript
复制
grpcurl {CLOUD_RUN_URL}:443 list

您将获得与我在(更复杂的)项目中获得的相同错误:

代码语言:javascript
复制
Failed to list services: rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: remote reset

在Google运行实例中,我只有日志:

代码语言:javascript
复制
2022-02-21T16:44:32.528530Z POST 200 1.02 KB 41 ms grpcurl/v1.8.6 grpc-go/1.44.1-dev https://***/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo

(我真的不明白为什么是200 .而且似乎从未达到实际的服务器实现,就好像有某种中间件阻止了查询以到达实现.)

我非常肯定,在我以这种方式开始我的项目时(然后改变了原型、服务等等),这曾经是行之有效的。如果有人有线索,我会非常感激的:-)

最初发布(不像上面的解释那么精确,但如果它能给出线索,我就把它留在这里)

我在Docker中运行了一个服务器(.NET5 GRPC应用程序)。此服务器在本地部署时工作非常正常。但是最近我在Google运行上部署它时出现了一个错误:upstream connect error or disconnect/reset before headers. reset reason: remote reset (当它以前运行良好时)。我继续使用我使用的任何客户端的错误,例如Curl:

代码语言:javascript
复制
curl -v https://{ENDPOINT}/{Proto-base}/{Method} --http2


*   Trying ***...
* TCP_NODELAY set
* Connected to *** (***) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.a.run.app
*  start date: Feb  7 02:07:06 2022 GMT
*  expire date: May  2 02:07:05 2022 GMT
*  subjectAltName: host "***" matched cert's "*.a.run.app"
*  issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x5564aad30860)
> GET /{Proto}/{Method} HTTP/2
> Host: ***
> user-agent: curl/7.68.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 503 
< content-length: 85
< content-type: text/plain
< date: Mon, 21 Feb 2022 13:51:31 GMT
< server: Google Frontend
< traceparent: 00-5a74487dafb5687961deeb17e0158ca9-5ab63cd23680e7d7-01
< x-cloud-trace-context: 5a74487dafb5687961deeb17e0158ca9/6536478782730069975;o=1
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
<
* Connection #0 to host *** left intact
upstream connect error or disconnect/reset before headers. reset reason: remote reset

Grpcurl也是这样:

代码语言:javascript
复制
grpcurl ***:443 list {Proto-base}

Failed to list methods for service "***.Company": rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: remote reset

我在这个错误上找不到太多的资源,因为我所读的大多数线程都是处理另一种类型的reset reason (如协议或连接等)。但我完全不知道remote reset是什么意思,也不知道我做错了什么。

查看Google Cloud运行中的日志,我可以看到服务器确实被击中了,尽管我在未触发的路由中添加了跟踪日志记录,因此它从未到达我的代码:

代码语言:javascript
复制
2022-02-21T14:44:22.840580Z  POST 200 1.01 KB 1 msgrpc-python/1.44.0 grpc-c/22.0.0 (linux; chttp2) https://***/{Protos-base}/{Method}

(如果我到达了我的代码,它应该在任何地方打印一些“你好”,但它没有)

有人发现过这个吗?

P.S.:关于特使有很多东西,但我甚至不使用这个。我只是有一个云运行实例(使用HTTP/2 --我尝试了,但由于协议问题,它失败了)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 08:44:33

这是一个来自特使和Google运行的实际bug。如果您使用的是.NET6,那么可以快速修复,否则就会比较麻烦。我将在这里复制阿曼达塔拉法马斯从谷歌云平台在我打开了github杂志上提供的答案。

以下是潜在的解决办法:

  • 当使用.NET 6时,可以将KestrelServerOptions.AllowAlternateSchemes设置为true。
  • 如果在较低的.NET版本中,考虑从代理/负载平衡器传递的GRPC :GRPC伪标头会导致ConnectionAbortedException dotnet/aspnetcore#30532 (注释)。或者考虑升级到.NET 6。

发生了什么:

  • 云运行依赖特使,自04/15/2021年以来,特使的行为发生了变化,参见发布说明中的"preserve_downstream_scheme“:历史/v1.18.0特使最近删除了旧行为:历史/当前#已删除-配置-或-运行时
  • 反过来,这暴露了这个.NET问题:从代理/负载平衡器传递的GRPC : flag伪标头导致了ConnectionAbortedException dotnet/aspnetcore#30532,为此添加了.NET配置标志,但只针对.NET 6。@meteatamel您能更新教程以便它使用Kestrel选项吗?

对我来说,设置KestrelServerOptions.AllowAlternate就足以使我的GRPC服务器再次工作。

正如@Craig所说,您可以跟踪问题这里,并查看问题是否得到解决。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71207574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档