gRPC & API Berprestasi Tinggi · Pelajaran

Penstriman Pelayan Diterangkan

Fahami dan laksanakan penstriman sisi pelayan, iaitu pelayan menghantar berbilang tindak balas kepada satu permintaan klien.

Pelajaran 1 daripada 412 langkah

Penstriman Pelayan Diterangkan ialah pelajaran gRPC & API Berprestasi Tinggi percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran gRPC & API Berprestasi Tinggi, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus gRPC & API Berprestasi Tinggi merangkumi sejumlah 4 pelajaran.

Asas Penstriman Pelayan

Dalam gRPC, panggilan penstriman sebelah pelayan berlaku apabila klien menghantar satu permintaan, tetapi pelayan membalas dengan urutan mesej.

Anggaplah ia seperti melanggan surat berita: anda menghantar satu permintaan (melanggan), kemudian pelayan menghantar banyak kemas kini kepada anda dari semasa ke semasa (surat berita).

Kes Penggunaan Penstriman

Penstriman pelayan sesuai untuk situasi apabila pelayan perlu menolak kemas kini atau sejumlah besar data kepada klien dari semasa ke semasa. Penggunaan biasa termasuk:

  • Suapan data masa nyata: Harga saham, bacaan penderia.
  • Pemberitahuan: Amaran, mesej sembang.
  • Muat turun data besar: Memecahkan fail besar kepada bahagian yang lebih kecil.

Protobuf untuk Penstriman Pelayan

Untuk mentakrifkan kaedah penstriman sebelah pelayan dalam fail .proto anda, tambahkan kata kunci stream sebelum jenis respons.

Ini memberitahu gRPC bahawa pelayan akan menghantar berbilang mesej untuk setiap permintaan klien, bukan hanya satu.

Contoh Protobuf Penstriman

Beginilah cara anda mentakrifkan perkhidmatan yang menstrim mesej daripada pelayan:

syntax = "proto3";

option java_package = "com.coddykit.grpc";
option java_outer_classname = "StreamingProto";

service NotifierService {
  rpc SubscribeToNotifications (SubscriptionRequest) returns (stream Notification);
}

message SubscriptionRequest {
  string userId = 1;
}

message Notification {
  string message = 1;
  int64 timestamp = 2;
}

Melaksanakan Penstriman Pelayan

Di sisi pelayan, kaedah penstriman anda akan menerima satu objek permintaan, sama seperti panggilan unari. Walau bagaimanapun, bukannya memulangkan satu respons, anda akan menggunakan StreamObserver untuk menghantar berbilang respons kembali kepada klien.

Biasanya, anda akan mengulangi proses dan menghantar mesej, kemudian memanggil onCompleted() apabila selesai.

Struktur Kaedah Pelayan

Kaedah pelayan untuk panggilan penstriman menerima permintaan dan StreamObserver. Anda menghantar respons melalui responseObserver.onNext() dan menandakan penyelesaian dengan responseObserver.onCompleted().

// Example (Java)
public void subscribeToNotifications(SubscriptionRequest request,
    io.grpc.stub.StreamObserver<Notification> responseObserver) {

  String userId = request.getUserId();
  System.out.println("Client " + userId + " subscribed.");

  // Simulate sending multiple notifications
  for (int i = 0; i < 3; i++) {
    Notification notification = Notification.newBuilder()
        .setMessage("Update " + (i + 1) + " for " + userId)
        .setTimestamp(System.currentTimeMillis())
        .build();
    responseObserver.onNext(notification); // Send a message
    try {
      Thread.sleep(1000); // Wait a bit
    } catch (InterruptedException e) { /* handle */ }
  }

  responseObserver.onCompleted(); // Signal completion
  System.out.println("Finished sending notifications to " + userId);
}

Menerima Respons Penstriman

Klien membuat satu panggilan, tetapi kemudiannya perlu menunggu dan memproses beberapa respons. Klien menyediakan StreamObserver untuk mengendalikan mesej masuk, ralat dan isyarat penyelesaian daripada pelayan.

Pemerhati ini mempunyai kaedah onNext(), onError() dan onCompleted().

Pemerhati Strim Klien

StreamObserver klien menentukan tindak balasnya terhadap setiap peristiwa daripada strim pelayan. Ia memproses setiap mesej onNext sehingga onCompleted dipanggil.

// Example (Java)
StreamObserver<Notification> responseObserver = new StreamObserver<Notification>() {
  @Override
  public void onNext(Notification notification) {
    System.out.println("Received: " + notification.getMessage());
  }

  @Override
  public void onError(Throwable t) {
    System.err.println("Error: " + t.getMessage());
  }

  @Override
  public void onCompleted() {
    System.out.println("Server stream completed.");
  }
};

// Call the streaming method
// asyncStub.subscribeToNotifications(request, responseObserver);

Lengkapkan Perkhidmatan Strim Pelayan

Berikut ialah pelayan gRPC lengkap yang melaksanakan kaedah penstriman dari sisi pelayan SubscribeToNotifications. Jalankan pelayan ini dahulu, kemudian klien!

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import com.coddykit.grpc.StreamingProto.SubscriptionRequest;
import com.coddykit.grpc.StreamingProto.Notification;
import com.coddykit.grpc.NotifierServiceGrpc.NotifierServiceImplBase;

