Anda dapat menggunakan ASMGrpcJsonTranscoder untuk mentranskode permintaan HTTP dengan badan JSON (permintaan HTTP/JSON) menjadi Google Remote Procedure Call (gRPC). Fitur ini memungkinkan Anda mengirim permintaan HTTP/JSON dari klien untuk mengakses layanan gRPC dalam instance Service Mesh (ASM). Topik ini menjelaskan cara menggunakan ASMGrpcJsonTranscoder untuk mengizinkan permintaan HTTP/JSON mengakses layanan gRPC dalam instance ASM.
Informasi latar belakang
Envoy adalah layanan proxy yang menyusun bidang data dari instance Service Mesh. Envoy mencakup berbagai ekstensi filter HTTP bawaan, termasuk transcoder gRPC-JSON. Untuk mengaktifkan transcoder gRPC-JSON, Anda harus menambahkan anotasi dan menghasilkan file .proto-descriptor di Envoy. Anda juga harus mendefinisikan Filter Envoy di bidang kontrol instance ASM untuk menyatakan fase spesifik di mana transcoder gRPC-JSON diaktifkan. Kemudian, Filter Envoy yang didefinisikan diterapkan untuk mengaktifkan transcoder gRPC-JSON pada fase tertentu.
Proses transkoding
Gateway ingress dalam instance ASM dapat mentranskode permintaan HTTP/JSON menjadi permintaan gRPC. Tabel berikut menggambarkan proses transkoding.
No. | Deskripsi |
1 | Bidang kontrol instance ASM menerapkan konfigurasi berikut ke gateway ingress: Filter Envoy yang digunakan untuk transkoding gRPC, serta gateway Istio dan layanan virtual yang digunakan untuk mengonfigurasi aturan untuk merutekan lalu lintas ke port layanan gRPC. Setelah gateway ingress menerima konfigurasi, gateway ingress segera memuat konfigurasi agar konfigurasi tersebut berlaku. |
2 | Setelah gateway ingress menerima permintaan HTTP dari klien Anda, gateway ingress mencocokkan aturan routing. Kemudian, gateway ingress mentranskode permintaan HTTP menjadi permintaan gRPC dan mengirim permintaan tersebut ke layanan gRPC tujuan dalam Service Mesh instance. |
3 | Setelah gateway ingress menerima respons gRPC dari layanan backend, gateway ingress mentranskode respons gRPC menjadi respons HTTP dan mengembalikan respons HTTP kepada Anda. |
Langkah 1: Tambahkan anotasi transkoding dan hasilkan file .proto-descriptor
Ubah file .proto dari layanan untuk menggunakan protokol gRPC guna mentranskode permintaan gRPC menjadi permintaan HTTP.
Untuk mengaktifkan transkoding dari permintaan HTTP/JSON ke permintaan gRPC, tambahkan anotasi berikut ke file .proto:
option(google.api.http) = {
get: "/sayHello/{name}"
};
File .proto dari layanan helloworld di situs resmi grpc.io digunakan dalam contoh ini. Kode berikut menunjukkan isi file .proto setelah anotasi ditambahkan. Untuk informasi lebih lanjut, kunjungi helloworld-grpc. Simpan konten berikut sebagai file helloworld.proto.
Tampilkan File helloworld.proto
// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
package helloworld;
import "google/api/annotations.proto";
// Definisi layanan greeting.
service Greeter {
// Mengirim salam
rpc SayHello (HelloRequest) returns (HelloReply) {
option(google.api.http) = {
get: "/sayHello/{name}"
};
}
rpc SayHelloStreamReply (HelloRequest) returns (stream HelloReply) {}
rpc SayHelloBidiStream (stream HelloRequest) returns (stream HelloReply) {}
}
// Pesan permintaan yang berisi nama pengguna.
message HelloRequest {
string name = 1;
}
// Pesan respons yang berisi salam
message HelloReply {
string message = 1;
}
Salin googleapis ke folder lokal.
Jalankan perintah protoc berikut dalam Protocol Buffers untuk menghasilkan file helloworld.proto-descriptor dari file helloworld.proto:
proto_path={path/to/helloworld-grpc}/grpc/proto
# https://github.com/googleapis/googleapis/tree/master/
GOOGLEAPIS_DIR={path/to/googleapis}
protoc \
--proto_path=${proto_path} \
--proto_path=${GOOGLEAPIS_DIR} \
--include_imports \
--include_source_info \
--descriptor_set_out=helloworld.proto-descriptor \
"${proto_path}"/helloworld.proto
Langkah 2: Aktifkan fitur transkoding protokol
Buat file grpcjsontranscoder-helloworld.yaml yang berisi konten berikut.
Untuk informasi lebih lanjut tentang bidang, lihat Deskripsi ASMGrpcJsonTranscoder.
Tampilkan File grpcjsontranscoder-helloworld.yaml
versiApi: istio.alibabacloud.com/v1beta1
jenis: ASMGrpcJsonTranscoder
metadata:
nama: grpcjsontranscoder-helloworld
namespace: istio-system
spesifikasi:
isGateway: true
nomorPort: 8080
workloadSelector:
label:
istio: ingressgateway
printOptions:
addWhitespace: true
alwaysPrintEnumsAsInts: false
alwaysPrintPrimitiveFields: false
preserveProtoFieldNames: false
prioritas: 0
layanan:
- helloworld.Greeter
protoDescriptorBin: 'CuF4ChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoEQHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24i2gIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoFcGF0Y2gYBiABKAlSAVIFcGF0Y2giKwoEZ1JQQyBUcmFuc2NvZGluZwoKIGdSUEMgVHJhbnNjb2RpbmcgYWRhbGFoIGZpdHVyIHVuZHVrIG1lbWFuZ2FwIGFuIGdSUEMgbWV0b2RlIGRhbiBzYXR1IGF0YXUKIGxlaGkgZ1JQQyBBUElzIGRhbiBSTVNUIEFQSXMgLiBNYW55IHNpc3RlbSwgaW5jbHVkaW5nIFtHb29nbGUKIEFQSXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVhcGlzL2dvb2dsZWFwaXMpLAogW0Nsb3VkIEVuZHBvaW50c10oaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2VuZHBvaW50cyksIFtnUlBDClNlcnZpY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkpLAogZGFuIFtFbnZveV0oaHR0cHM6Ly9naXRodWIuY29tL2Vudm95cHJveHkvZW52b3kpIHByb3h5IHN1cHBvcnQgZml0dXJpCiBkYW4gdW50dWsgZm9yIGxhcmdlIHNjYWxlIHByb2R1Y3Rpb24gc2VydmlzZS4KCGBIdHRwUnVsZWAga2V0ZW5kaSBza2hlbWEgZGFyaSBtYXBwaW5nIGdSUEMvUkVTVC4gTWFwcGluZyBpbmlKaGFuaAoga2FyYWthdGVyIGJhZ2FpbWFuYSBwb3J0aW9uIGdSUEMgcmVxdWVzdCBtZXNzYWdlIGRpZGFsaWthbiBrZSBVVkwKcGF0aCwgVVJMIGRlbXVhaiBwYXJhbWV0ZXIsIGRhbiBIVFRQIHJlcXVlc3QgYm9keS4gSW5pIGp1Z2EKbWVtbWFwIGdSUEMgcmVzcG9uc2UgbWVzc2FnZSBkYWdhbiBIVFRQIHJlc3BvbnNlIGJvZHkuIGBIdHRwUnVsZWAga2V0aW5kaQphZGEsIHRpcCBkaWthbmFsIG9sZWhgIGdvb2dsZS5hcGkuaHR0cGAuYW5ub3Rhc2kgcGFkYSBnUlBDIG1ldGhvZC4KCkVhY2ggbWFwcGluZyBzcGVzaWZpa2FzIFVSTCBwYXRoIHRlbXBsYXRlIGRhbiBIVFRQIG1ldGhvZC4gUGF0aAoKdGVtcGxhdGUgbWF5IG1lbmunjukgeSBzYXR1IGF0YXUgbGViaWggZ1JQQyByZXF1ZXN0IG1lc3NhZ2UsIHNlbGFtdQphZGEgZGlhbiBhZGFsYWggbm9uLXJlcGVhdGVkIGZpZWxkIGRlbmdhbiB0aXBlIGRhc2FyIChub24tbWVzc2FnZSkKdGlwZS4gUGF0aCB0ZW1wbGF0ZSBtZW5nZW5kYWxpIGJhZ2FpbWFuIGZpZWxkc2VyZGFyIGRlbgpncmVxdWVzdCBtZXNzYWdlIGRpZGFsaWthbiBkZW5nYW4gVVJMIHBhdGguCgpFeGFtcGxlOgoKICAgIHNlcnZpY2UgTWVzc2FnaW5nIHsKICAgICAgcnBjIEdldE1lc3NhZ2UoR2V0TWVzc2FnZVJlcXVlc3QpIHJldHVybnMgKE1lc3NhZ2UpIHsKICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkgPSB7CiAgICAgICAgICAgIGdldDogIi92MS97bmFtZT1tZXNzYWdlcy8qfSIKICAgICAgICB9OwogICAgICAgfQogICAgIH0KICAgICBtZXNzYWdlIEdldE1lc3NhZ2VSZXF1ZXN0IHsKICAgICAgIHN0cmluZyBuYW1lID0gMTsgLy8gTWFwcGVkIGtlIFVSTCBwYXRoLgogICAgIH0KICAgICBtZXNzYWdlIE1lc3NhZ2UgewogICAgICAgc3RyaW5nIHRleHQgPSAxOyAvLyBUaGUgcmVzb3VyY2UgY29udGVudC4KICAgICB9CgoKVGhpcyBlbmFibGVzIGFuIEhUVFAgSlNPTiB0byBnUlBDIG1hcHBpbmcgYXMgYmVsb3c6CgpIVFRQIHwgZ1JQQwogLS0tLS18LS0tLS0KIGBHRVQgL3YxL21lc3NhZ2VzLzEyMzQ1NmAgIHwgYEdldE1lc3NhZ2UobmFtZTogIm1lc3NhZ2VzLzEyMzQ1NiIpYAoKIEFueSBmaWVsZHMgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSB3aGljaCBhcmUgbm90IGJvdW5kIGJ5IHRoZSBwYXRoIHRlbXBsYXRlCiBhdXRvbWF0aWNhbGx5IGJlY29tZSBIVFRQIHF1ZXJ5IHBhcmFtZXRlcnMgaWYgdGhlcmUgaXMgbm8gSFRUUCByZXF1ZXN0IGJvZHkuCiBGb3IgZXhhbXBsZToKCiAgICAgc2VydmljZSBNZXNzYWdpbmcgewogICAgICAgcnBjIEdldE1lc3NhZ2UoR2V0TWVzc2FnZVJlcXVlc3QpIHJldHVybnMgKE1lc3NhZ2UpIHsKICAgICAgICAgb3B0aW9uIChnb29nbGUuYXBpLmh0dHApID0gewogICAgICAgICAgICAgZ2V0OiIvdjEvbWVzc2FnZXMve21lc3NhZ2VfaWR9IgogICAgICAgICB9OwogICAgICAgfQogICAgIH0KICAgICBtZXNzYWdlIEdldE1lc3NhZ2VSZXF1ZXN0IHsKICAgICAgIG1lc3NhZ2UgU3ViTWVzc2FnZSB7CiAgICAgICAgIHN0cmluZyBzdWJmaWVsZCA9IDE7CiAgICAgICB9CiAgICAgICBzdHJpbmcgbWVzc2FnZV9pZCA9IDE7IC8vIE1hcHBlZCB0byBVUkwgcGF0aC4KICAgICAgIGludDY0IHJldmlzaW9uID0gMjsgICAgLy8gTWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXIgYHJldmlzaW9uYC4KICAgICAgIFN1Yk1lc3NhZ2Ugc3ViID0gMzsgICAgLy8gTWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXIgYHN1Yi5zdWJmaWVsZGAuCiAgICAgfQoKIFRoaXMgZW5hYmxlcyBhIEhUVFAgSlNPTiB0byBSUEMgbWFwcGluZyBhcyBiZWxvdzoKCiBIVFRQIHwgZ1JQQwogLS0tLS18LS0tLS0KIGBHRVQgL3YxL21lc3NhZ2VzLzEyMzQ1Nj9yZXZpc2lvbj0yJnN1Yi5zdWJmaWVsZD1mb29gIHwKIGBHZXRNZXNzYWdlKG1lc3NhZ2VfaWQ6ICIxMjM0NTYiIHJldmlzaW9uOiAyIHN1YjogU3ViTWVzc2FnZShzdWJmaWVsZDoKICJmb28iKSlgCgogTm90ZSB0aGF0IGZpZWxkcyB3aGljaCBhcmUgbWFwcGVkIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhCiBwcmltaXRpdmUgdHlwZSBvciBhIHJlcGVhdGVkIHByaW1pdGl2ZSB0eXBlIG9yIGEgbm9uLXJlcGVhdGVkIG1lc3NhZ2UgdHlwZS4KIEluIHRoZSBjYXNlIG9mIGEgcmVwZWF0ZWQgdHlwZSwgdGhlIHBhcmFtZXRlciBjYW4gYmUgcmVwZWF0ZWQgaW4gdGhlIFVSTAoKYXMgYC4uLj9wYXJhbT1BJnBhcmFtPUJgLiBJbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UgdHlwZSwgZWFjaCBmaWVsZCBvZiB0aGUKIG1lc3NhZ2UgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgcGFyYW1ldGVyLCBzdWNoIGFzCiBgLi4uP2Zvby5hPUEmZm9vLmI9QiZmb28uYz1DYC4KCiBGb3IgSFRUUCBtZXRob2RzIHRoYXQgYWxsb3cgYSByZXF1ZXN0IGJvZHksIHRoZSBgYm9keWAgZmllbGQKIG1hcHMgdGhlIG1hcHBpbmcuIENvbnNpZGVyIGEgUkVTVCB1cGRhdGUgbWV0aG9kIG9uIHRoZQptZXNzYWdlIHJlc291cmNlIGNvbGxlY3Rpb246CgogICAgIHNlcnZpY2UgTWVzc2FnaW5nIHsKICAgICAgIHJwYyBVcGRhdGVNZXNzYWdlKFVwZGF0ZU1lc3NhZ2VSZXF1ZXN0KSByZXR1cm5zIChNZXNzYWdlKSB7CiAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKSA9IHsKICAgICAgICAgICBwYXRjaDogIi92MS9tZXNzYWdlcy97bWVzc2FnZV9pZH0iCiAgICAgICAgICAgYm9keTogIm1lc3NhZ2UiCiAgICAgICAgIH07CiAgICAgICB9CiAgICAgfQogICAgIG1lc3NhZ2UgVXBkYXRlTWVzc2FnZVJlcXVlc3QgewogICAgICAgc3RyaW5nIG1lc3NhZ2VfaWQgPSAxOyAvLyBtYXBwZWQgdG8gdGhlIFVSTAogICAgICAgTWVzc2FnZSBtZXNzYWdlID0gMjsgICAvLyBtYXBwZWQgdG8gdGhlIGJvZHkKICAgICB9CgoKVGhlIGZvbGxvd2luZyBIVFRQIEpTT04gdG8gUlBDIG1hcHBpbmcgaXMgZW5hYmxlZCwgd2hlcmUgdGhlCiByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNPTiBpbiB0aGUgcmVxdWVzdCBib2R5IGlzIGRldGVybWluZWQgYnkKIHByb3RvcyBKU09OIHNwZWNpZmljYXRpb247anNvbiBjb252ZXJzaW9uOgoKV2hpbGUgdGhlIHNpbmdsZSBzZWdtZW50IHZhcmlhYmxlIGZvbGxvd3MgdGhlIHNlbWFudGljcyBvZgogW1JGQyA2NTcwXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU3MCkgU2VjdGlvbiAzLjIuMiBTaW1wbGUgU3RyaW5nCiBFeHBhbnNpb24sIHRoZSBtdWx0aSBzZWdtZW50IHZhcmlhYmxlICoqZG9lcyBub3QqKiBmb2xsb3cgUkZDIDY1NzAgU2VjdGlvbgogMy4yLjMgUmVzZXJ2ZWQgRXhwYW5zaW9uLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIFJlc2VydmVkIEV4cGFuc2lvbgogZG9lcyBub3QgZXhwYW5kIHNwZWNpYWwgY2hhcmFjdGVycyBsaWtlIGA/YCBhbmQgYCNgLCB3aGljaCB3b3VsZCBsZWFkCiB0byBpbnZhbGlkIFVSTHMuIEFzIHRoZSByZXN1bHQsIGdSUEMgVHJhbnNjb2RpbmcgdXNlcyBhIGN1c3RvbSBlbmNvZGluZwogZm9yIG11bHRpIHNlZ21lbnQgdmFyaWFibGVzLgoKIFRoZSBwYXRoIHZhcmlhYmxlcyAqKm11c3Qgbm90KiogcmVmZXIgdG8gYW55IHJlcGVhdGVkIG9yIG1hcHBlZCBmaWVsZCwKYmVjYXVzZSBjbGllbnQgbGlicmFyaWVzIGFyZSBub3QgY2FwYWJsZSBvZiBoYW5kbGluZyBzdWNoIHZhcmlhYmxlIGV4cGFuc2lvbi4KCgojIyBSdWxlcyBmb3IgSFRUUCBtYXBwaW5nCgoIMS4gTGVhZiByZXF1ZXN0IGZpZWxkcyAocmVjdXJzaXZlIGV4cGFuc2lvbiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHJlcXVlc3QKICAgIG1lc3NhZ2UpIGFyZSBjbGFzc2lmaWVkIGludG8gdGhyZWUgY2F0ZWdvcmllczoKICAgIC0gRmllbGRzIHJlZmVycmVkIGJ5IHRoZSBwYXRoIHRlbXBsYXRlLiBUaGV5IGFyZSBwYXNzZWQgdmlhIHRoZSBVUkwgcGF0aC4KICAgIC0gRmllbGRzIHJlZmVycmVkIGJ5IHRoZSBbSHR0cFJ1bGUuYm9keV1bZ29vZ2xlLmFwaS5IdHRwUnVsZS5ib2R5XS4gVGhleQogICAgYXJlIHBhc3NlZCB2aWEgdGhlIEhUVFAKICAgICAgcmVxdWVzdCBib2R5LgogICAgLSBBbGwgb3RoZXIgZmllbGRzIGFyZSBwYXNzZWQgdmlhIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLCBhbmQgdGhlCiAgICAgIHBhcmFtZXRlciBuYW1lIGlzIHRoZSBmaWVsZCBwYXRoIGluIHRoZSBwcmVxdWVzdCBtZXNzYWdlLiBBIHJlcGVhdGVkCiAgICAgIGZpZWxkIGNhbiBiZSByZXByZXNlbnRlZCBhcyBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIHVuZGVyIHRoZSBzYW1lCiAgICAgIG5hbWUuCiAgMi4gSWYgW0h0dHBSdWxlLmJvZHldW2dvb2dsZS5hcGkuSHR0cFJ1bGUuYm9keV0gaXMgIioiLCB0aGVyZSBpcyBubyBVUkwKICBxdWVyeSBwYXJhbWV0ZXIsIGFsbCBmaWVsZHMKICAgICBhcmUgcGFzc2VkIHZpYSBVUkwgcGF0aCBhbmQgSFRUUCByZXF1ZXN0IGJvZHkuCiAgMy4gSWYgW0h0dHBSdWxlLmJvZHldW2dvb2dsZS5hcGkuSHR0cFJ1bGUuYm9keV0gaXMgb21pdHRlZCwgdGhlcmUgaXMgbm8gSFRUUAogIHJlcXVlc3QgYm9keSwgYWxsCiAgICAgZmllbGRzIGFyZSBwYXNzZWQgdmlhIFVSTCBwYXRoIGFuZCBVUkwgcXVlcnkgcGFyYW1ldGVycy4KCiAjIyMgUGF0aCB0ZW1wbGF0ZSBzeW50YXgKCiAgICAgVGVtcGxhdGUgPSAiLyIgU2VnbWVudHMgWyBWZXJiIF0gOwogICAgIFNlZ21lbnRzID0gU2VnbWVudCB7ICIvIiBTZWdtZW50IH0gOwogICAgIFNlZ21lbnQgID0gIioiIHwgIioqIiB8IExJVEVSQUwgfCBWYXJpYWJsZSA7CiAgICAgVmFyaWFibGUgPSAieyIgRmllbGRQYXRoIFsgIj0iIFNlZ21lbnRzIF0gIn0iIDsKICAgICBGaWVsZFBhdGggPSBJREVOVCB7ICIuIiBJREVOVCB9IDsKICAgICBWZXJiICAgICA9ICI6IiBMSVRFUkFMIDsKCgojIyBVc2luZyBnUlBDIEFQSSBTZXJ2aWNlIENvbmZpZ3VyYXRpb24KCgogZ1JQQyBBUEkgU2VydmljZSBDb25maWcgKHNlcnZpY2UgY29uZmlnKSBpcyBhIGNvbmZpZ3VyYXRpb24gbGFuZ3VhZ2UKIGZvciBjb25maWd1cmluZyBhIGdSUEMgc2VydmljZSB0byBiZWNvbWUgYSB1c2VyLWZhY2luZyBwcm9kdWN0LiBUaGUKIHNlcnZpY2UgY29uZmlnIGlzIHNpbXBseSB0aGUgWUFNTCBwcmVzZW50YXRpb24gb2YgdGhlIGBnb29nbGUuYXBpLlNlcnZpY2UYCnByb3RvIG1lc3NhZ2UuCgogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGluZyB5b3VyIHByb3RvIGZpbGUsIHlvdSBjYW4gY29uZmlndXJlIGdSUEMKXHRyYW5zY29kaW5nIGluIHlvdXIgc2VydmljZSBjb25maWcgWUFNTCBmaWxlcy4gWW91IGRvIHRoaXMgYnkKc3BlY2lmeWluZyBhIGBIdHRwUnVsZWAgaW50aGF0IG1hcHMgdGhlIGdSUEMgbWV0aG9kIHRvIGEgUkVTVCBlbmRwb2ludCwgYWNoaWV2aW5nIHRoZSBzYW1lCiBlZmZlY3QuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgeW91CiBoYXZlIGEgcHJvdG8gdGhhdCBpcyByZXVzZWQgaW4gbXVsdGlwbGUgc2VydmljZXMuIE5vdGUgdGhhdCBhbnkgdHJhbnNjb2RpbmcKc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlIGNvbmZpZyB3aWxsIG92ZXJyaWRlIGFueSBtYXRjaGluZyB0cmFuc2NvZGluZwpjb25maWd1cmF0aW9uIGluIHRoZSBwcm90by4KCkV4YW1wbGU6CgogICAgIGh0dHA6CiAgICAgICBydWxlczogCiAgICAgICAgICAjIFNlbGVjdHMgYSBnUlBDIG1ldGhvZCBhbmQgYXBwbGllcyBIdHRwUnVsZSB0byBpdC4KICAgICAgICAgLSBzZWxlY3RvcjogZXhhbXBsZS52MS5NZXNzYWdpbmcuR2V0TWVzc2FnZQogICAgICAgICAgIGdldDogL3YxL21lc3NhZ2VzL3ttZXNzYWdlX2lkfS97c3ViLnN1YmZpZWxkfQoKIyMgU3BlY2lhbCBub3RlcwoKIFdoZW4gZ1JQQyBUcmFuc2NvZGluZyBpcyB1c2VkIHRvIG1hcCBhIGdSUEMgdG8gSlNPTiBSTVRTIGVuZHBvaW50cywgdGhlCiBwcm90byB0byBKU09OIHNwZWNpZmljYXRpb24gbXVzdCBmb2xsb3cgdGhlIFtwcm90b3MKc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMypqc29uKQoKV2hpbGUgdGhlIHNpbmdsZSBzZWdtZW50IHZhcmlhYmxlIGZvbGxvd3MgdGhlIHNlbWFudGljcyBvZgpbUkZDIDY1NzBdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvSFRNTC9yZmM2NTcwKSBTZWN0aW9uIDMuMi4yIFNpbXBsZSBTdHJpbmcKIEV4cGFuc2lvbiwgVGhlIG11bHRpIHNlZ21lbnQgdmFyaWFibGUgKipkb2VzIG5vdCoqIGZvbGxvdyBSRkMgNjU3MCBTZWN0aW9uCiAzLjIuMyBSZXNlcnZlZCBFeHBhbnNpb24uIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgUmVzZXJ2ZWQgRXhwYW5zaW9uCiBkb2VzIG5vdCBleHBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzIGxpa2UgYD9gIGFuZCBgI2AsIHdoaWNoIHdvdWxkIGxlYWQKdG8gaW52YWxpZCBVUkxzLiBBcyB0aGUgcmVzdWx0LCBnUlBDIFRyYW5zY29kaW5nIHVzZXMgYSBjdXN0b20gZW5jb2RpbmcKYW5kIGZvciBtdWx0aSBzZWdtZW50IHZhcmlhYmxlcy4KCgojIyMgUGF0aCB0ZW1wbGF0ZSBzeW50YXgKCgoNCgUEAQESEBkAKQEawAEgU2VsZWN0cyBhIG1ldGhvZCB0byB3aGljaCB0aGlzIHJ1bGUgYXBwbGllcy4KCgogUmVmZXIgdG8gW3NlbGVjdG9yXVtnb29nbGUuYXBpLkRvY3VtZW50YXRpb25SdWxlLnNlbGVjdG9yXSBmb3Igc3ludGF4CiBkZXRhaWxzLgoKDQoFBAEBBBIEywICCBoagAEgRGV0ZXJtaW5lcyB0aGUgVVJMIHBhdHRlcm4gaXMgbWF0Y2hlZCBieSB0aGlzIHJ1bGUuIFRoaXMgcGF0dGVybiBjYW4gYmUKIHVzZWQgd2l0aCBhbnkgb2YgdGhlIHt8Z2V0fHB1dHxwb3N0fGRlbGV0ZXxwYXRjaH0gbWV0aG9kcy4gQSBjdXN0b20gbWV0aG9kCiBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgJ2N1c3RvbScgZmllbGQuCgoNCgUEAQEGEgTMAgQhGokCIFRoZSBjdXN0b20gcGF0dGVybiBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIGFuIEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90CiBpbmNsdWRlZCBpbiB0aGUgYHBhdHRlcm5gIGZpZWxkLCBzdWNoIGFzIEhFQUQsIG9yICIqIiB0byBsZWF2ZSB0aGUKIEhUVFAgbWV0aG9kIHVuc3BlY2lmaWVkIGZvciB0aGlzIHJ1bGUuIFRoZSB3aWxkLWNhcmQgcnVsZSBpcyB1c2VmdWwKYXMgYSBzaWduYWwgdG8gZGVwcmVjYXRlZCBwcm90byB2ZXJzaW9ucyBvZiB0aGUgc2VydmljZS4KCgoNCgUEAQEHABIExAIIDQoNCgUEAQEHEgTMAgsPCg0KBQQBAQcBEgTMAhQnCgwKBAQBAgASBM0CAhIaJCBUaGUgbmFtZSBvZiB0aGlzIGN1c3RvbSBIVFRQIHZlcmIuCgoNCgUEAgIABBIEzgICCBgagAEgU2VsZWN0cyBhIG1ldGhvZCB0byB3aGljaCB0aGlzIHJ1bGUgYXBwbGllcy4KCgogUmVmZXIgdG8gW3NlbGVjdG9yXVtnb29nbGUuYXBpLkRvY3VtZW50YXRpb25SdWxlLnNlbGVjdG9yXSBmb3Igc3ludGF4CiBkZXRhaWxzLgoKDQoFBAECBBIEzwICCBgKDQoFBAECAQQSBM8CCQ0KDQoFBAECAQYSBM8LCw8KDQoFBAECAQESBM8DEBQKDQoFBAECAQMSBM8bHBo+CgIEAhIG0AIA+gIBGjkgQSBjdXN0b20gcGF0dGVybiBpcyB1c2VkIGZvciBkZWZpbmluZyBjdXN0b20gSFRUUCB2ZXJiLgoKCwoDBAIBEgT0AggZCjIKBAQCAgASBPYCAhIaJCBUaGUgbmFtZSBvZiB0aGlzIGN1c3RvbSBIVFRQIHZlcmIuCgoNCgUEAgIABRIE9gICCAoNCgUEAgIAARIE9gIJDQoNCgUEAgIAAxIE9gIQEQo1CgQEAgIBEgT5AgISGicgVGhlIHBhdGggbWF0Y2hlZCBieSB0aGlzIGN1c3RvbSB2ZXJiLgoKDQoFBAICAQUSBPkCAggKDQoFBAICAQESBPkCCQ0KDQoFBAICAQMSBPkEIRIKDAoEBAICBBIE+wICEhq1AiBUaGUgbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWVsZCB3aG9zZSB2YWx1ZSBpcyBtYXBwZWQgdG8gdGhlIEhUVFAgcmVxdWVzdAogYm9<code code-type="xCode" data-tag="codeblock" id="w18mik" outputclass="language-yaml">body, atau `*` untuk memetakan semua field permintaan yang tidak ditangkap oleh pola path ke body HTTP, atau diabaikan untuk tidak memiliki body permintaan HTTP sama sekali.
CATATAN: field yang dirujuk harus ada pada level teratas dari tipe pesan permintaan.
CATATAN: nama field yang disebutkan dalam komentar ini adalah nama lengkap dari field tersebut. Misalnya, jika sebuah field bernama `foo.bar`, maka nama lengkapnya adalah `foo.bar`.
# Aturan untuk pemetaan HTTP
1. Field yang direferensikan oleh template path dipetakan melalui URL path.
2. Field yang direferensikan oleh [HttpRule.body][google.api.HttpRule.body] dipetakan melalui body permintaan HTTP.
3. Semua field lainnya dipetakan melalui parameter query URL, dan nama parameternya adalah path field dalam pesan permintaan. Sebuah field berulang dapat direpresentasikan sebagai beberapa parameter query dengan nama yang sama.
# Sintaks Template Path
Template = "/" Segmen [ Verb ] ;
Segmen = Segment { "/" Segment } ;
Segment = "*" | "**" | LITERAL | Variable ;
Variable = "{" FieldPath [ "=" Segments ] "}" ;
FieldPath = IDENT { "." IDENT } ;
Verb = ":" LITERAL ;
Sintaks `*` cocok dengan satu segmen path URL tunggal. Sintaks `**` cocok dengan nol atau lebih segmen path URL, yang harus menjadi bagian terakhir dari path URL kecuali Verb.
Sintaks `Variable` mencocokkan bagian dari path URL sesuai dengan template-nya. Template variabel tidak boleh mengandung variabel lain. Jika sebuah variabel cocok dengan satu segmen path, template-nya bisa dihilangkan, misalnya `{var}` setara dengan `{var=*}`.
Sintaks `LITERAL` mencocokkan teks literal dalam path URL. Jika `LITERAL` mengandung karakter cadangan apapun, karakter tersebut harus dienkripsi persen sebelum pencocokan.
Jika sebuah variabel hanya berisi satu segmen path, seperti `"{var}"` atau `"{var=*}"`, ketika variabel tersebut diperluas ke path URL di sisi klien, semua karakter kecuali `[-_.~0-9a-zA-Z]` akan dienkripsi persen. Di sisi server dilakukan decoding terbalik. Variabel semacam itu muncul dalam [Discovery Document](https://developers.google.com/discovery/v1/reference/apis) sebagai `{var}`.
Jika sebuah variabel berisi beberapa segmen path, seperti `"{var=foo/*}"` atau `"{var=**}"`, ketika variabel tersebut diperluas ke path URL di sisi klien, semua karakter kecuali `[-_.~/?0-9a-zA-Z]` akan dienkripsi persen. Di sisi server dilakukan decoding terbalik, kecuali `"%2F"` dan `"%2f"` tetap tidak berubah. Variabel semacam itu muncul dalam [Discovery Document](https://developers.google.com/discovery/v1/reference/apis) sebagai `{+var}`.
# Menggunakan gRPC API Service Configuration
gRPC API Service Configuration (konfigurasi layanan) adalah bahasa konfigurasi untuk mengonfigurasi layanan gRPC agar menjadi produk yang user-friendly. Konfigurasi layanan ini hanyalah representasi YAML dari protokol `google.api.Service`.
Sebagai alternatif untuk menambahkan anotasi proto file Anda, Anda dapat mengonfigurasi transkoding gRPC dalam file konfigurasi layanan YAML Anda. Anda melakukan ini dengan menentukan `HttpRule` yang memetakan metode gRPC ke endpoint REST, mencapai efek yang sama seperti anotasi proto. Ini bisa sangat berguna jika Anda memiliki proto yang digunakan di beberapa layanan. Perhatikan bahwa konfigurasi apa pun yang ditentukan dalam konfigurasi layanan akan menimpa konfigurasi transkoding yang cocok dalam proto.
Contoh:
```yaml
http:
rules:
# Memilih metode gRPC dan menerapkan HttpRule padanya.
- selector: example.v1.Messaging.GetMessage
get: /v1/messages/{message_id}/{sub.subfield}
```
# Catatan Khusus
Ketika gRPC Transcoding digunakan untuk memetakan gRPC ke endpoint REST JSON, konversi proto ke JSON harus mengikuti [spesifikasi proto3 JSON](https://developers.google.com/protocol-buffers/docs/proto3#json).
Sementara variabel segmen tunggal mengikuti semantik dari [RFC 6570](https://tools.ietf.org/html/rfc6570) Bagian 3.2.2 Ekspansi String Sederhana, variabel multi-segmen **tidak** mengikuti RFC 6570 Bagian 3.2.3 Ekspansi Cadangan. Alasan utamanya adalah bahwa Ekspansi Cadangan tidak memperluas karakter spesial seperti `?` dan `#`, yang akan menyebabkan URL tidak valid. Akibatnya, gRPC Transcoding menggunakan enkode kustom untuk variabel multi-segmen.
Path variabel **tidak boleh** merujuk ke field berulang atau field yang telah dipetakan, karena library klien tidak mampu menangani ekspansi variabel semacam itu.
Path variabel **tidak boleh** menangkap karakter awalan "/". Alasannya adalah bahwa kasus penggunaan yang paling umum, `"{var}"`, tidak menangkap karakter awalan "/". Untuk konsistensi, semua variabel path harus berbagi perilaku yang sama.
Field berulang pesan tidak boleh dipetakan ke parameter query URL, karena tidak ada library klien yang mendukung pemetaan kompleks semacam itu.
Jika API perlu menggunakan array JSON untuk body permintaan atau respons, itu dapat memetakan body permintaan atau respons ke field berulang. Namun, beberapa implementasi gRPC Transcoding mungkin tidak mendukung fitur ini.
Jalankan perintah berikut untuk mengaktifkan fitur transkoding protokol HTTP-gRPC:
kubectl apply -f grpcjsontranscoder-helloworld.yaml
Langkah 3: Mengakses layanan gRPC di instance ASM melalui HTTP
Jalankan perintah berikut untuk mengakses port 8080 gateway menggunakan permintaan HTTP. Port ini mengekspos layanan gRPC.
curl http://{alamat IP dari gateway ingress}:8080/sayHello/Mark
Sistem menampilkan informasi yang mirip dengan keluaran berikut:
{
"message": "Halo, Mark! Saya berasal dari grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
}
Layanan gRPC backend mengembalikan string JSON. Ini menunjukkan bahwa akses ke layanan gRPC di instance ASM melalui gateway ingress melalui HTTP berhasil.