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
catalogs:
host_filesystem:
type: filesystem
options:
subjects:
echo:
path: proto/echo.proto
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
catalog:
host_filesystem:
- subject: echo
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
# Connect to Kafka
south_kafka_client:
type: kafka
kind: client
options:
servers:
- ${{env.KAFKA_BOOTSTRAP_SERVER}}
exit: south_kafka_tcp_client
south_kafka_tcp_client:
type: tcp
kind: client
telemetry:
exporters:
stdout_logs_exporter:
type: stdout
docker-compose.yaml
version: '3'
services:
zilla:
image: ghcr.io/aklivity/zilla:latest
pull_policy: always
depends_on:
- kafka
ports:
- 7151:7151
environment:
KAFKA_BOOTSTRAP_SERVER: "kafka:29092"
volumes:
- ./zilla.yaml:/etc/zilla/zilla.yaml
- ./echo.proto:/etc/zilla/proto/echo.proto
command: start -v -e
kafka:
image: bitnami/kafka:3.5
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.5
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 --detach
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: