What is Zuul?
Zuul is a Proxy server (proxy service) provided by Netflix OSS. It provides wide range of features such as dynamic routing, filtering requests and server side load balancing etc…
In microservices architecture, Zuul acts as the api gateway for all the deployed microservices and it sits as the middle man in between client applications and backend services. This means that all the microservices will be exposed to the external parties (services or applications) through the Zuul proxy. If any service/application need to access the any of the microservices deployed in behind the reverse proxy, it has to come through the Zuul proxy. Zuul will hide the identities of the server applications behind the proxy and serve the client applications exposing its identity (identity of the reverse proxy) on behalf of backend servers and sever applications. Therefore Zuul is identified as a Reverse Proxy.
Forward Proxy and Reverse Proxy
Here we should know what is the difference between Proxy (forward Proxy) and Reverse Proxy. One is for protecting/hiding clients and other one is for protecting/hiding servers.
Forward Proxy is the proxy for the client and it hides the identities of the clients. It receives the request from the client and sends the requests to the server on behalf of the clients. The main purpose of forward proxy is to act on behalf of clients by hiding their identities. The forward proxies are mainly used to access the contents or websites, that is blocked by your ISP or blocked for your country/area.
Reverse Proxy does the opposite of what the Forward Proxy does. It hides the identities of the servers and receive the requests from clients on behalf of servers. Behind the reverse proxy there might be different web services and servers may exist. It is the responsibility of the reverse proxy to delegate the client request to the relevant service/server application and responds back to the client. Therefore the main purpose of reverse proxy is to server client applications on behalf of set of backend applications deployed in behind the reverse proxy.
Sometimes there might be several instances of the same service or server may running in behind the reverse proxy and that is known as clustering. In this situation,the reverse proxy may determine the most appropriate server instance(or cluster node) for serving the client request and will delegate the request for that cluster node. This is done/achieved with the load balancing application available in the reverse proxy. Clustering will ensure the high availability of service (even if one node is down, the request will be served by next available node) and proper load balancing among multiple requests. Lets look at those later with some other article.
Proxy (both proxies) will provide the centralized point(or rather single point) of access for the communication between client and servers. Therefore it is easy to implement the enforcing of security policies, content filtering and other constraints with proxies. Both Forward and Reverse proxies exists (should place) in between client and server.
Please refer the following diagram to see the role of the Reverse Proxy.
A reverse proxy allows you to route requests to a single domain to multiple backing services behind that proxy. This can be useful in situations where you want to break up your application into several loosely-coupled components (like microservices) and distribute them even in different servers but, you need to expose them to the public under a single domain. Then the users will get the same experience as they are communicating with a single application. This can be achieved with dynamic routing feature available in the reverse proxy.
The importance of Reverse Proxy in Microservices architecture can be summarized as below.
- High Availability: provides the supports for the high availability of the microservice in the clustered environment. Even if one service (node) fails down, the client request will be served by next available node.
- Load Balancing: supports for the load balancing among multiple nodes in the cluster. Therefore it make sure that no server or service is overloaded with multiple requests. It will properly distribute the requests among multiple nodes to maximize the utilization of resources.
- Single Point of Access with Request and Response Filtering: This is the single point of access or the gateway for the microservices. If the microservices are exposed through the reverse proxy, the the external clients can access/consume those services through the reverse proxy. Therefore it is possible to filter the requests that are coming to the microservices. In addition, it can filter the responses that are going from the misroservices too. Therefore this will provide an extra level of request and response filtering support for the microservices. Authentication and Authorization security policies can be enforced with making use of this single point of access.
- Dynamic Routing: There may be multiple microservices which are deployed in behind the reverse proxy. Those services may deployed in different servers with different domain names. Sometimes in the same server (where the reverse proxy is deployed) but with different ports. All the services will be exposed to public (client applications) through the reverse proxy and the proxy will assign their own route (url path) to each service. each route will be mapped to original route in the related service. Therefore client will get the same experience as it communicates with a single application and SSO (Single Sign On) and CORS (Cross Origin Resource Sharing) related issue will be sorted.
The Netflix Zuul as a Reverse Proxy
We have already discussed the importance of the reverse proxy in the Microservices architecture and now it is the time to select the appropriate Reverse Proxy to use. The Netflix has introduced Zuul as the reverse proxy under their OSS (Open Source Software) stack.
Zuul proxy will provide following main functionalities as a reverse proxy. They can be listed as follows. Lets look at each of them in detailed in separate articles.
- Dynamic Routing
- Request and Response Filtering
- Server Side Load Balancing