Panduan Pantas untuk Spring Cloud Circuit Breaker

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan memperkenalkan projek Spring Cloud Circuit Breaker dan belajar bagaimana kita dapat menggunakannya.

Pertama, kita akan melihat apa yang ditawarkan oleh Spring Cloud Circuit Breaker selain pelaksanaan pemutus litar yang ada. Seterusnya, kita akan belajar bagaimana menggunakan mekanisme konfigurasi automatik Spring Boot untuk menyatukan satu atau lebih pemutus litar ke dalam aplikasi kita.

Perhatikan bahawa kami mendapat lebih banyak maklumat mengenai apa itu pemutus litar dan bagaimana ia berfungsi dalam Pengenalan kepada Hystrix, Spring Cloud Netflix Hystrix, dan Panduan untuk Ketahanan4j.

2. Pemutus Litar Awan Musim Semi

Sehingga baru-baru ini, Spring Cloud hanya memberi kami satu cara untuk menambahkan pemutus litar dalam aplikasi kami. Ini adalah melalui penggunaan Netflix Hystrix sebagai sebahagian daripada projek Spring Cloud Netflix.

Projek Spring Cloud Netflix sebenarnya hanyalah perpustakaan pembungkus berasaskan anotasi di sekitar Hystrix. Oleh itu, kedua-dua perpustakaan ini digabungkan dengan erat. Ini bermakna kita tidak dapat beralih ke implementasi pemutus litar lain tanpa mengubah aplikasi.

Projek Spring Cloud Circuit Breaker menyelesaikannya. Ini menyediakan lapisan abstraksi di pelbagai pelaksanaan pemutus litar. Ini adalah seni bina yang boleh dilayari. Oleh itu, kita dapat membuat kod terhadap abstraksi / antara muka yang disediakan dan beralih ke pelaksanaan lain berdasarkan keperluan kita.

Sebagai contoh, kami hanya akan menumpukan pada pelaksanaan Resilience4J. Walau bagaimanapun, teknik ini boleh digunakan untuk pemalam lain.

3. Konfigurasi Auto

Untuk menggunakan implementasi pemutus litar tertentu dalam aplikasi kita, kita perlu menambahkan pemula Spring yang sesuai. Dalam kes kami, mari gunakan spring-cloud-starter-circuitbreaker-resilience4j :

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

Mekanisme konfigurasi automatik mengkonfigurasi kacang pemutus litar yang diperlukan jika melihat salah satu pemula di lorong kelas.

Sekiranya kita ingin mematikan konfigurasi automatik Resilience4J, kita boleh menetapkan properti spring.cloud.circuitbreaker.resilience4j.enabled ke false .

4. Contoh Pemutus Litar Mudah

Mari buat aplikasi web menggunakan Spring Boot untuk membolehkan kami meneroka bagaimana perpustakaan Spring Cloud Circuit Breaker berfungsi.

Kami akan membina perkhidmatan web sederhana yang mengembalikan senarai album. Anggaplah senarai mentah disediakan oleh perkhidmatan pihak ketiga. Untuk kesederhanaan, kami akan menggunakan API dummy luaran yang disediakan oleh Jsonplaceholder untuk mengambil senarai:

//jsonplaceholder.typicode.com/albums

4.1. Buat Pemutus Litar

Mari buat pemutus litar pertama kami. Kita akan mulakan dengan memasukkan contoh kacang CircuitBreakerFactory :

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

Sekarang, kita boleh membuat pemutus litar dengan mudah menggunakan kaedah buat CircuitBreakerFactory # . Ia memerlukan pengecam pemutus litar sebagai argumen:

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

4.2. Balut Tugas dalam Pemutus Litar

Untuk membungkus dan menjalankan tugas yang dilindungi oleh pemutus litar, kita perlu memanggil kaedah r un yang menjadikan Pembekal 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 litar menjalankan kaedah kami untuk kami dan memberikan toleransi kesalahan.

Kadang kala, perkhidmatan luaran kami memerlukan masa yang terlalu lama untuk bertindak balas, melontarkan pengecualian yang tidak dijangka atau perkhidmatan atau host luaran tidak ada. Dalam kes ini, kami dapat memberikan cadangan sebagai argumen kedua untuk kaedah jalankan :

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 input, menggambarkan kesalahan. Ini bermaksud kita dapat memberikan hasil penggantian yang berbeza kepada pemanggil, berdasarkan jenis pengecualian yang mencetuskan penggantian.

Dalam kes ini, kami tidak akan mengambil kira pengecualian. Kami hanya akan mengembalikan senarai album dalam cache.

Sekiranya panggilan luaran diakhiri dengan pengecualian dan tidak ada penggantian disediakan, NoFallbackAvailableException dilemparkan oleh Spring.

4.3. Bina Pengawal

Sekarang, mari kita selesaikan contoh kita dan buat pengawal mudah yang memanggil kaedah perkhidmatan dan membentangkan hasilnya melalui penyemak imbas:

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

Akhirnya, mari hubungi perkhidmatan REST dan lihat hasilnya:

[GET] //localhost:8080/albums

5. Konfigurasi Custom Global

Biasanya, konfigurasi lalai tidak mencukupi. Atas sebab ini, kita perlu membuat pemutus litar dengan konfigurasi tersuai berdasarkan kes penggunaan kita.

Untuk mengatasi konfigurasi lalai, kita perlu menentukan kacang dan sifat kita sendiri di kelas @Configuration .

Di sini, kita akan menentukan konfigurasi global untuk semua pemutus litar. Atas sebab ini, kita perlu menentukan kacang Customizer . Oleh itu, mari kita gunakan pelaksanaan Resilience4JCircuitBreakerFactory .

Mula-mula, kami akan menentukan kelas konfigurasi pemutus litar dan pembatas masa mengikut tutorial Resilience4j:

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

Seterusnya, mari tanamkan konfigurasi dalam kacang Customizer dengan menggunakan kaedah 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 Khusus

Sudah tentu, kita boleh mempunyai beberapa pemutus litar dalam aplikasi kita. Oleh itu, dalam beberapa kes, kita memerlukan konfigurasi khusus untuk setiap pemutus litar.

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.

Seterusnya, kami memanfaatkan mekanisme konfigurasi automatik Spring Boot untuk menunjukkan cara menentukan dan mengintegrasikan pemutus litar. Kami juga menunjukkan bagaimana Spring Cloud Circuit Breaker berfungsi melalui perkhidmatan REST yang mudah.

Akhirnya, kami belajar untuk mengkonfigurasi semua pemutus litar bersama, dan juga secara individu.

Seperti biasa, kod sumber untuk tutorial ini terdapat di GitHub.