logo
eng-flag

gRPC Notları ve İpuçları

İçindekiler

  1. gRPC'ye Giriş
  2. Protocol Buffers
  3. Servis Tanımı
  4. gRPC Servis Türleri
  5. gRPC Kavramları
  6. gRPC Servislerinin Uygulanması
  7. Hata İşleme
  8. Metadata
  9. Interceptor'lar
  10. Zaman Aşımı ve İptal
  11. Yük Dengeleme
  12. Güvenlik
  13. En İyi Uygulamalar
  14. Araçlar

gRPC'ye Giriş

gRPC, Google tarafından geliştirilen yüksek performanslı, açık kaynaklı evrensel bir RPC çerçevesidir. Taşıma için HTTP/2 kullanır, arayüz tanımlama dili olarak Protocol Buffers'ı kullanır ve kimlik doğrulama, çift yönlü akış ve akış kontrolü, engelleyici veya engelleyici olmayan bağlamalar, iptal ve zaman aşımı gibi özellikler sağlar.

Protocol Buffers

Protocol Buffers (protobuf), gRPC için varsayılan serileştirme mekanizmasıdır. İşte temel bir örnek:

syntax = "proto3";

package example;

message Person {
  string name = 1;
  int32 age = 2;
  repeated string hobbies = 3;
}

message GetPersonRequest {
  string id = 1;
}

service PersonService {
  rpc GetPerson(GetPersonRequest) returns (Person);
}

Servis Tanımı

Bir gRPC servisi, bir .proto dosyasında tanımlanır:

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

gRPC Servis Türleri

  1. Unary RPC
rpc SayHello(HelloRequest) returns (HelloReply);
  1. Sunucu Akışlı RPC
rpc LotsOfReplies(HelloRequest) returns (stream HelloReply);
  1. İstemci Akışlı RPC
rpc LotsOfGreetings(stream HelloRequest) returns (HelloReply);
  1. Çift Yönlü Akışlı RPC
rpc BidiHello(stream HelloRequest) returns (stream HelloReply);

gRPC Kavramları

  • Kanal: Bir kanal, belirtilen bir ana bilgisayar ve bağlantı noktasında bir gRPC sunucusuna bağlantı sağlar.
  • Stub: Bir stub, gRPC servisinin aynı yöntemlerini uygulayan istemci tarafı bir nesnedir.
  • Sunucu: gRPC sunucusu, servis arayüzünü uygular ve istemci çağrılarını işlemek için bir gRPC sunucusu çalıştırır.

gRPC Servislerinin Uygulanması

Go dilinde örnek:

type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Merhaba " + in.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("dinleme başarısız: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("sunucu başlatma başarısız: %v", err)
    }
}

Hata İşleme

gRPC, hata işleme için durum kodlarını kullanır:

import "google.golang.org/grpc/codes"
import "google.golang.org/grpc/status"

func (s *server) SomeRPC(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    if someError {
        return nil, status.Errorf(codes.InvalidArgument, "Geçersiz argüman: %v", err)
    }
    // Normal işleme
}

Metadata

Metadata, belirli bir RPC çağrısı hakkında anahtar-değer çiftleri şeklinde bilgidir.

Metadata gönderme (istemci tarafı):

md := metadata.Pairs(
    "key1", "value1",
    "key2", "value2",
)
ctx := metadata.NewOutgoingContext(context.Background(), md)
response, err := client.SomeRPC(ctx, request)

Metadata alma (sunucu tarafı):

func (s *server) SomeRPC(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    md, ok := metadata.FromIncomingContext(ctx)
    if ok {
        // Metadata'yı kullan
    }
    // İsteği işle
}

Interceptor'lar

Interceptor'lar, RPC çağrılarına özel davranış eklemenizi sağlar.

Unary interceptor:

func unaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
    log.Printf("işlemeden önce. Bilgi: %+v", info)
    resp, err := handler(ctx, req)
    log.Printf("işlemeden sonra. yanıt: %+v", resp)
    return resp, err
}

s := grpc.NewServer(grpc.UnaryInterceptor(unaryInterceptor))

Zaman Aşımı ve İptal

Zaman aşımı ayarlama:

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

response, err := client.SomeRPC(ctx, request)
if err != nil {
    statusErr, ok := status.FromError(err)
    if ok && statusErr.Code() == codes.DeadlineExceeded {
        log.Println("Zaman aşımı!")
    }
}

Yük Dengeleme

gRPC, istemci tarafı yük dengelemeyi destekler. Servis keşfi için DNS kullanabilir ve özel yük dengeleme politikaları uygulayabilirsiniz.

conn, err := grpc.Dial(
    "service:50051",
    grpc.WithBalancerName("round_robin"),
    grpc.WithInsecure(),
)

Güvenlik

TLS kullanımı:

creds, err := credentials.NewClientTLSFromFile("cert.pem", "")
if err != nil {
    log.Fatalf("Kimlik bilgileri yüklenemedi: %v", err)
}
conn, err := grpc.Dial("example.com:50051", grpc.WithTransportCredentials(creds))

En İyi Uygulamalar

  1. Protocol Buffers'ı akıllıca kullanın: Yeniden kullanılabilir mesajlar tanımlayın ve derin iç içe yapılardan kaçının.
  2. Uygun hata işleme uygulayın: Uygun durum kodlarını kullanın ve ayrıntılı hata mesajları sağlayın.
  3. Çift yönlü akışı dikkatli kullanın: Güçlüdür ancak yönetilmesi karmaşık olabilir.
  4. Kaynak sızıntılarını önlemek için zaman aşımı ve iptal mekanizmaları uygulayın.
  5. Günlükleme, kimlik doğrulama ve izleme gibi çapraz kesişen konular için interceptor'ları kullanın.
  6. Ölçeklenebilirlik için uygun yük dengeleme uygulayın.
  7. Güvenli iletişim için TLS kullanın.
  8. Geriye dönük uyumluluğu korumak için API'lerinizi sürümlendirin.
  9. Daha iyi servis keşfi ve yük dengeleme için sağlık kontrolü uygulayın.
  10. Hata ayıklama ve dinamik istemciler için gRPC yansımasını kullanın.
  11. Performans için optimize edin: Uygun mesaj boyutları kullanın ve sıkıştırmayı düşünün.
  12. Uygun testleri uygulayın: Birim testleri, entegrasyon testleri ve uçtan uca testler.
  13. Servislerinizi ve mesajlarınızı kapsamlı bir şekilde belgeleyin.
  14. Tekrarlanan kodu azaltmak ve tutarlılığı sağlamak için kod üretme araçlarını kullanın.
  15. Uygun metrikler ve izleme kullanarak gRPC servislerinizi izleyin.

Araçlar

  1. Protocol Buffer Derleyicisi (protoc): .proto dosyalarını derler
  2. gRPC CLI: gRPC servisleriyle etkileşim için komut satırı aracı
  3. BloomRPC: gRPC için GUI istemcisi
  4. ghz: gRPC kıyaslama ve yük testi aracı
  5. gRPC Gateway: gRPC servisleri için RESTful JSON API
  6. Evans: REPL arayüzüne sahip gRPC istemcisi
  7. gRPC Web: Web istemcileri için gRPC
  8. Postman: Artık gRPC isteklerini destekliyor
  9. grpcurl: gRPC sunucularıyla etkileşim için komut satırı aracı
  10. grpc-ecosystem: gRPC ekosistem projelerinin koleksiyonu

2024 © Tüm hakları saklıdır - buraxta.com