Panduan Cepat untuk Spring Cloud Circuit Breaker

1. Ikhtisar

Dalam tutorial ini, kami akan memperkenalkan proyek Spring Cloud Circuit Breaker dan mempelajari cara memanfaatkannya.

Pertama, kita akan melihat apa yang ditawarkan Spring Cloud Circuit Breaker selain implementasi circuit breaker yang ada. Selanjutnya, kita akan belajar bagaimana menggunakan mekanisme konfigurasi otomatis Spring Boot untuk mengintegrasikan satu atau lebih circuit breaker ke dalam aplikasi kita.

Perhatikan bahwa kami mendapatkan lebih banyak informasi tentang apa itu circuit breaker dan cara kerjanya di Pengantar Hystrix, Spring Cloud Netflix Hystrix, dan Guide to Resilience4j.

2. Pemutus Sirkuit Awan Musim Semi

Hingga saat ini, Spring Cloud hanya memberi kami satu cara untuk menambahkan pemutus sirkuit di aplikasi kami. Ini dilakukan melalui penggunaan Netflix Hystrix sebagai bagian dari proyek Spring Cloud Netflix.

Proyek Spring Cloud Netflix sebenarnya hanyalah pustaka pembungkus berbasis anotasi di sekitar Hystrix. Oleh karena itu, kedua pustaka ini sangat erat. Ini berarti kami tidak dapat beralih ke implementasi pemutus sirkuit lain tanpa mengubah aplikasi.

Proyek Spring Cloud Circuit Breaker memecahkan masalah ini. Ini menyediakan lapisan abstraksi di seluruh implementasi pemutus sirkuit yang berbeda. Ini adalah arsitektur yang dapat dipasang. Jadi, kita dapat membuat kode terhadap abstraksi / antarmuka yang disediakan dan beralih ke implementasi lain berdasarkan kebutuhan kita.

Untuk contoh kami, kami hanya akan fokus pada implementasi Resilience4J. Namun, teknik ini dapat digunakan untuk plugin lain.

3. Konfigurasi Otomatis

Untuk menggunakan implementasi circuit breaker tertentu dalam aplikasi kita, kita perlu menambahkan Spring starter yang sesuai. Dalam kasus kami, mari gunakan spring-cloud-starter-circuitbreaker-resilience4j :

 org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j 1.0.2.RELEASE 

Mekanisme konfigurasi otomatis mengkonfigurasi kacang pemutus sirkuit yang diperlukan jika ia melihat salah satu starter di classpath.

Jika kita ingin menonaktifkan konfigurasi otomatis Resilience4J, kita bisa menyetel properti spring.cloud.circuitbreaker.resilience4j.enabled ke false .

4. Contoh Pemutus Sirkuit Sederhana

Mari buat aplikasi web menggunakan Spring Boot untuk memungkinkan kita menjelajahi cara kerja pustaka Spring Cloud Circuit Breaker.

Kami akan membangun layanan web sederhana yang mengembalikan daftar album. Misalkan daftar mentah disediakan oleh layanan pihak ketiga. Untuk mempermudah, kami akan menggunakan API dummy eksternal yang disediakan oleh Jsonplaceholder untuk mengambil daftar:

//jsonplaceholder.typicode.com/albums

4.1. Buat Pemutus Sirkuit

Mari buat pemutus arus pertama kita. Kami akan mulai dengan memasukkan sebuah instance dari kacang CircuitBreakerFactory :

