When to configure zuul routes

Harish picture Harish · Feb 15, 2017 · Viewed 10.9k times · Source

I am new to spring cloud and going through some examples and material available online to make myself comfortable. However, while reading about ZUUL, some sites configured the routes in ZUUL's application.yml and some other sites mentioned that the requests will be forwarded to the respective microservice and no need to explicitly configure the routes. I was bit confused. For ex, in the below scenario what is the approach, to configure routes or to let zuul route automatically?

  1. Let's say i have few micro services running and all of them along with ZUUL are registered to Eureka.
  2. I have a front end which is running on a different port on the same server and needs to interact with the above micro services.
  3. I also have few other applications (Running entirely on different servers) which need to interact with the above micro services for fetching the data.

TIA..

Answer

redoff picture redoff · Feb 15, 2017

Did you use Zuul (which know microservices address through Eureka) to forward request between your micro-services ? if it's the case, you are using Server-Side Load Balancing pattern.

If you use a discovery service (Eureka in your case), i think the best approach it's to use Client-Side load balancing pattern for all inter-services requests (inside your system). (you can use Ribbon or RestTemplate for that).

You can use Zuul as a unified front door to your system, which allows a browser, mobile app or other user interface to consume services from multiple hosts without managing cross-origin resource sharing (CORS) and authentication for each one.

For example : a client (mobile app) request for all picture comments. The client dont need to know the Comments-service address. Only proxy address needed and Zuul will forward the request to the right service. You can do this in application.yml/.properties by

zuul.routes.comments.path=/comments/**
zuul.routes.comments.service-id=comments

The request will be GET www.myproxy.mycompany.com/comments. Dont forget the service name in your application.yml/.properties is very important (spring.application.name). It's the service-id in Zuul routes (which the same identifier in Eureka).

For some reason, your system need to request external services (as you mentionned in the 3th note). In this case, your external services are not a discovery client, Zuul can't look for the service-id from Eureka. you use routes as

zuul.routes.currencyprovider.path=/currencies/**
zuul.routes.currencyprovider.url=https://currencies.net/

with this route, all /currencies/** requests from your services THROUGH Zuul will be done. with this approach you have one door for all your system. This is API Gateway pattern.

Sometimes your system need to aggregate multiple results from different services to response to client request. You can do this in Proxy (Zuul in your case).