NOT: Bu site kullanımdan kaldırılmıştır. Site 31 Ocak 2023'ten sonra kapatılacak ve trafik https://protobuf.dev adresindeki yeni siteye yönlendirilecek. Bu sırada, yalnızca protobuf.dev'de güncellemeler yapılacak.

hizmet.h

#include <google/protobuf/service.h>
namespace google::protobuf

KULLANIMDAN KALDIRILDI: Bu modül, proto2 TBG hizmetlerinin temelindeki soyut arayüzleri bildirir.

Bunlar, herhangi bir TBG uygulamasından bağımsız olarak tasarlandığından, proto2 hizmetleri çeşitli uygulamalara ek olarak kullanılabilir. 2.3.0 sürümünden itibaren, TBG uygulamaları bunları geliştirmeye çalışmamalı, bunun yerine belirli TBG uygulamasına özel kod oluşturan kod oluşturma eklentisi sağlamalıdır. Bu şekilde oluşturulan kod, kullanılan uygulamaya daha uygun olabilir ve gereksiz dolaylı katmanlardan kaçınabilir.

Protokol derleyiciyi bir hizmet tanımını derlemek için kullandığınızda, bu grup iki sınıf oluşturur: Hizmet için soyut bir arayüz (hizmet tanımıyla eşleşen yöntemlere sahip) ve "stub" uygulaması. Saplama, hizmetin yerel uygulamasını emüle eden, RpcChannel'ın çevresindeki tür için güvenli bir sarmalayıcıdır.

Örneğin, hizmet tanımı:

service MyService {
  rpc Foo(MyRequest) returns(MyResponse);
}

"MyService" soyut bir arayüzü ve "MyService::Stub" sınıfını oluşturur. Bir Hizmet'i aşağıdaki gibi uygulayabilirsiniz:

class MyServiceImpl : public MyService {
 public:
  MyServiceImpl() {}
  ~MyServiceImpl() {}

  // implements MyService ---------------------------------------

  void Foo(google::protobuf::RpcController* controller,
           const MyRequest* request,
           MyResponse* response,
           Closure* done) {
    // ... read request and fill in response ...
    done->Run();
  }
};

Ardından UPC sunucu uygulamanızda MyServiceImpl örneğini kaydedersiniz. (Bunun nasıl yapılacağı uygulamaya bağlıdır.)

Bir uzak MyServiceImpl'yi çağırmak için öncelikle bu ağa bağlı bir RpcChannel'ın olması gerekir. Kanal oluşturma işlemi, TBG uygulamanıza tekrar bağlıdır. Bu örnekte örnek olarak "MyRpcChannel" ifadesini kullanıyoruz:

MyRpcChannel channel("rpc:hostname:1234/myservice");
MyRpcController controller;
MyServiceImpl::Stub stub(&channel);
FooRequest request;
FooResponse response;

// ... fill in request ...

stub.Foo(&controller, request, &response, NewCallback(HandleResponse));

İleti Dizisi Güvenliğinde:

Farklı TB uygulamaları, geri çağırmaları hangi ileti dizilerinde çalıştırabilecekleri ve uygulamanın UPS sistemini çağırmak için kullanmasına izin verilen içerikler konusunda farklı garantiler verebilir. Taşınabilir yazılımlar, geri çağırmalar için herhangi bir mesaj dizisinde çağrılmaya hazır olmalıdır. Ancak, geri çağırmaları aldığı mesajlar dışındaki herhangi bir mesaj dizisinden UPS sistemini çağırmaya çalışmamalıdır. Gerçekçi olursa da basit yazılımlar büyük olasılıkla tek iş parçalı bir UPS sistemi, ileri teknoloji yazılımlar birden fazla mesaj dizisi kullanmak ister. TBG uygulamaları birden fazla seçenek sağlamalıdır.

Bu dosyadaki sınıflar

Protokol-arabelleğe dayalı UPÇ hizmetleri için soyut temel arayüz.
RpcController tek bir yöntem çağrısını uyumlulaştırır.
Bir TBG kanalı için soyut arayüz.

sınıf hizmeti

#include <google/protobuf/service.h>
namespace google::protobuf

Protokol-arabelleğe dayalı UPÇ hizmetleri için soyut temel arayüz.

Hizmetler soyut arayüzlerdir (sunucular veya koçan olarak uygulanır), ancak bu temel arayüzü alt sınıf olarak sınıflandırırlar. Bu arayüzün yöntemleri, derleme sırasında tam türünü bilmeden Hizmet yöntemlerini çağırmak için kullanılabilir (Düşünme işlemine benzer şekilde).

Üyeler

