Kystrix is a small DSL that makes working with Hystrix easier from Kotlin.
For example:
val greeting = hystrixCommand<Greeting> {
groupKey("GreetingService")
commandKey("Greeting")
command {
// This is what you want Hystrix to wrap
get("/greeting?firstName=John&lastName=Doe").asJson()
}
commandProperties {
withExecutionTimeoutInMilliseconds(10000)
withExecutionIsolationStrategy(THREAD)
withFallbackEnabled(false)
}
threadPoolProperties {
withQueueSizeRejectionThreshold(5)
withMaxQueueSize(10)
}
}The project contains two modules, kystrix-core and kystrix-spring. You only need kystrix-spring if you're using components from Spring's reactive stack such as spring-webflux. See Kystrix Spring for more info.
The project is available in Maven central as well as JCenter.
<dependency>
<groupId>se.haleby.kystrix</groupId>
<artifactId>kystrix-core</artifactId>
<version>0.1.16</version>
</dependency>compile 'se.haleby.kystrix:kystrix-core:0.1.16'dependencies {
compile("se.haleby.kystrix:kystrix-core:0.1.16")
}Once the kystrix-core DSL is included in the build there are two different entry points, hystrixCommand and hystrixObservableCommand, and both can be imported like this:
import se.haleby.kystrix.hystrixCommand
import se.haleby.kystrix.hystrixObservableCommandUse the hystrixCommand for blocking IO and hystrixObservableCommand for non-blocking IO using RxJava Observables.
See this blog post for more information.
Kystrix provides a module named kystrix-spring makes it easier to integrate and work with Mono and Flux and Hystrix.
<dependency>
<groupId>se.haleby.kystrix</groupId>
<artifactId>kystrix-spring</artifactId>
<version>0.1.16</version>
</dependency>compile 'se.haleby.kystrix:kystrix-spring:0.1.16'dependencies {
compile("se.haleby.kystrix:kystrix-spring:0.1.16")
}Once the kystrix-spring DSL is included in the classpath you can start using the extension functions in the se.haleby.kystrix package:
import se.haleby.kystrix.monoCommand
import se.haleby.kystrix.toMono
import se.haleby.kystrix.fluxCommand
import se.haleby.kystrix.toFlux
val greeting = hystrixObservableCommand<Greeting> {
groupKey("Test")
commandKey("Test-Command")
monoCommand {
webClient.get().uri("/greetings/1").retrieve().bodyToMono()
}
commandProperties {
withExecutionTimeoutInMilliseconds(10000)
withFallbackEnabled(false)
}
}.toMono()Using the monoCommand extension function makes it easy to integrate a Mono response with Hystrix. Also note the call to toMono() at the end, this will convert the Observable returned by Hystrix back to a Mono instance.
val greeting = hystrixObservableCommand<Greeting> {
groupKey("Test")
commandKey("Test-Command")
fluxCommand {
webClient.get().uri("/greetings").retrieve().bodyToFlux()
}
commandProperties {
withExecutionTimeoutInMilliseconds(10000)
withFallbackEnabled(false)
}
}.toFlux()Here Kystrix returns a non-blocking stream of Greeting wrapped in a Flux.
Have a look in the test package (see here for spring examples).

