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/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://www.slideshare.net/SusheelAroskar/scaling-push-messaging-for-millions-of-netflix-devices
Projects Using Zuul:
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:
- Go to the Releases page here
- Draft a new release
- Click
Select tag, thenCreate new tag(ex. `vX.Y.Z) - Select
Generate release notesand ClickPublish release - 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.'