enum
ChannelOwnership
STB oluşturma aşamasında, STUB_OWNS_CHANNEL'yi oluşturucuya yok edildiğinde RpcChannel'ı silmesini bildirmek için ikinci parametre olarak iletebilirsiniz. devamı...
Service()
virtual
~Service()
virtual const ServiceDescriptor *
GetDescriptor() = 0
Bu hizmeti ve yöntemlerini açıklayan ServiceDescriptor dosyasını alın.
virtual void
CallMethod(const MethodDescriptor * method, RpcController * controller, const Message * request, Message * response, Closure * done) = 0
MethodDescriptor tarafından belirtilen hizmetin bir yöntemini çağırın. devamı...
virtual const Message &
GetRequestPrototype(const MethodDescriptor * method) const = 0
CallMethod(), iletilen isteğin ve yanıtın belirli bir Message (Sınıf) alt sınıfında olmasını gerektirir. devamı...
virtual const Message &
GetResponsePrototype(const MethodDescriptor * method) const = 0

enum Service::ChannelOwnership {
  STUB_OWNS_CHANNEL,
  STUB_DOESNT_OWN_CHANNEL
}

STB oluşturma aşamasında, STUB_OWNS_CHANNEL'yi oluşturucuya yok edildiğinde RpcChannel'ı silmesini bildirmek için ikinci parametre olarak iletebilirsiniz.

STUB_OWNS_KANAL
STUB_DOESNT_OWN_KANAL

virtual void Service::CallMethod(
        const MethodDescriptor * method,
        RpcController * controller,
        const Message * request,
        Message * response,
        Closure * done) = 0

MethodDescriptor tarafından belirtilen hizmetin bir yöntemini çağırın.

Bu, normalde hizmet yöntemlerinin standart tanımlarını çağıran basit bir Switch() olarak uygulanır.

Ön koşullar:

  • method->service() == GetDescriptor()
  • istek ve yanıt, GetRequestPrototype(method) ve GetResponsePrototype(method) tarafından döndürülen nesnelerle tam olarak aynı sınıflardadır.
  • Görüşme başladıktan sonra, istek üzerinde değişiklik yapılmamalı ve "tamamlanana" kadar çağrıya yanıt verilmemelidir.
  • "Controller", bu Service tarafından kullanılan UPC uygulaması için doğru türdedir. Stub'lar için "doğru tür", saplamanın kullandığı RpcChannel'a bağlıdır. Sunucu tarafı Hizmet uygulamalarının, sunucu tarafı TBG uygulamasının kullandığı tüm RpcController türlerini kabul etmesi beklenir.

Koşul koşulları:

  • Yöntem tamamlandığında "bitti" ifadesi aranır. Bu, CallMethod() yönteminden önce veya ileri bir tarihte olabilir.
  • TBG başarılı olursa "yanıt", sunucu tarafından döndürülen yanıtı içerir.
  • TBG başarısız olduysa "yanıt"ın içeriği tanımlanmamıştır. RpcController, hata olup olmadığını belirlemek ve sorgu hakkında daha fazla bilgi edinmek için sorgulanabilir.

virtual const Message & Service::GetRequestPrototype(
        const MethodDescriptor * method) const = 0

CallMethod(), iletilen isteğin ve yanıtın belirli bir Message (Sınıf) alt sınıfında olmasını gerektirir.

GetRequestPrototype() ve GetResponsePrototype(), bu gerekli türlerin varsayılan örneklerini alır. Daha sonra, CallMethod() yöntemine iletebileceğiniz değişebilir nesneler oluşturmak için bu örneklerde Message::New() işlevini çağırabilirsiniz.

Örnek:

const MethodDescriptor* method =
  service->GetDescriptor()->FindMethodByName("Foo");
Message* request  = stub->GetRequestPrototype (method)->New();
Message* response = stub->GetResponsePrototype(method)->New();
request->ParseFromString(input);
service->CallMethod(method, *request, response, callback);

RpcController sınıfı

#include <google/protobuf/service.h>
namespace google::protobuf

RpcController tek bir yöntem çağrısını uyumlulaştırır.

Denetleyicinin birincil amacı, TBG uygulamasına özgü ayarları değiştirmek için bir yöntem sunmak ve TBG düzeyindeki hataları öğrenmektir.

RpcController arayüzü tarafından sağlanan yöntemler, tüm uygulamaların desteklemesini beklediğimiz "en az ortak payda" özellik grubu olmalıdır. Belirli uygulamalar, daha gelişmiş özellikler (ör. son tarihin yayılması) sağlayabilir.

Üyeler

RpcController()
virtual
~RpcController()

İstemci tarafı yöntemler

Bu aramalar yalnızca istemci tarafında yapılabilir. Sonuçların sunucu tarafında tanımlanmamış olabilir (kilitlenme olabilir).
virtual void
Reset() = 0
RpcController'ı ilk durumuna sıfırlar. Böylece yeni bir çağrıda tekrar kullanılabilir. devamı...
virtual bool
Failed() const = 0
Arama tamamlandıktan sonra arama başarısız olursa doğru değerini döndürür. devamı...
virtual std::string
ErrorText() const = 0
Failed() doğruysa hatanın kullanıcılar tarafından okunabilir bir açıklamasını döndürür.
virtual void
StartCancel() = 0
Arayana, TBG çağrısının iptal edilmesini istediğini TBG sistemine bildirir. devamı...

