Skip to content

chetankamadinni/circuit-breaker-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

circuit-breaker-demo

Demo of circuit breaker pattern in microservices

Circuit breaker pattern is a way to handle the request load when the microservices are not responding or is down completely. Here the client can either timeout the requests or handle in a way where the server is not overloaded with the requests. Here client can do either of the following

  • throw an exception
  • provide a dummy response
  • respond with values from cache

We are going to use Netflix-Hystrix to do the circuit-breaker implementation.

This implemenation is an extension over the service-discovery implementation. Please refer to this repo for service-discovery related details.

Steps

  • Create a spring-boot app with the below dependency
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
	<version>2.2.2.RELEASE</version>
</dependency>
  • Add @EnableCircuitBreaker annotation to your application class.

  • Add @HystrixCommand annotation to your method where you want to implement the circuit breaker. Provide a fallback method which will return the response whenever circuit breaks.

@GetMapping("/hi")
@HystrixCommand(fallbackMethod = "fallbackHi")
public String hi() {
	ResponseEntity<String> exchange = restTemplate.exchange("http://service/hello", HttpMethod.GET, null, String.class);
	return exchange.getBody();
}
public String fallbackHi() {
	return "Service is not responding! Please try after sometime.";
}

Decide on when to break a circuit

When does the circuit should break? and when should the calls be sent again? We can configure this by taking into consideration of different parameters as listed below

  • Timeout a request after p seconds
  • Consider for last n request
  • m out of n requests are failed
  • After t seconds(sleep window) the client should agian start sending the requests
commandProperties = {
	@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000"),
	@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
	@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
	@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000") }

The above example considers a request timeout of 2secs. If among the last 5 requests, 50% of requests are failed to respond then circuit is broken. The client will again start sending the request after 5 secs(sleep window). You can test this behavior by bringing down the service and making the calls to client application.

Configure Hystrix Dashboard

To monitor all these requests, hystrix provides a dashboard. To configure the dashboard add the below dependency

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
	<version>2.2.2.RELEASE</version>
</dependency>

Make sure your pom has actuator dependency as well. Hystrix dashboard uses actuator

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Add @EnableHystrixDashboard annotation to the application class.

Add management.endpoints.web.exposure.include=* to the application.properties file.

To access the dashboard hit the app end point with /hystrix. http://localhost:8083/hystrix. As we just using a single hystrix app and not in a cluster. Copy the URL http://localhost:8083/actuator/hystrix.stream to the textbox and hit Monitor Stream button. This will give the api call details.

Bulk head pattern

Here in this pattern we can give each api with a dedicated threadpool which will not collide with other apis. To configure bulk head, you can provide below properties to @HystrixCommand

@HystrixCommand(fallbackMethod = "fallbackHi", threadPoolKey = "hiServicePool", threadPoolProperties = {
	@HystrixProperty(name = "coreSize", value = "20"),
	@HystrixProperty(name = "maxQueueSize", value = "10") })

Each threadpool can again be configured with the coreSixe(max threads allocated) and maxQueueSize(requests that can be saved to the queue)

About

Demo of circuit breaker pattern in microservices

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages