You are on page 1of 12

Microservices with Spring Boot —

Circuit Breaker & Log Tracing (Part 4)


Handle Failures and Trace Requests

OMAR ELGABRY Follow


Jun 11, 2018 · 3 min read

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Handle Failures and Trace Requests

🙌 The Github repository for the application:


https://github.com/OmarElGabry/microservices-spring-boot

. . .

Hystrix
If you have, let’s say 3 services, A calls → B, and B calls → C service. What if,
a failure happened at B? The error will cascade down to service C, right?.

A -> B (failure) -> C

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Another example, lets say a service A calls a remote service R, and for some
reason the remote service is down. How can we handle such a situation?

What we would like to do is stop failures from cascading down, and provide
a way to self-heal, which improves the system’s overall resiliency.

Hystrix is the implementation of Circuit Breaker pattern, which gives a


control over latency and failure between distributed services.

The main idea is to stop cascading failures by failing fast and recover as
soon as possible — Important aspects of fault-tolerant systems that self-heal.

So, we’ll add Hystrix to gallery service, and we’ll simulate a failure at image
service. In the pom.xml le

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
In the spring boot main class

// ...
@EnableCircuitBreaker // Enable circuit breakers

public class SpringEurekaGalleryApp {


public static void main(String[] args) {
SpringApplication.run(SpringEurekaGalleryApp.class, args);
}
}

Spring looks for any method annotated with the


@HystrixCommand annotation, and wraps that method so that Hystrix can

monitor it.

Hystrix watches for failures in that method, and if failures reached a


threshold (limit), Hystrix opens the circuit so that subsequent calls will
automatically fail. Therefore, and while the circuit is open, Hystrix redirects
calls to the fallback method.

So, In the controller class, update getGallery() , add annotation and

fallback method.
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
1 package com.eureka.gallery.controllers;
2
3 import java.util.List;
4
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.core.env.Environment;
7 import org.springframework.web.bind.annotation.PathVariable;
8 import org.springframework.web.bind.annotation.RequestMapping;
9 import org.springframework.web.bind.annotation.RestController;
10 import org.springframework.web.client.RestTemplate;
11
12 import com.eureka.gallery.entities.Gallery;
13 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
14
15 @RestController
16 @RequestMapping("/")
17 public class HomeController {
18 @Autowired
19 private RestTemplate restTemplate;
20
21 @HystrixCommand(fallbackMethod = "fallback")
22 @RequestMapping("/{id}")
23 public Gallery getGallery(@PathVariable final int id) {
24 // create gallery object
25 Gallery gallery = new Gallery();
26 gallery.setId(id);
27
28 // get list of available images
29 @SuppressWarnings("unchecked") // we'll throw an exception from image
30 List<Object> images = restTemplate.getForObject("http://image-service/im
31 gallery.setImages(images);

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
32
33 return gallery;
34 }
35
36 // a fallback method to be called if failure happened
37 public Gallery fallback(int galleryId, Throwable hystrixCommand) {
38 return new Gallery(galleryId);
39 }
40 }

HomeController.java hosted with ❤ by GitHub view raw

In the controller class of image service, throw an exception in getImages()

throw new Exception("Images can't be fetched");

Now, go to the browser, and hit localhost:8762/gallery/1 . You should get

an empty gallery object (no images).

{
"id": 1,
"images": null
}

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Sleuth
If you have, let’s say 3 services, A, B and C. We made three di erent
requests.

One request went from A → B, another from A →B →C, and last one went
from B →C.

A -> B
A -> B -> C
B -> C

As the number of microservices grow, tracing requests that propagate from


one microservice to another and gure out how a requests travels through
the application can be quite daunting.

Sleuth makes it possible to trace the requests by adding unique ids to logs.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
A trace id (1st) is used for tracking across the microservices; represents the
whole journey of a request across all the microservices, while span id (2nd)
is used for tracking within the individual microservice.

To use Sleuth, add dependency to pom.xml …

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

And In controller of gallery (or image) service, use logger to log some info.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// ...
private static final Logger LOGGER =
LoggerFactory.getLogger(HomeController.class);

public Gallery getGallery(@PathVariable final int id) {


LOGGER.info("Creating gallery object ... ");
// ...

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
LOGGER.info("Returning images ... ");
return images;
}
// ...

Now, when you make a request to gallery service, you should see the trace
and span ids in the console logs.

INFO [gallery-service,adcd5217a36fe469,8639d164315daca9,false] ...

. . .

Thank you for reading! If you enjoyed it, please clap


👏 for it.

Microservices Java Software Development Programming Other

986 claps

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
WRITTEN BY

OMAR ELGABRY Follow

Software Engineer. Going to the moon 🌑. When I die, turn my


blog into a story.

OmarElGabry's Blog Follow

This is my freedom area. Don't underestimate it. The devil is in


the detail.

See responses (9)

More From Medium

More from OmarElGabry's Blog

Plug-in Architecture
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
OMAR ELGABRY in OmarElGabry's Blog
May 1, 2019 · 9 min read 701

More from OmarElGabry's Blog

Threads Vs Queues
OMAR ELGABRY in OmarElGabry's Blog
Apr 15, 2019 · 11 min read 574

More from OMAR ELGABRY

The Ultimate Guide to Data Cleaning


OMAR ELGABRY in Towards Data Science
Feb 28, 2019 · 15 min read 1.6K

Discover Medium Make Medium yours Become a member


Welcome to a place where words matter. Follow all the topics you care about, and Get unlimited access to the best stories
On Medium, smart voices and original we’ll deliver the best stories for you to on Medium — and support writers while
ideas take center stage - with no ads in your homepage and inbox. Explore you’re at it. Just $5/month. Upgrade
sight. Watch

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
About Help Legal

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD

You might also like