Sunucu tarafı yöntemler

Bu aramalar yalnızca sunucu tarafından yapılabilir.

Sonuçların istemci tarafında tanımlanmamış olabilir (kilitlenebilir).

virtual void
SetFailed(const std::string & reason) = 0
Failed() değerinin istemci tarafında "true" değerini döndürmesine neden olur. devamı...
virtual bool
IsCanceled() const = 0
Bu değer doğruysa istemcinin TBG'yi iptal ettiğini gösterir. Bu nedenle sunucu, TBG'yi yanıtlamaktan vazgeçebilir. devamı...
virtual void
NotifyOnCancel(Closure * callback) = 0
TBG iptal edildiğinde belirtilen geri çağırmanın çağrılmasını ister. devamı...

virtual void RpcController::Reset() = 0

RpcController'ı ilk durumuna sıfırlar. Böylece yeni bir çağrıda tekrar kullanılabilir.

Bir TBG devam ederken çağrılmamalıdır.


virtual bool RpcController::Failed() const = 0

Arama tamamlandıktan sonra arama başarısız olursa doğru değerini döndürür.

Hatanın olası nedenleri TB uygulamasına bağlıdır. Arama başarısız olmadan önce Failed() yöntemi çağrılmamalıdır. Failed() doğru değerini döndürürse yanıt mesajının içeriği tanımsızdır.


virtual void RpcController::StartCancel() = 0

Arayana, TBG çağrısının iptal edilmesini istediğini TBG sistemine bildirir.

TBG sistemi hemen iptal edebilir, bir süre bekleyip iptal edebilir veya hatta aramayı hiç iptal etmeyebilir. Arama iptal edilirse "bitti" geri çağırması yine çağrılır ve RpcController o an için aramanın başarısız olduğunu gösterir.


virtual void RpcController::SetFailed(
        const std::string & reason) = 0

Failed() değerinin istemci tarafında "true" değerini döndürmesine neden olur.

"reason", ErrorText() tarafından döndürülen iletiye eklenecek. Hatalar hakkında makine tarafından okunabilir bilgileri döndürmeniz gerektiğini fark ederseniz, bu yanıtı yanıt protokolü arabelleğinize dahil etmeniz ve SetFailed()'ı çağırmamanız gerekir.


virtual bool RpcController::IsCanceled() const = 0

Bu değer doğruysa istemcinin TBG'yi iptal ettiğini gösterir. Bu nedenle sunucu, TBG'yi yanıtlamaktan vazgeçebilir.

Sunucu yine de son "bitti" geri çağırmasını çağırmalıdır.


virtual void RpcController::NotifyOnCancel(
        Closure * callback) = 0

TBG iptal edildiğinde belirtilen geri çağırmanın çağrılmasını ister.

Geri çağırma işlemi her zaman tam olarak bir kez yapılır. TBG işlemi iptal edilmeden tamamlanırsa, geri çağırma işlemi tamamlandıktan sonra aranır. NotifyOnCancel() çağrıldığında TB zaten iptal edildiyse geri çağırma hemen çağrılır.

NotifyOnCancel() yöntemi, istek başına birden fazla kez çağrılamaz.

sınıf RpcChannel

#include <google/protobuf/service.h>
namespace google::protobuf

Bir TBG kanalı için soyut arayüz.

RpcChannel, bir Service (İletişim) satırının iletişimini temsil eder. Bu satır, söz konusu Service'in yöntemlerini çağırmak için kullanılabilir. Hizmet başka bir makinede çalışıyor olabilir. Normalde doğrudan bir RpcChannel'ı çağırmamanız, bunun yerine bir kapsayıcı Service oluşturmanız gerekir. Örnek:

RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234");
MyService* service = new MyService::Stub(channel);
service->MyMethod(request, &response, callback);

Üyeler

RpcChannel()
virtual
~RpcChannel()
virtual void
CallMethod(const MethodDescriptor * method, RpcController * controller, const Message * request, Message * response, Closure * done) = 0
Uzak hizmetin belirtilen yöntemini çağırın. devamı...

virtual void RpcChannel::CallMethod(
        const MethodDescriptor * method,
        RpcController * controller,
        const Message * request,
        Message * response,
        Closure * done) = 0

Uzak hizmetin belirtilen yöntemini çağırın.

Bu prosedürün imzası Service::CallMethod() ile aynıdır, ancak şartlar bir önemli açıdan daha katıdır: İstek ve yanıt nesneleri, tanımlayıcı-method->input_type() ve method->output_type() olduğu sürece belirli bir sınıftan olmak zorunda değildir.