public class StreamingServer {

  private Server server;

  private void start() throws Exception {
    int port = 50051;
    server = ServerBuilder.forPort(port)
        .addService(new NotifierServiceImpl())
        .build()
        .start();
    System.out.println("Server started, listening on " + port);

    Runtime.getRuntime().addShutdownHook(new Thread() {
      @Override
      public void run() {
        System.err.println("*** shutting down gRPC server since JVM is shutting down");
        StreamingServer.this.stop();
        System.err.println("*** server shut down");
      }
    });
  }

  private void stop() {
    if (server != null) {
      server.shutdown();
    }
  }

  private void blockUntilShutdown() throws InterruptedException {
    if (server != null) {
      server.awaitTermination();
    }
  }

  public static void main(String[] args) throws Exception {
    final StreamingServer server = new StreamingServer();
    server.start();
    server.blockUntilShutdown();
  }

  static class NotifierServiceImpl extends NotifierServiceImplBase {
    @Override
    public void subscribeToNotifications(SubscriptionRequest request,
        StreamObserver<Notification> responseObserver) {

      String userId = request.getUserId();
      System.out.println("Server received subscription from: " + userId);

      for (int i = 0; i < 3; i++) {
        Notification notification = Notification.newBuilder()
            .setMessage("Update " + (i + 1) + " for " + userId)
            .setTimestamp(System.currentTimeMillis())
            .build();
        responseObserver.onNext(notification);
        try {
          Thread.sleep(1000); // Simulate some work
        } catch (InterruptedException e) {
          Thread.currentThread().interrupt();
          responseObserver.onError(e);
          return;
        }
      }
      responseObserver.onCompleted();
      System.out.println("Server finished sending notifications to: " + userId);
    }
  }
}

Penerima Strim Klien Lengkap

Sekarang, jalankan kod klien ini. Kod ini akan bersambung kepada pelayan dan menerima strim pemberitahuan.

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import com.coddykit.grpc.StreamingProto.SubscriptionRequest;
import com.coddykit.grpc.StreamingProto.Notification;
import com.coddykit.grpc.NotifierServiceGrpc;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class StreamingClient {

  public static void main(String[] args) throws InterruptedException {
    ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
        .usePlaintext() // For local testing, no TLS
        .build();

    NotifierServiceGrpc.Stub asyncStub = NotifierServiceGrpc.newStub(channel);

    CountDownLatch latch = new CountDownLatch(1);

    System.out.println("Client sending subscription request...");
    SubscriptionRequest request = SubscriptionRequest.newBuilder()
        .setUserId("user123")
        .build();

    asyncStub.subscribeToNotifications(request, new StreamObserver<Notification>() {
      @Override
      public void onNext(Notification notification) {
        System.out.println("Client received notification: " + notification.getMessage());
      }

      @Override
      public void onError(Throwable t) {
        System.err.println("Client received error: " + t.getMessage());
        latch.countDown();
      }

      @Override
      public void onCompleted() {
        System.out.println("Client stream completed.");
        latch.countDown();
      }
    });

    latch.await(5, TimeUnit.SECONDS); // Wait for stream to complete
    System.out.println("Client finished.");

    channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
  }
}

Semakan Kaedah Penstriman

Anda sedang membina perkhidmatan gRPC yang membolehkan klien meminta senarai entri log terkini, manakala pelayan terus menghantar entri baharu apabila entri tersebut berlaku. Takrif Protobuf manakah yang menetapkan kaedah GetLogStream dengan betul?

Ulang Kaji Penstriman

Syabas! Dalam pelajaran ini, anda telah mempelajari penstriman dari sisi pelayan dalam gRPC.

  • Penstriman membolehkan pelayan menghantar beberapa respons untuk satu permintaan klien.
  • Penstriman ditakrifkan dengan menggunakan kata kunci stream pada jenis respons dalam Protobuf.
  • Anda telah melaksanakan logik pelayan dan klien untuk mengendalikan aliran data berterusan ini.

Seterusnya, kita akan meneroka penstriman dari sisi klien, iaitu klien menghantar beberapa permintaan!

Percuma untuk bermula

Pelajari gRPC & API Berprestasi Tinggi dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Penstriman Pelayan Diterangkan” percuma?

Ya — teks penuh “Penstriman Pelayan Diterangkan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus gRPC & API Berprestasi Tinggi, tingkat taraf kepada CoddyKit PRO. Kursus gRPC & API Berprestasi Tinggi merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penstriman Pelayan Diterangkan”?

Fahami dan laksanakan penstriman sisi pelayan, iaitu pelayan menghantar berbilang tindak balas kepada satu permintaan klien. Anda berlatih gRPC & API Berprestasi Tinggi menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan gRPC & API Berprestasi Tinggi?

Tiada pengalaman terdahulu diperlukan. Pembelajaran gRPC & API Berprestasi Tinggi di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Penstriman Pelayan Diterangkan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran gRPC & API Berprestasi Tinggi ini?

Ya. Setiap pelajaran gRPC & API Berprestasi Tinggi menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Penstriman Pelayan Diterangkan
  2. Penstriman Klien Diterangkan
  3. Penstriman Dwiarah
  4. Kawalan Aliran & Tekanan Balik Penstriman
← Kembali ke gRPC & API Berprestasi Tinggi