@Service public class AlbumService { @Autowired private CircuitBreakerFactory circuitBreakerFactory; //... }

Sekarang, kita dapat dengan mudah membuat pemutus sirkuit menggunakan metode pembuatan CircuitBreakerFactory # . Dibutuhkan pengenal pemutus sirkuit sebagai argumen:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");

4.2. Bungkus Tugas di Pemutus Sirkuit

Untuk membungkus dan menjalankan tugas yang diproteksi oleh pemutus sirkuit, kita perlu memanggil metode r un yang menggunakan Pemasok sebagai argumen.

public String getAlbumList() { CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker"); String url = "//jsonplaceholder.typicode.com/albums"; return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class)); }

Pemutus sirkuit menjalankan metode kami untuk kami dan memberikan toleransi kesalahan.

Terkadang, layanan eksternal kami membutuhkan waktu terlalu lama untuk merespons, memberikan pengecualian yang tidak terduga, atau layanan atau host eksternal tidak ada. Dalam hal ini, kami dapat menyediakan fallback sebagai argumen kedua untuk metode run :

public String getAlbumList() { CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker"); String url = "//localhost:1234/not-real"; return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), throwable -> getDefaultAlbumList()); }

Lambda untuk fallback menerima Throwable sebagai masukan, yang menjelaskan kesalahannya. Artinya, kami dapat memberikan hasil fallback yang berbeda ke pemanggil, berdasarkan jenis pengecualian yang memicu fallback.

Dalam kasus ini, kami tidak akan mempertimbangkan pengecualian. Kami hanya akan mengembalikan daftar album yang disimpan dalam cache.

Jika panggilan eksternal diakhiri dengan pengecualian dan tidak ada fallback yang disediakan, NoFallbackAvailableException dijalankan oleh Spring.

4.3. Bangun Pengontrol

Sekarang, mari selesaikan contoh kita dan buat pengontrol sederhana yang memanggil metode layanan dan menyajikan hasilnya melalui browser:

@RestController public class Controller { @Autowired private Service service; @GetMapping("/albums") public String albums() { return service.getAlbumList(); } }

Terakhir, panggil layanan REST dan lihat hasilnya:

[GET] //localhost:8080/albums

5. Konfigurasi Kustom Global

Biasanya, konfigurasi default saja tidak cukup. Untuk alasan ini, kami perlu membuat pemutus sirkuit dengan konfigurasi khusus berdasarkan kasus penggunaan kami.

Untuk menimpa konfigurasi default, kita perlu menentukan kacang dan properti kita sendiri di kelas @Configuration .

Di sini, kami akan menentukan konfigurasi global untuk semua pemutus sirkuit. Untuk alasan ini, kita perlu mendefinisikan bean Customizer . Jadi, mari gunakan implementasi Resilience4JCircuitBreakerFactory .

Pertama, kita akan menentukan kelas konfigurasi pemutus sirkuit dan pembatas waktu sesuai dengan tutorial Resilience4j:

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .failureRateThreshold(50) .waitDurationInOpenState(Duration.ofMillis(1000)) .slidingWindowSize(2) .build(); TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom() .timeoutDuration(Duration.ofSeconds(4)) .build();

Selanjutnya, mari kita sematkan konfigurasi dalam kacang Customizer dengan menggunakan metode Resilience4JCircuitBreakerFactory.configureDefault :

@Configuration public class Resilience4JConfiguration { @Bean public Customizer globalCustomConfiguration() { // the circuitBreakerConfig and timeLimiterConfig objects return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) .timeLimiterConfig(timeLimiterConfig) .circuitBreakerConfig(circuitBreakerConfig) .build()); } }

6. Konfigurasi Kustom Khusus

Tentu saja, kita dapat memiliki beberapa pemutus arus dalam aplikasi kita. Oleh karena itu, dalam beberapa kasus, diperlukan konfigurasi khusus untuk setiap pemutus arus.

Similarly, we can define one or more Customizer beans. Then, we can provide a different configuration for each one by using the Resilience4JCircuitBreakerFactory.configure method:

@Bean public Customizer specificCustomConfiguration1() { // the circuitBreakerConfig and timeLimiterConfig objects return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig) .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker"); }

Here we provide a second parameter, the id of the circuit breaker we're configuring.

We can also set up multiple circuit breakers with the same configuration by providing a list of circuit breaker ids to the same method:

@Bean public Customizer specificCustomConfiguration2() { // the circuitBreakerConfig and timeLimiterConfig objects return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig) .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker1", "circuitBreaker2", "circuitBreaker3"); }

7. Alternative Implementations

We've seen how to use the Resilience4j implementation to create one or more circuit breakers with Spring Cloud Circuit Breaker.

However, there are other implementations supported by Spring Cloud Circuit Breaker that we can leverage in our application:

  • Hystrix
  • Sentinel
  • Spring Retry

It's worth mentioning that we can mix and match different circuit breaker implementations in our application. We're not just limited to one library.

The above libraries have more capabilities than we've explored here. However, Spring Cloud Circuit Breaker is an abstraction over only the circuit breaker part. For example, Resilience4j also provides other modules like RateLimiter, Bulkhead, Retry in addition to the CircuitBreaker and TimeLimiter modules used in this article.

8. Conclusion

In this article, we discovered the Spring Cloud Circuit Breaker project.

First, we learned what the Spring Cloud Circuit Breaker is, and how it allows us to add circuit breakers to our application.

Selanjutnya, kami memanfaatkan mekanisme konfigurasi otomatis Spring Boot untuk menunjukkan cara menentukan dan mengintegrasikan pemutus sirkuit. Selain itu, kami mendemonstrasikan cara kerja Spring Cloud Circuit Breaker melalui layanan REST sederhana.

Akhirnya, kami belajar mengonfigurasi semua pemutus sirkuit secara bersama-sama, serta secara individual.

Seperti biasa, kode sumber untuk tutorial ini tersedia di GitHub.