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 (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);
}
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;
}
rpc SayHello(HelloRequest) returns (HelloReply);
rpc LotsOfReplies(HelloRequest) returns (stream HelloReply);
rpc LotsOfGreetings(stream HelloRequest) returns (HelloReply);
rpc BidiHello(stream HelloRequest) returns (stream HelloReply);
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)
}
}
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, 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, 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ı 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ı!")
}
}
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(),
)
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))
2024 © Tüm hakları saklıdır - buraxta.com