http2google-cloud-run

Can I have my cloudrun server receive http/2 requests?


Can I have Google send http/2 requests to my server in cloud run?

I am not sure how google would know my server supports it since google terminates the SSL on the loadbalancer and sends http to the stateless servers in cloud run.

If possible, I am thinking of grabbing a few pieces from webpieces and creating a pure http/2 server with no http1.1 for microservices that I 'know' will only be doing http/2.

Also, if I have a pure http/2 server, is there a way that google translates from http1 requests to http/2 when needed so I could host websites as well?

The only info I could find was a great FAQ that seems to be missing the does it support http/2 on the server side(rather than client)...

https://github.com/ahmetb/cloud-run-faq


Solution

  • Cloud Run container contract requires your application to serve on an unencrypted HTTP endpoint. However, this can be either HTTP/1 or HTTP/2.

    Today, gRPC apps work on Cloud Run and gRPC actually uses HTTP/2 as its transport. This works because the gRPC servers (unless configured with TLS certificates) use the H2C (HTTP/2 unencrypted cleartext) protocol.

    So, if your application can actually serve traffic unencrypted using h2c protocol, the traffic between Cloud Run load balancer <=> your application can be HTTP/2, without ever being downgraded to HTTP/1.

    For example, in Go, you can use https://godoc.org/golang.org/x/net/http2/h2c package to automatically detect and upgrade http2 connections.

    To test if your application implements h2c correctly, you need to locally run:

    curl -v --http2-prior-knowledge http://localhost:8080
    

    and see < HTTP/2 200 response.

    (I'll make sure to add this to the FAQ repo.)