Dağıtım & h2c
Bağlantı API'si oluşturduktan sonra, hala onu üretime dağıtmanız gerekiyor. Bu kılavuz, zaman aşımını, gözlemlenebilirliği, TLS olmadan HTTP/2'yi ve CORS'u nasıl yapılandıracağınızı kapsar.
Zaman Aşımı ve Bağlantı Havuzları
Connect, net/http'ye yakın bir şekilde çalışır, bu yüzden sunucularınızı ve
istemcilerinizi normalde yapacağınız gibi yapılandırmalısınız. (Farklı
zaman aşımının ne anlama geldiğinden emin değilseniz, bu Cloudflare blog
yazısı iyi bir başlangıç noktasıdır.) Ancak bazı RPC
özgü nüanslar vardır:
- RPC istemcileri genellikle çok az sayıda ana makineye birçok istek yapar.
HTTP istemcinizde,
Transport.MaxIdleConnsPerHostdeğerini artırmak isteyebilirsiniz. - Çoğu RPC sunucusu HTTP yönlendirmelerini kullanmaz, bu yüzden
istemcilerinizi onları takip etmeyecek şekilde yapılandırmak isteyebilirsiniz:
client := &http.Client{
CheckRedirect: func(_ *http.Request, _ []*http.Request) error {
return http.ErrUseLastResponse
}
} - Connect her zaman
Accept-EncodingHTTP başlığını ayarlar, bu yüzden istemcininTransport.DisableCompressionayarı Connect RPC'leri üzerinde hiçbir etkiye sahip değildir. - Akış RPC'leri için zaman aşım süreleri, tüm mesaj alışverişine uygulanır. Sunucular, unary RPC'ler için zaman aşım sürelerini makul tutmakla birlikte akış RPC'leri için yeterince zaman bırakmayı dengelemelidir. İstemciler bir uzlaşma yapılandırması kullanabilir veya akış ve unary çağrıları için ayrı HTTP istemcileri kullanabilirler.
Özellikle akış RPC'lerini karşılamak için uzun sunucu zaman aşım süreleri
belirliyorsanız, net/http'nin zaman aşım sürelerini net.Conn üzerindeki
SetDeadline çağrısını kullanarak uyguladığını unutmayın.
Gerçekten "veri gönderilmiyorsa veya alınmıyorsa N ms içinde bu bağlantıyı kapat" gibi bir boşta zaman aşımına ihtiyacımız var. Ne yazık ki, bu API mevcut değil — ve olmadan, herhangi bir okuma veya yazma, tüm akış zaman aşımı olana kadar engellenebilir.
Ayrıca, eğer http.Server 'ınızda
ReadTimeout veya WriteTimeout alanı yapılandırılmışsa, bu tüm işlem
süresine uygulanır, akış çağrıları için bile. Daha fazla bilgi için [SSS]
(../faq.md#stream-error) bölümüne bakın.
Gözlemlenebilirlik
Connect, net/http'ye yakın çalıştığı için, bir http.Handler veya
http.Client ile çalışan tüm günlükleme, izleme veya metrikler Connect ile de
çalışır. Özellikle otelhttp OpenTelemetry paketi ve
ochttp OpenCensus paketi, Connect sunucuları ve istemcileriyle
sorunsuz bir şekilde çalışır.
TLS Olmadan HTTP/2
Birçok ortamda HTTP/2 protokolünü TLS olmadan (h2c olarak bilinir)
kullanmanız gerekebilir. Örneğin, GCP'nin Cloud Run hizmeti yalnızca
sunucunuz h2c'yi destekliyorsa uçtan uca HTTP/2'yi destekler. Benzer şekilde,
h2c kullanarak grpc-go sunucuları ve istemcileri ile birlikte
çalışmak isteyebilirsiniz (bu, insecure paketi aracılığıyla). net/http
doğrudan h2c için yapılandırma düğmeleri sunmadığından, Connect sunucuları ve
istemcileri golang.org/x/net/http2 kullanmalıdır.
Herhangi bir http.Handler'a h2c desteği eklemek için onu
h2c.NewHandler ile sarmanız yeterlidir. Bunu genellikle sunucunuzu
oluştururken yaparsınız:
package main
import (
"net/http"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
)
func main() {
mux := http.NewServeMux()
// Burada bazı işleyicileri monte edin.
server := &http.Server{
Addr: ":http",
Handler: h2c.NewHandler(mux, &http2.Server{}),
// Zaman aşımını unutmamayı unutmayın!
}
}
İstemcilerinizi h2c kullanacak şekilde yapılandırmak sadece biraz daha karmaşıktır:
package main
import (
"crypto/tls"
"net"
"net/http"
"golang.org/x/net/http2"
)
func newInsecureClient() *http.Client {
return &http.Client{
Transport: &http2.Transport{
AllowHTTP: true,
DialTLS: func(network, addr string, _ *tls.Config) (net.Conn, error) {
// Bu istemciyi h2c dışındaki trafiğinizi de kullanıyorsanız,
// ağ TCP değilse veya adres bir izinli listede değilse tls.Dial'e
// devretmeyi düşünebilirsiniz.
return net.Dial(network, addr)
},
// Zaman aşımını unutmamayı unutmayın!
},
}
}
CORS
Farklı kökenli kaynak paylaşımı (CORS), web istemcilerini sunucunun kendi
dışındaki diğer kökenlerde desteklemek için gereklidir. Go'da sunucular, CORS'u
herhangi bir popüler üçüncü taraf kütüphaneyi kullanarak veya OPTIONS
isteklerini işlemek için küçük bir net/http ara yazılıması yazarak
yapılandırabilir. Her iki durumda da,
connectrpc.com/cors paketi bazı
yararlı yardımcı işlevler sağlar.
Aşağıdaki örnek, github.com/rs/cors paketini
kullanarak bir Connect işleyicisine CORS desteği eklemeyi gösterir:
import (
"net/http"
connectcors "connectrpc.com/cors"
"github.com/rs/cors"
)
// withCORS, bir Connect HTTP işleyicisine CORS desteği ekler.
func withCORS(h http.Handler) http.Handler {
middleware := cors.New(cors.Options{
AllowedOrigins: []string{"example.com"},
AllowedMethods: connectcors.AllowedMethods(),
AllowedHeaders: connectcors.AllowedHeaders(),
ExposedHeaders: connectcors.ExposedHeaders(),
})
return middleware.Handler(h)
}
Uygulamanıza özgü istek başlıklarını izin verilen başlıklara dahil ettiğinizden
ve yanıt başlıklarını ortaya çıkan başlıklara eklediğinizden emin olun. Uygulamanız
trailer kullanıyorsa, bunlar unary Connect RPC'leri için Trailer- ön ekiyle başlık
alanları olarak gönderilecektir.