Todos los productos
Search
Centro de documentos

Microservices Engine:Enrute servicios gRPC con Cloud Native Gateway

Última actualización: Sep 05, 2026

gRPC utiliza el protocolo HTTP/2 y admite funciones como streaming bidireccional, compresión de encabezados y multiplexación para mejorar la eficiencia de la red. Este tema muestra cómo desplegar una aplicación gRPC en un clúster de Container Service for Kubernetes (ACK) y utilizar Cloud Native Gateway para enrutar su tráfico.

Requisitos previos

Paso 1: Desplegar la aplicación gRPC

Para obtener instrucciones detalladas, consulte Create a stateless workload by using a Deployment.

Este ejemplo utiliza la aplicación grpcbin como servicio de backend de muestra, la cual implementa varios métodos gRPC. Aplique los siguientes recursos a su clúster de ACK.

Nota

En un servicio de Kubernetes, el name del port que maneja el tráfico gRPC debe incluir grpc.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpcbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grpcbin
  template:
    metadata:
      labels:
        app: grpcbin
    spec:
      serviceAccountName: grpcbin
      containers:
      - image: docker.io/moul/grpcbin
        imagePullPolicy: IfNotPresent
        name: grpcbin
        ports:
        - containerPort: 9000
        - containerPort: 9001
        resources:
            requests:
              cpu: '1'
              memory: 2Gi
            limit:
              cpu: '1'
              memory: 2Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: grpcbin
---
apiVersion: v1
kind: Service
metadata:
  name: grpcbin-grpc
  labels:
    app: grpcbin
spec:
  ports:
  - name: grpc
    port: 9000
    targetPort: 9000
  selector:
    app: grpcbin

El siguiente código muestra la definición proto para este servicio gRPC.

syntax = "proto3";

package grpcbin;

service GRPCBin {
  rpc Index(EmptyMessage) returns (IndexReply) {}
  // A method with no parameters that returns an empty response.
  rpc Empty(EmptyMessage) returns (EmptyMessage) {}
  // Echoes the request parameters in the response.
  rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
  // A server-streaming call that returns 10 messages.
  rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
  // A client-streaming call that accepts 10 requests and returns the body of the last one.
  rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
  // A bidirectional streaming method.
  rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
  // This method returns a specified gRPC error.
  rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
  // This method returns a random error.
  rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
  // This method returns headers.
  rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
  // This method returns no response.
  rpc NoResponseUnary(EmptyMessage) returns (EmptyMessage) {}
}

message HeadersMessage {
  message Values {
    repeated string values = 1;
  }
  map<string, Values> Metadata = 1;
}

message SpecificErrorRequest {
  uint32 code = 1;
  string reason = 2;
}

message EmptyMessage {}

message DummyMessage {
  message Sub {
    string f_string = 1;
  }
  enum Enum {
    ENUM_0 = 0;
    ENUM_1 = 1;
    ENUM_2 = 2;
  }
  string f_string = 1;
  repeated string f_strings = 2;
  int32 f_int32 = 3;
  repeated int32 f_int32s = 4;
  Enum f_enum = 5;
  repeated Enum f_enums = 6;
  Sub f_sub = 7;
  repeated Sub f_subs = 8;
  bool f_bool = 9;
  repeated bool f_bools = 10;
  int64 f_int64 = 11;
  repeated int64 f_int64s= 12;
  bytes f_bytes = 13;
  repeated bytes f_bytess = 14;
  float f_float = 15;
  repeated float f_floats = 16;
}

message IndexReply {
  message Endpoint {
    string path = 1;
    string description = 2;
  }
  string description = 1;
  repeated Endpoint endpoints = 2;
}

gRPC se basa en el protocolo HTTP/2 y sus rutas siguen el formato {PackageName}.{ServiceName}/{MethodName}. Esto permite que Cloud Native Gateway enrute las solicitudes según la ruta. Por ejemplo, una llamada gRPC al método Index del servicio grpcbin tiene la ruta grpcbin.GRPCBin/Index.

Paso 2: Configurar el enrutamiento gRPC

Agregue el clúster de ACK como origen de servicio para la puerta de enlace y luego agregue el servicio grpcbin.

