全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Melacak Layanan Berbasis gRPC di ASM

更新时间:Jul 02, 2025

Managed Service for OpenTelemetry menyediakan serangkaian alat untuk pengembangan aplikasi terdistribusi, termasuk pemetaan jejak, statistik panggilan, topologi jejak, dan analisis ketergantungan aplikasi. Service Mesh (ASM) terintegrasi dengan Managed Service for OpenTelemetry. Topik ini menjelaskan cara menggunakan header untuk melacak layanan berbasis gRPC di ASM.

Prasyarat

Proyek Contoh

Untuk informasi lebih lanjut tentang proyek contoh gRPC, kunjungi hello-servicemesh-grpc. Direktori dalam topik ini adalah direktori dari hello-servicemesh-grpc.

Mendapatkan Header pada Server dan Klien gRPC

Obtain headers on the gRPC server

  • Metode Dasar

    • Gunakan Java untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.

      Implementasikan metode interceptCall(ServerCall<ReqT, RespT> call,final Metadata m,ServerCallHandler<ReqT, RespT> h) dari operasi ServerInterceptor. Kemudian, jalankan perintah String v = m.get(k) untuk mendapatkan header pada server. Tipe parameter input metode get() adalah Metadata.Key<String>.

    • Gunakan Go untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.

      Implementasikan metode metadata.FromIncomingContext(ctx)(md MD, ok bool). Format MD adalah map[string][]string.

    • Gunakan Node.js untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.

      Implementasikan metode call.metadata.getmap(). Tipe nilai yang dikembalikan adalah [key: string]: MetadataValue. Tipe MetadataValue adalah string/Buffer.

    • Gunakan Python untuk mengimplementasikan metode dasar mendapatkan header pada server gRPC.

      Implementasikan metode context.invocation_metadata(). Nilai yang dikembalikan adalah array dua-tupel dalam format ('k','v'). Pasangan kunci-nilai dapat diperoleh dari m.key, m.value.

  • Unary RPC

    • Gunakan Java untuk mengimplementasikan metode panggilan prosedur jarak jauh (RPC) unary mendapatkan header pada server.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC unary mendapatkan header pada server.

      Panggil metadata.FromIncomingContext(ctx) dalam metode. Nilai parameter ctx diperoleh dari parameter input metode Talk.

    • Gunakan Node.js untuk mengimplementasikan metode RPC unary mendapatkan header pada server.

      Panggil call.metadata.getMap() dalam metode.

    • Gunakan Python untuk mengimplementasikan metode RPC unary mendapatkan header pada server.

      Panggil context.invocation_metadata() dalam metode.

  • Server streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.

      Panggil metadata.FromIncomingContext(ctx) dalam metode. Anda dapat memanggil metode stream.Context() untuk mendapatkan nilai parameter ctx dari parameter input stream metode TalkOneAnswerMore.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.

      Panggil call.metadata.getMap() dalam metode.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming server mendapatkan header pada server.

      Panggil context.invocation_metadata() dalam metode.

  • Client streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.

      Panggil metadata.FromIncomingContext(ctx) dalam metode. Anda dapat memanggil metode stream.Context() untuk mendapatkan nilai parameter ctx dari parameter input stream metode TalkMoreAnswerOne.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.

      Panggil call.metadata.getMap() dalam metode.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming klien mendapatkan header pada server.

      Panggil context.invocation_metadata() dalam metode.

  • Bidirectional streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.

      Panggil metadata.FromIncomingContext(ctx) dalam metode. Anda dapat memanggil metode stream.Context() untuk mendapatkan nilai parameter ctx dari parameter input stream metode TalkBidirectional.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.

      Panggil call.metadata.getMap() dalam metode.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming dua arah mendapatkan header pada server.

      Panggil context.invocation_metadata() dalam metode.

