Zuul Service
Overview
An API Gateway provides a unified interface for a set of microservices so that clients do not need to know about all the details of microservices internals.
Digit uses Zuul as an edge service that proxies requests to multiple back-end services. It provides a unified “front door” to our ecosystem. This allows any browser, mobile app or other user interface to consume underlying services.
Pre-requisites
Before you proceed with the documentation, make sure the following pre-requisites are met -
Java 8
egov-user service is running
egov-accesscontrol service is running
Key Functionalities
Provides easier API interface to clients
Can be used to prevent exposing the internal micro-services structure to outside world.
Allows to refactor microservices without forcing the clients to refactor consuming logic
Can centralize cross-cutting concerns like security, monitoring, rate limiting etc
Zuul Components
Zuul has mainly four types of filters that enable us to intercept the traffic in different timeline of the request processing for any particular transaction. We can add any number of filters for a particular url pattern.
pre filters – are invoked before the request is routed.
post filters – are invoked after the request has been routed.
route filters – are used to route the request.
error filters – are invoked when an error occurs while handling the request.
Zuul Features
Microservice authentication and security
Authorization
API Routing
Open APIs using Whitelisting
RBAC filter
Logout filter for finance module
Property module tax calculation filter for firecess
Request enrichment filter:
Addition of co-relation id
Addition of authenticated user’s userinfo to requestInfo.
Error filter:
Error response formatting
Validation Filter to check if a tenant of a particular module is enabled or not.
Multitenancy Validation Filter. Take the tenant id from Req body or Query Param and validate against additional tenant role or primary tenant role.
Devops efficiency: API Response time logging and Send notification if it is taking more time.
Rate Throttling
Configuration
Routing Property
For each service, below mentioned property has to be add in routes.properties
-zuul.routes.{serviceName}.path = /{context path of service}/**
-zuul.routes.{serviceName}.stripPrefix = {true/false}
-zuul.routes.{serviceName}.url = {service host name}
Rate Limiting Property
For endpoints which requires rate throttling, below mentioned property has to be added in limiter.properties
-zuul.ratelimit.policy-list.{serviceName}[0].limit={request number limit per refresh interval window}
-zuul.ratelimit.policy-list.{serviceName}[0].quota={request time limit per refresh interval window (in seconds)}
-zuul.ratelimit.policy-list.{serviceName}[0].refresh-interval={refresh interval in seconds}
-zuul.ratelimit.policy-list.{serviceName}[0].type[0]=url={url of API endpoint}
-zuul.ratelimit.policy-list.{serviceName}[0].type[1]={type of throttling eg: user, origin etc.}
Deployment Details
Deploy the latest version of zuul service.
Add zuul routing context paths and service host name in configuration.
Integration
Integration Scope
The zuul service is used to act like an API gateway for services which citizens avail from ULBs.
Integration Benefits
Can perform service-specific business logic without impacting the other module.
Provides the capability of routing and authorizing users for accessing resources.
Steps to Integration
To integrate, host of zuul module should be overwritten in helm chart.