Agregar un origen de servicio

  1. Inicie sesión en la consola de MSE. En la barra de navegación superior, seleccione una región.

  2. En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.

  3. En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Source.

  4. Haga clic en Add Source. En el panel Add Source, establezca Source Type en Container Service, configure los parámetros y luego haga clic en OK.

    Parámetro

    Descripción

    ACK/ACK Serverless Cluster

    Seleccione el clúster donde se encuentra el servicio de backend.

    Nota

    Al crear la puerta de enlace, debe seleccionar la misma Virtual Private Cloud (VPC) que el clúster de backend. Posteriormente, al agregar el origen de servicio, el sistema descubre automáticamente los clústeres en esa VPC.

    Listen to Kubernetes Ingress

    • Si habilita esta opción, Cloud Native Gateway escucha automáticamente los cambios en los recursos de Ingress y aplica las configuraciones de dominio y ruta de dichos recursos.

    • Si deshabilita esta opción, Cloud Native Gateway deja de escuchar los recursos de Ingress e invalida las configuraciones aplicadas previamente desde esos recursos. Utilice esta opción con precaución.

    Importante

    Las configuraciones de dominio y ruta establecidas manualmente en la consola tienen mayor prioridad que las provenientes de recursos de Ingress.

    Ingress Class

    Escucha los recursos de Ingress asociados con la IngressClass especificada.

    • Si se deja vacío, la puerta de enlace escucha todos los recursos de Ingress en el clúster.

    • Si especifica un valor (solo se admite un único valor), la puerta de enlace escucha los recursos de Ingress cuya anotación class o campo Spec.IngressClassName coincida con el valor especificado. Por ejemplo, si establece esto en nginx, la puerta de enlace escucha los recursos de Ingress con una IngressClass de nginx y también aquellos que no están asociados con ninguna IngressClass.

    Namespace

    Escucha los recursos de Ingress en un namespace específico.

    • Si se deja vacío, la puerta de enlace escucha los recursos de Ingress en todos los namespaces del clúster.

    • Si especifica un valor (solo se admite un único valor), la puerta de enlace escucha los recursos de Ingress en el namespace especificado.

    Update Ingress Status

    Si habilita esta opción, el sistema actualiza la dirección IP en el campo Status del Ingress escuchado por la dirección IP de la instancia de Server Load Balancer (SLB) asociada con Cloud Native Gateway.

    Nota

    Esta función requiere la versión 1.2.9 o posterior de la puerta de enlace.

    Security Group Authorization

    Se configura un security group para el node pool del clúster de contenedores. Para permitir que los componentes fuera del clúster accedan a los servicios dentro de él, debe abrir los puertos de servicio necesarios en el security group.

    Puede modificar el security group. Para más información, consulte Set security group rules.

Agregar un servicio

  1. Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.

  2. En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.

  3. En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Services.

  4. Haga clic en Create Service, configure los parámetros en el panel y luego haga clic en OK.

    Parámetro

    Descripción

    Service Sources

    Seleccione Container Service.

    Namespaces

    Seleccione el namespace del clúster destino.

    Services

    Seleccione el servicio de la lista.

Agregar una ruta grpcbin

  1. Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.

  2. En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.

  3. En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Routes.

  4. Haga clic en Add Route. En la página Add Route, configure los parámetros de la ruta y luego haga clic en Save and Advertise. Para obtener instrucciones detalladas, consulte Add a route.

    Parámetro

    Descripción

    Route Name

    Establezca en grpc.

    Domain Name

    Seleccione el dominio predeterminado *.

    Path

    Establezca la condición de coincidencia en Prefix y el valor de la ruta en /grpcbin.GRPCBin.

    Nota

    El formato de ruta para un servicio gRPC es {PackageName}.{ServiceName}/{MethodName}. Puede configurar una ruta basada en prefijos según este formato.

    Scenario

    Establezca Scenario en Single Service.

    Backend Service

    Seleccione el servicio destino y el puerto de servicio.

Comprobar los resultados

Utilice bloomrpc para probar el servicio gRPC. Una respuesta exitosa confirma que el servicio está disponible.

También puede utilizar otros clientes gRPC para realizar pruebas.

Use BloomRPC para iniciar una llamada unaria (Unary Call) al método grpcbin.GRPCBin.DummyUnary. Ejemplo de cuerpo de solicitud:

{
  "f_string": "Hello",
  "f_strings": [
    "Hello"
  ],
  "f_int32": 10,
  "f_int32s": [
    10
  ],
  "f_enum": 0,
  "f_enums": [
    0
  ],
  "f_sub": {
    "f_string": "Hello"
  },
  "f_subs": [
    {
      "f_string": "Hello"
    }
  ],
  "f_bool": true,
  "f_bools": [
    true
  ],
  "f_int64": 20,
  "f_int64s": [
    20
  ],
  "f_bytes": {}
}

Ejemplo de respuesta del servidor (latencia: ~0.14 s):

{
  "f_strings": [
    "Hello"
  ],
  "f_int32s": [
    10
  ],
  "f_enums": [
    "ENUM_0"
  ],
  "f_subs": [
    {
      "f_string": "Hello"
    }
  ],
  "f_bools": [
    true
  ],
  "f_int64s": [
    "20"
  ],
  "f_bytess": [],
  "f_floats": [
    1.100000023841858
  ],
  "f_string": "Hello",
  "f_int32": 10,
  "f_enum": "ENUM_0",
  "f_sub": {
    "f_string": "Hello"
  }
}