Mode Pemutus Curcuit
Di lingkungan terdistribusi, terutama dalam sistem terdistribusi dengan struktur layanan mikro, sangat umum bagi satu sistem perangkat lunak untuk memanggil sistem jarak jauh lainnya. Calle dari panggilan jarak jauh ini mungkin proses lain, atau host lain di seluruh jaringan. Perbedaan terbesar antara panggilan jarak jauh ini dan panggilan internal proses adalah bahwa panggilan jarak jauh dapat gagal atau digantung tanpa respons apa pun sampai batas waktu. Lebih buruk lagi, jika beberapa penelepon menyebut layanan yang tertunda yang sama, sangat mungkin bahwa waktu tunggu waktu tunggu suatu layanan akan dengan cepat menyebar ke seluruh sistem yang didistribusikan, menyebabkan reaksi berantai, dan dengan demikian mengonsumsi sejumlah besar sumber daya dari seluruh sistem yang didistribusikan. Pada akhirnya dapat menyebabkan kelumpuhan sistem.
Mode pemutus sirkuit adalah untuk mencegah bencana yang disebabkan oleh reaksi berantai seperti air terjun dalam sistem terdistribusi.
Setelah alat listrik tertentu memiliki masalah, sekering sirkuit akan bertiup untuk mencegah bencana. Pemutus sirkuit mirip dengan sekering sirkuit. Gagasan implementasinya sangat sederhana. Mereka dapat merangkum layanan jarak jauh yang membutuhkan perlindungan dan memantau jumlah kegagalan secara internal. Setelah jumlah kegagalan mencapai ambang batas tertentu, semua panggilan berikutnya ke layanan akan secara langsung mengembalikan kesalahan ke penelepon setelah pemutus sirkuit mencegat, dan tidak akan terus memanggil layanan yang telah memiliki masalah, dengan demikian mencapai tujuan melindungi penelepon. Seluruh sistem tidak akan mengalami reaksi berantai air terjun yang disebabkan oleh batas waktu.
1. Mode Dasar
Gambar di atas adalah struktur pemutus sirkuit (pemutus curcuit), yang memiliki dua keadaan dasar (dekat dan terbuka) dan tindakan perjalanan dasar:
Dalam keadaan dekat, klien meminta layanan ke pemasok secara langsung melalui pemutus sirkuit tanpa hambatan. Nilai pengembalian pemasok secara langsung dikembalikan ke klien oleh pemutus sirkuit.
Dalam keadaan terbuka, setelah klien memulai permintaan layanan ke pemasok, pemutus sirkuit tidak akan mentransfer permintaan ke pemasok, tetapi akan secara langsung mengembalikan klien, dan jalur antara klien dan pemasok rusak.
Trip: Dalam keadaan dekat, jika pemasok terus keluar dan kesalahan, setelah mencapai ambang batas yang ditentukan, perjalanan akan terjadi di pemutus sirkuit, dan kemudian keadaan pemutus sirkuit akan masuk terbuka dari dekat.
2. Mode diperpanjang
Dalam mode pemutus sirkuit dasar, ini memastikan bahwa pemutus sirkuit tidak akan dipanggil ketika pemutus sirkuit berada dalam keadaan terbuka, tetapi kami juga memerlukan langkah -langkah tambahan untuk mengatur ulang pemutus sirkuit setelah pemasok mengembalikan layanan. Salah satu cara yang layak adalah dengan secara teratur mendeteksi apakah layanan pemasok dipulihkan, dan setelah dipulihkan, status diatur untuk ditutup. Keadaan pemusnahan sirkuit adalah setengah terbuka.
3. Gunakan kesempatan untuk pemutus sirkuit:
Pemasok umumnya sangat stabil. Jika setelah terjadi kegagalan, waktu inspeksi dan pemulihan memakan waktu lama dan tidak dapat dengan cepat diperbaiki dalam waktu singkat, maka layanan ini lebih cocok untuk menggunakan mode pemutus sirkuit. Kalau tidak, itu kemungkinan akan menyebabkan efek ping-pong.
3. Pemutus sirkuit tidak cocok untuk kesempatan:
Untuk mencegah aplikasi dari mencoba memohon layanan jarak jauh atau mengakses sumber daya bersama, pola ini mungkin tidak cocok jika operasi sangat mungkin gagal.
Untuk memproses aplikasi mengakses sumber daya khusus lokal, seperti struktur data dalam memori. Dalam lingkungan ini, biasanya tidak cocok, dan menggunakan pemutus sirkuit hanya akan meningkatkan overhead sistem.
Berikut ini adalah pengantar langsung tentang cara menggunakan pemutus sirkuit Spring Cloud.
Springcloud Netflix mengimplementasikan nama Perpustakaan Pemutus Sirkuit yang disebut Hystrix. Di bawah arsitektur Microservice, biasanya ada beberapa tingkat panggilan layanan. Berikut ini adalah diagram skematik dari browser yang mengakses microservices backend melalui API di bawah arsitektur Microservice:
Kegagalan batas waktu layanan mikro dapat menyebabkan reaksi berantai air terjun. Pada gambar di bawah ini, Hystrix mencegah hal ini terjadi melalui pemutus sirkuit umpan balik otonom.
Layanan B dalam gambar gagal karena beberapa alasan dan menjadi tidak tersedia. Semua panggilan ke layanan B akan habis. Ketika panggilan ke B gagal mencapai ambang batas tertentu (20 kegagalan terjadi dalam 5 detik adalah nilai default yang ditentukan oleh Hystrix), tautan akan berada dalam keadaan terbuka, dan kemudian semua panggilan ke layanan B tidak akan dieksekusi, alih -alih pesan fallback yang menunjukkan tautan yang terbuka yang disediakan oleh pemutus sirkuit. Hystrix menyediakan mekanisme yang sesuai yang memungkinkan pengembang untuk mendefinisikan pesan Fallbak ini.
Tautan Open memblokir kesalahan air terjun, memungkinkan layanan banjir atau salah memiliki waktu untuk memperbaikinya. Fallback ini dapat berupa panggilan yang dilindungi Hystrix lain, data statis, atau nilai nol legal. Fallbacks dapat membentuk struktur rantai, sehingga fallback pertama yang memanggil layanan bisnis lain di bagian bawah untuk mengembalikan data statis.
Selanjutnya, mari kita ke intinya, menambahkan pemutus sirkuit ke dua kelompok layanan Hello World sebelumnya untuk mencegah salah satu hello world dari kendur, menyebabkan sistem gagal rantai timeout.
1. Tambahkan pustaka Hystrix untuk mendukung pemutus sirkuit di proyek Pom.xml dari Maven (Proyek Pita atau Petugas yang diperkenalkan di bab sebelumnya)
<dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-hystrix </artifactid> </dependency>
2. Gunakan pemutus sirkuit dalam aplikasi pita
1). Tambahkan Anotasi @enablecItbreaker di kelas startup boot musim semi
@SpringbootApplication@enableDiscoveryclient@enableCircuTbreakerPublic kelas serviceribbonApplication {public static void main (string [] args) {springApplication.run (serviceribbonApplication.class, args); }2). Annotate Metode mengakses layanan dengan anotasi @HyStrixCommand
@Servicepublic kelas HelloService {@Autowired restTemplate restTemplate; @HyStrixCommand (fallbackMethod = "ServiceFailure") Public String getHellocontent () {return resttemplate.getForObject ("http: // service-helloworld/", string.class); } public String serviceFailure () {return "Hello World Service tidak tersedia!"; }}Anotasi @HyStrixCommand mendefinisikan pemutus sirkuit yang merangkum metode gethellocontant (). Ketika layanan-hellowld diakses gagal mencapai ambang batas, layanan-helloworld tidak akan lagi dipanggil. Sebaliknya, ia mengembalikan metode serviceFailure () yang ditentukan oleh FallbackMethod. Ada dua poin yang perlu diberi perhatian khusus saat mendefinisikan metode FallbackMethod yang ditentukan oleh anotasi @HyStrixCommand:
Pertama, nilai pengembalian dan jenis parameter dari FallbackMethod harus persis sama dengan metode yang dijelaskan oleh @HyStrixCommand. Kalau tidak, pengecualian akan dilemparkan saat runtime. Misalnya, dalam contoh ini, nilai pengembalian serviceFailure () dan nilai pengembalian gethellocontant () keduanya adalah string.
Kedua, ketika layanan yang mendasarinya gagal, FallbackMethod tidak menggantikan seluruh metode yang dianotasi oleh @HyStrixCommand (gethellocontant dalam contoh ini), tetapi hanya layanan spesifik yang diakses melalui restemplate. Anda dapat melihat dari output sistem bahwa bahkan jika gagal, masih akan ada "Call Service-Helloworld" di output konsol.
Mulailah layanan Eureka, mulailah hanya dua layanan HelloWorld, dan kemudian mengganggu salah satunya (simulasikan salah satu layanan microser yang ditangguhkan), kunjungi http: // localhost: 8901/dan kemudian menyegarkan, karena penyeimbangan beban, Anda dapat melihat dua halaman berikut muncul secara bergantian. Anda dapat melihat bahwa layanan tertunda kedua digantikan oleh metode penanganan kesalahan yang ditentukan dalam pita.
4. Gunakan pemutus sirkuit dalam aplikasi berpura -pura
1). Petugas sudah mendukung pemutus sirkuit, jadi Anda tidak perlu memikirkan metode Ribbon, tambahkan anotasi tambahan ke kelas startup boot musim semi.
2). Tambahkan kelas fallback dengan anotasi @FeignClient, yang harus mengimplementasikan antarmuka yang dimodifikasi oleh @FeignClient.
@FeignClient (name = "Service-Helloworld", Fallback = HelloWorldServiceFailure.class) Antarmuka Publik HelloWorldService {@RequestMapping (value = "/", Method = requestMethod.get) Public String Sayshello (); }3). Untuk membuat kelas HelloWorldServiceFailure, Anda harus mengimplementasikan antarmuka HelloWorldService yang dimodifikasi oleh @FeignClient. Perhatikan bahwa Anda menambahkan anotasi @Component atau @Service untuk menghasilkan kacang di wadah musim semi.
@ComponentPublic kelas HelloWorldServiceFailure mengimplementasikan HelloWorldService {@Override Public String Sayshello () {System.out.println ("Hello World Service tidak tersedia!"); Kembalikan "Hello World Service tidak tersedia!"; }}4). Dalam versi Brixton sebelum Spring Cloud, Fign secara otomatis mengaktifkan pemutus sirkuit secara default, tetapi versi Dalston baru -baru ini telah mengubah konfigurasi default untuk melarang.
Untuk alasan, silakan merujuk ke: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277. Perhatikan poin ini. Oleh karena itu, untuk menggunakan pemutus sirkuit di Petchign, Anda harus menambahkan konfigurasi berikut di Application.yml:
Petugas: hystrix: diaktifkan: true
5). Luncurkan aplikasi Petana dan kunjungi http: // localhost: 8902/halo untuk melihat efek yang sama seperti pita.
Referensi: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.