gRPC Intro
gRPC Intro
Get started with Zilla by deploying our Docker Compose stack. Before proceeding, you should have Docker Compose installed.
Echo on a Kafka event stream
Running this Zilla sample will create a gRPC service to echo any message sent through a Kafka topic.
Setup
Create each of these files zilla.yaml, docker-compose.yaml, and echo.proto in the same directory.
zilla.yaml
name: gRPC-example
bindings:
# Proxy service entrypoint
  north_tcp_server:
    type: tcp
    kind: server
    options:
      host: 0.0.0.0
      port: 7151
    exit: north_http_server
  north_http_server:
    type: http
    kind: server
    options:
      versions:
        - h2
      access-control:
        policy: cross-origin
    exit: north_grpc_server
# gRPC service definition
  north_grpc_server:
    type: grpc
    kind: server
    options:
      services:
        - proto/echo.proto
    routes:
      - when:
          - method: example.EchoService/*
        exit: north_grpc_kafka_mapping
# Proxy a gRPC service to a Kafka topic
  north_grpc_kafka_mapping:
    type: grpc-kafka
    kind: proxy
    routes:
      - when:
          - method: example.EchoService/*
        exit: north_kafka_cache_client
        with:
          capability: produce
          topic: echo-messages
          acks: leader_only
          reply-to: echo-messages
  north_kafka_cache_client:
    type: kafka
    kind: cache_client
    exit: south_kafka_cache_server
  south_kafka_cache_server:
    type: kafka
    kind: cache_server
    options:
      bootstrap:
        - echo-messages
    exit: south_kafka_client
  south_kafka_client:
    type: kafka
    kind: client
    exit: south_tcp_client
  south_tcp_client:
    type: tcp
    kind: client
    options:
      host: ${{env.KAFKA_HOST}}
      port: ${{env.KAFKA_PORT}}
    routes:
      - when:
          - cidr: 0.0.0.0/0
docker-compose.yaml
version: '3'
services:
  zilla:
    image: ghcr.io/aklivity/zilla:latest
    pull_policy: always
    depends_on:
      - kafka
    ports:
      - 7151:7151
    environment:
      KAFKA_HOST: kafka
      KAFKA_PORT: 29092
    volumes:
      - ./zilla.yaml:/etc/zilla/zilla.yaml
      - ./echo.proto:/etc/zilla/proto/echo.proto
    command: start -v -e
  kafka:
    image: bitnami/kafka:3.2
    hostname: kafka
    ports:
      - 9092:9092
      - 29092:9092
    environment:
      ALLOW_PLAINTEXT_LISTENER: "yes"
      KAFKA_CFG_NODE_ID: "1"
      KAFKA_CFG_BROKER_ID: "1"
      KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: "1@127.0.0.1:9093"
      KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: "CLIENT:PLAINTEXT,INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT"
      KAFKA_CFG_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
      KAFKA_CFG_LOG_DIRS: "/tmp/logs"
      KAFKA_CFG_PROCESS_ROLES: "broker,controller"
      KAFKA_CFG_LISTENERS: "CLIENT://:9092,INTERNAL://:29092,CONTROLLER://:9093"
      KAFKA_CFG_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_CFG_ADVERTISED_LISTENERS: "CLIENT://localhost:9092,INTERNAL://kafka:29092"
      KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "true"
  kafka-init:
    image: bitnami/kafka:3.2
    command:
      - "/bin/bash"
      - "-c"
      -  |
        /opt/bitnami/kafka/bin/kafka-topics.sh --bootstrap-server kafka:29092 --create --if-not-exists --topic echo-messages
    depends_on:
      - kafka
    init: true
echo.proto
syntax = "proto3";
package example;
service EchoService
{
  rpc EchoSimple(EchoMessage) returns (EchoMessage);
}
message EchoMessage
{
  string message = 1;
}
Run Zilla and Kafka
docker-compose up -d
Send a greeting
docker run -v ./echo.proto:/proto/echo.proto -it --rm fullstorydev/grpcurl \
-plaintext -proto proto/echo.proto -d '{"message":"Hello World"}' host.docker.internal:7151 example.EchoService.EchoSimple
Remove the running containers
docker-compose down
See more of what Zilla can do
Go deeper into this concept with the grpc.kafka.echo example.
Going Deeper
Try out more gRPC examples:

