
Seeing the lookup in action
Now, we are all set to run the product client. To recap, at this stage, we have a Eureka server project and a product project with the following structure:

Let's take a few minutes to review what we did:
- We created a Maven project and defined the starters and dependencies.
- We created the YML files for bootstrapping and application properties.
- We created the ProductSpringApp class containing the main method that is the starting point of the applications.
- For the product project, we had the following classes:
- Product: The domain or entity which we will enhance later
- ProductService: The microservice responsible for implementing the services and APIs
- ProductClient: The client to test out the service lookup
Now, let's see it in action:
- Run the EurekaApplication class (or run a Maven build on the eureka-server project). Observe the last few lines in the logs:

- Run the ProductSpringApp class (or run a Maven build on the product project). Note the last few lines in the the log:

- Access the product service directly at: http://localhost:8081/dev/product/4.
You will see the following response:
{"id":4,"name":"Oranges ","catId":2}
- Now, access the client URL, http://localhost:8081/client/4 , which does a lookup of the product service from the service registry and directs it to the respective product service.
You will see the following response:
{"id":4,"name":"Oranges ","catId":2}
You may see an internal server error (No instances available for PRODUCT). This can happen while the heartbeat completes and the addresses are re-picked by the Ribbon load balancer. Wait a few seconds for the registry to update and then try again.
A lot has happened under the hood in getting this response:
- The HTTP request to get /client/4 was handled by the getProduct method in the ProductClient class.
- It did a lookup of the service from the Eureka registry. This is where we find log statements as follows:
c.n.l.DynamicServerListLoadBalancer: Using serverListUpdater PollinServerListUpdater
c.netflix.config.ChainedDynamicProperty: Flipping property: PRODUCT.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer
c.n.l.DynamicServerListLoadBalancer: DynamicServerListLoadBalancer for client PRODUCT intiated: DynamicServerListLoadBalancer:
- After it did the lookup, it forwarded the request to the actual ProductService through the Ribbon load balancer library.
This was just a simple mechanism of a client invoking services through a dynamic lookup. In later chapters, we will add functionality to make it resilient and functional in terms of getting data from the database.