Send headers from the client

  • Metode Dasar

    • Gunakan Java untuk mengimplementasikan metode dasar mengirim header dari klien.

      Implementasikan interceptCall(MethodDescriptor<ReqT, RespT> m dari antarmuka interceptor ClientInterceptor, CallOptions o, Channel c) metode tersebut, dan implementasikan tipe nilai kembali ClientCall<ReqT. Metode start((Listener<RespT> l, Metadata h)) dari RespT> mengisi informasi header dengan h.put(k, v). Tipe parameter input metode put k adalah Metadata.Key<String>, dan tipe v adalah String.

    • Gunakan Go untuk mengimplementasikan metode dasar mengirim header dari klien.

      metadata.AppendToOutgoingContext(ctx,kv ...) context.Context

    • Gunakan Node.js untuk mengimplementasikan metode dasar mengirim header dari klien.

      metadata=call.metadata.getMap()metadata.add(key, headers[key])

    • Gunakan Python untuk mengimplementasikan metode dasar mengirim header dari klien.

      Tetapkan variabel dalam perintah metadata_dict = {} dalam format berikut: metadata_dict[c.key] = c.value. Konversikan tipe data dalam array metadata_dict ke list tuple dengan menggunakan list(metadata_dict.items()).

  • Unary RPC

    • Gunakan Java untuk mengimplementasikan metode RPC unary mengirim header dari klien.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC unary mengirim header dari klien.

      Panggil metadata.AppendToOutgoingContext(ctx,kv) dalam metode.

    • Gunakan Node.js untuk mengimplementasikan metode RPC unary mengirim header dari klien.

      Panggil metode dasar.

    • Gunakan Python untuk mengimplementasikan metode RPC unary mengirim header dari klien.

      Panggil metode dasar.

  • Server streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.

      Panggil metadata.AppendToOutgoingContext(ctx,kv) dalam metode.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.

      Panggil metode dasar.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming server mengirim header dari klien.

      Panggil metode dasar.

  • Client streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.

      Panggil metadata.AppendToOutgoingContext(ctx,kv) dalam metode.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.

      Panggil metode dasar.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming klien mengirim header dari klien.

      Panggil metode dasar.

  • Bidirectional streaming RPC

    • Gunakan Java untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.

      Header diintersep.

    • Gunakan Go untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.

      Panggil metadata.AppendToOutgoingContext(ctx,kv) dalam metode.

    • Gunakan Node.js untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.

      Panggil metode dasar.

    • Gunakan Python untuk mengimplementasikan metode RPC streaming dua arah mengirim header dari klien.

      Panggil metode dasar.

Propagasi headers

Dalam Managed Service for OpenTelemetry, metadata jejak upstream harus diteruskan ke downstream untuk mendapatkan informasi lengkap dari sebuah jejak. Oleh karena itu, informasi header terkait jejak yang diperoleh pada server harus diteruskan ke klien yang mengirim permintaan ke downstream.

Operasi model komunikasi yang diimplementasikan menggunakan Go, Node.js, dan Python dapat menerima header. Oleh karena itu, tiga tindakan berikut dapat diimplementasikan secara berurutan menggunakan operasi dari empat model komunikasi: Pertama, server membaca header. Lalu, server meneruskan header. Terakhir, klien mengirim header.

Operasi model komunikasi yang diimplementasikan menggunakan Java tidak dapat digunakan untuk menyebarkan header dalam proses terurut. Ini karena Java membaca dan menulis header menggunakan dua interceptor. Hanya interceptor baca yang mendapatkan ID unik dari jejak. Selain itu, layanan gRPC mungkin menerima dan mengirim permintaan secara bersamaan. Akibatnya, kedua interceptor tidak dapat dihubungkan menggunakan caching, yang merupakan metode paling intuitif untuk menampilkan jejak.

Java menggunakan Metadata-Context Propagation untuk melacak header.机制

Ketika interceptor server membaca header, header ditulis ke Context menggunakan ctx.withValue(key, metadata). Tipe parameter key adalah Context.Key<String>. Kemudian, interceptor klien membaca header dari Context menggunakan key.get(). Secara default, metode get menggunakan Context.current(). Ini memastikan bahwa konteks yang sama digunakan saat header dibaca dan ditulis.

Ketika header dapat disebarkan, Anda dapat melacak pesan permintaan dan respons antara klien dan server gRPC.

Deploy dan Verifikasi Topologi Instance ASM

Sebelum mengaktifkan Managed Service for OpenTelemetry untuk layanan berbasis gRPC, Anda harus menerapkan dan memverifikasi topologi instance ASM tempat layanan berbasis gRPC berada. Pastikan topologi instance ASM bekerja sesuai harapan.

Direktori pelacakan proyek contoh berisi skrip penerapan dalam Java, Go, Node.js, dan Python. Dalam contoh ini, skrip penerapan Go digunakan untuk menerapkan dan memverifikasi topologi instance ASM.

cd go
# Deploy topologi instance ASM.
sh apply.sh
# Verifikasi topologi instance ASM.
sh test.sh

Jika tidak ada pengecualian yang terjadi, topologi instance ASM bekerja sesuai harapan.

Gambar berikut menunjukkan topologi yang diterapkan dari instance Service Mesh.网络拓扑

Lihat Data Pelacakan

  1. Kumpulkan data pelacakan ASM ke Managed Service for OpenTelemetry. Untuk informasi lebih lanjut, lihat Kumpulkan Data Pelacakan ASM ke Managed Service for OpenTelemetry.

  2. Masuk ke Managed Service for OpenTelemetry console. Di panel navigasi kiri, klik Trace Entrance.

  3. Di halaman Trace Entrance, klik Application Topology dari aplikasi yang diinginkan.

    Anda dapat melihat jejak lengkap, termasuk requestor lokal-Ingressgateway-grpc-server-svc1-grpc-server-svc2-grpc-server-svc3.链路追踪

  4. Di halaman End-to-End Aggregation, klik tab End-to-End Aggregation untuk melihat jejak yang teragregasi.

    全链路聚合

  5. Di tab End-to-End Aggregation, klik jejak di kolom Span Name untuk melihat informasi detail dari jejak tersebut.

    调用链路