zuul Documentation

Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

14,093 stars Java Java 1 file ยท ~2,311 tokens
RAW Doc

File: README.md

Zuul

Zuul is an L7 application gateway that provides capabilities for dynamic routing, monitoring, resiliency, security, and more.
Please view the wiki for usage, information, HOWTO, etc https://github.com/Netflix/zuul/wiki

Here are some links to help you learn more about the Zuul Project. Feel free to PR to add any other info, presentations, etc.


Articles from Netflix:

Zuul 1: http://techblog.netflix.com/2013/06/announcing-zuul-edge-service-in-cloud.html

Zuul 2:

https://netflixtechblog.com/open-sourcing-zuul-2-82ea476cb2b3

https://netflixtechblog.com/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c

https://netflixtechblog.com/the-show-must-go-on-securing-netflix-studios-at-scale-19b801c86479


Netflix presentations about Zuul:

Strange Loop 2017 - Zuul 2: https://youtu.be/2oXqbLhMS_A

AWS re:Invent 2018 - Scaling push messaging for millions of Netflix devices: https://youtu.be/IdR6N9B-S1E


Slides from Netflix presentations about Zuul:

http://www.slideshare.net/MikeyCohen1/zuul-netflix-springone-platform

http://www.slideshare.net/MikeyCohen1/rethinking-cloud-proxies-54923218

https://github.com/strangeloop/StrangeLoop2017/blob/master/slides/ArthurGonigberg-ZuulsJourneyToNonBlocking.pdf

https://www.slideshare.net/SusheelAroskar/scaling-push-messaging-for-millions-of-netflix-devices


Projects Using Zuul:

https://cloud.spring.io/

https://jhipster.github.io/


Info and examples from various projects:

https://cloud.spring.io/spring-cloud-netflix/multi/multi__router_and_filter_zuul

http://www.baeldung.com/spring-rest-with-zuul-proxy

https://blog.heroku.com/using_netflix_zuul_to_proxy_your_microservices

http://blog.ippon.tech/jhipster-3-0-introducing-microservices/


Other blog posts about Zuul:

https://engineering.riotgames.com/news/riot-games-api-fulfilling-zuuls-destiny

https://engineering.riotgames.com/news/riot-games-api-deep-dive

http://instea.sk/2015/04/netflix-zuul-vs-nginx-performance/


How to release Zuul

This project uses a GitHub Action workflow for publishing a new release.
The workflow is triggered by following these steps:

  1. Go to the Releases page here
  2. Draft a new release
  3. Click Select tag, then Create new tag (ex. `vX.Y.Z)
  4. Select Generate release notes and Click Publish release
  5. Approve the new release in the Actions tab

File: CHANGELOG.md

[Empty file]


File: .github/dependabot.yml

version: 2
updates:

  • package-ecosystem: "gradle"
    directory: "/"
    schedule:
    interval: "daily"
  • package-ecosystem: "github-actions"
    directory: "/"
    schedule:
    interval: "daily"

File: .github/workflows/benchmark.yml

name: benchmark

on:
workflow_dispatch:

permissions:
contents: read

env:
JDK: '21'
DISTRIBUTION: 'zulu'
GRADLE_COMMAND: './gradlew --no-daemon'

jobs:
benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Set up JDK ${{ env.JDK }}
uses: actions/setup-java@v6
with:
java-version: ${{ env.JDK }}
distribution: ${{ env.DISTRIBUTION }}
- name: JMH
run: ${{ env.GRADLE_COMMAND }} clean :zuul-core:jmh


File: .github/workflows/branch_snapshot.yml

name: Branch Snapshot

on:
workflow_dispatch:
inputs:
branch:
required: true
default: 'master'
required: false
default: Netflix/zuul
version:
required: true

jobs:
build:
runs-on: ubuntu-latest
environment: Publish
steps:
- name: Setup Git
run: |
git config --global user.name 'Zuul Build'
git config --global user.email '[email protected]'
- uses: actions/checkout@v7
with:
fetch-depth: 0
ref: ${{ github.event.inputs.branch }}
- name: Set up JDK
uses: actions/setup-java@v6
with:
distribution: 'temurin'
java-version: 21
cache: 'gradle'
- name: Build snapshot
run: ./gradlew build snapshot -Prelease.version="$BUILD_VERSION"
env:
BUILD_VERSION: ${{ github.event.inputs.version }}
NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }}
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }}
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}


File: .github/workflows/gradle-wrapper-validation.yml

name: "Validate Gradle Wrapper"
on: [push, pull_request]

jobs:
validation:
name: "Gradle wrapper validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: gradle/actions/[email protected]


File: .github/workflows/pr.yml

name: PR Build

on: [pull_request]

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [21]
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v6
with:
distribution: 'zulu'
java-version: ${{ matrix.java }}
cache: 'gradle'
- name: Build
run: |
sudo env "PATH=$PATH" bash -c "ulimit -l 65536 && ulimit -a && ./gradlew --no-daemon build"
echo "Status of build: $?"
validation:
name: "Gradle Validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: gradle/actions/[email protected]


File: .github/workflows/release.yml

name: Release

on:
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+
- v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+

jobs:
build:
runs-on: ubuntu-latest
environment: Publish
steps:
- name: Setup Git
run: |
git config --global user.name 'Zuul Build'
git config --global user.email '[email protected]'
- uses: actions/checkout@v7
- uses: gradle/actions/[email protected]
- name: Set up JDK
uses: actions/setup-java@v6
with:
distribution: 'temurin'
java-version: 21
cache: 'gradle'
- name: Build candidate
if: contains(github.ref, '-rc.')
run: ./gradlew --info --stacktrace -Prelease.useLastTag=true candidate
env:
NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }}
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }}
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}
- name: Build release
if: (!contains(github.ref, '-rc.'))
run: ./gradlew --info -Prelease.useLastTag=true final
env:
NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }}
NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }}
NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }}
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }}
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}


File: .github/workflows/snapshot.yml

name: Snapshot

on:
push:
branches:
- master
- zuul-v4

jobs:
build:
runs-on: ubuntu-latest
environment: Publish
steps:
- name: Setup Git
run: |
git config --global user.name 'Zuul Build'
git config --global user.email '[email protected]'
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Set up JDK
uses: actions/setup-java@v6
with:
distribution: 'temurin'
java-version: 21
cache: 'gradle'
- name: Build snapshot
run: ./gradlew build snapshot
env:
NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }}
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }}
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}


File: .github/workflows/stale.yml

name: 'Close stale issues and PRs'
on:
schedule:
- cron: "*/10 5 * * *"

jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v11
with:
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
stale-pr-message: 'This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'