En aquest tema, explorarem com configurar NGINX per treballar amb gRPC, un sistema de RPC (Remote Procedure Call) d'alt rendiment desenvolupat per Google. gRPC utilitza HTTP/2 per a la transmissió i Protocol Buffers com a format de serialització de dades, oferint avantatges significatius en termes de rendiment i eficiència.

Què és gRPC?

gRPC és un framework RPC modern que permet la comunicació entre serveis en diferents llenguatges de programació. Les seves característiques principals inclouen:

  • Alt rendiment: Utilitza HTTP/2 per a la transmissió, permetent múltiples fluxos en una sola connexió TCP.
  • Contracte definit: Utilitza Protocol Buffers per definir les interfícies i els missatges, assegurant la compatibilitat entre serveis.
  • Interoperabilitat: Suporta múltiples llenguatges de programació, facilitant la integració en entorns heterogenis.

Configurant NGINX per a gRPC

Requisits previs

Abans de començar, assegura't de tenir instal·lat NGINX amb suport per a HTTP/2 i gRPC. La versió mínima recomanada és NGINX 1.13.10.

Configuració bàsica

  1. Instal·lació de NGINX: Si encara no tens NGINX instal·lat, pots seguir les instruccions del Mòdul 1 per a la instal·lació.

  2. Configuració del servidor: Afegeix la configuració següent al teu fitxer de configuració de NGINX (nginx.conf o un fitxer de configuració específic del lloc).

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80 http2;
        server_name example.com;

        location / {
            grpc_pass grpc://localhost:50051;
            error_page 502 = /error502grpc;
        }

        location = /error502grpc {
            internal;
            default_type application/grpc;
            add_header grpc-status 14;
            add_header content-length 0;
            return 204;
        }
    }
}

Explicació del codi

  • listen 80 http2: Configura el servidor per escoltar a la porta 80 amb suport per a HTTP/2.
  • server_name example.com: Defineix el nom del servidor.
  • location /: Defineix la ubicació arrel per a les peticions gRPC.
    • grpc_pass grpc://localhost:50051: Redirigeix les peticions gRPC al servidor gRPC que escolta a localhost a la porta 50051.
    • error_page 502 = /error502grpc: Defineix una pàgina d'error personalitzada per a errors 502, que són comuns en la comunicació gRPC.
  • location = /error502grpc: Defineix la configuració per a la pàgina d'error 502.
    • internal: Marca aquesta ubicació com a interna, de manera que no es pot accedir directament des de l'exterior.
    • default_type application/grpc: Defineix el tipus de contingut per a la resposta d'error.
    • add_header grpc-status 14: Afegeix un encapçalament gRPC amb l'estat 14 (UNAVAILABLE).
    • add_header content-length 0: Afegeix un encapçalament de longitud de contingut amb valor 0.
    • return 204: Retorna una resposta 204 (No Content).

Exercici pràctic

Configura un servidor gRPC simple i configura NGINX per actuar com a proxy invers per a aquest servidor.

  1. Servidor gRPC: Escriu un servidor gRPC simple en Python.
# server.py
import grpc
from concurrent import futures
import time
import helloworld_pb2
import helloworld_pb2_grpc

class Greeter(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    try:
        while True:
            time.sleep(86400)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()
  1. Fitxer de definició de Protocol Buffers:
// helloworld.proto
syntax = "proto3";

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
  1. Configuració de NGINX: Utilitza la configuració de NGINX proporcionada anteriorment.

Solució de problemes comuns

  • Error 502 Bad Gateway: Assegura't que el servidor gRPC està en funcionament i escoltant a la porta correcta.
  • Problemes de connexió: Verifica que NGINX té permisos per connectar-se al servidor gRPC.

Resum

En aquest tema, hem après a configurar NGINX per treballar amb gRPC, incloent la configuració bàsica i la gestió d'errors comuns. Aquesta configuració permet aprofitar els avantatges de gRPC, com ara l'alt rendiment i la interoperabilitat, mentre utilitzem NGINX com a proxy invers per gestionar les peticions.

© Copyright 2024. Tots els drets reservats