Dalam Microservices, kami membagi sistem menjadi banyak unit layanan, dan setiap unit saling bergantung melalui pendaftaran layanan dan konsumsi berlangganan. Tetapi apa yang terjadi jika beberapa layanan memiliki masalah?
Misalnya, ada tiga layanan (ABC), panggilan B dan B panggilan C. Karena keterlambatan jaringan atau masalah kode C, B tidak akan mendapatkan respons untuk waktu yang lama, sehingga permintaan B panggilan C akan ditangguhkan dan menunggu.
Dalam kasus akses bersamaan yang tinggi, utas yang ditangguhkan ini tidak dapat dilepaskan, menyebabkan permintaan berikutnya untuk diblokir, dan akhirnya B juga akan menggantung. Dengan analogi, A juga dapat menggantung, menyebabkan seluruh sistem macet.
Untuk menyelesaikan seluruh masalah, Spring Cloud menggunakan Hystrix untuk layanan toleran terhadap kesalahan layanan, termasuk serangkaian fungsi perlindungan seperti pemutus sirkuit dan isolasi benang. Hari ini kita akan melihat cara menerapkan pemutus sirkuit melalui Hystrix.
1. Apa itu Spring Cloud Hystrix? Apa itu pemutus sirkuit?
Spring Cloud Hystrix diimplementasikan berdasarkan kerangka kerja open source Netflix, Hystrix, dan tujuannya adalah untuk memberikan toleransi kesalahan yang kuat untuk latensi dan kegagalan dengan mengendalikan node -node yang mengakses sistem jarak jauh, layanan, dan pihak ketiga.
Pemutus sirkuit mirip dengan pemutus sirkuit kebocoran yang digunakan dalam kotak listrik yang kuat di rumah kami. Ketika unit layanan gagal (mirip dengan sirkuit pendek alat listrik), respons kesalahan dikembalikan ke penelepon melalui fungsi pemantauan kesalahan pemutus sirkuit (mirip dengan sekering), menghindari menunggu jangka panjang, sehingga mencegah kesalahan menyebar ke seluruh sistem.
2. Jika tidak ada pemutus sirkuit, tampilan halaman
Apakah Anda masih ingat tiga layanan di Spring Cloud Pendahuluan Seri 2: Menggunakan Eureka for Service Governance (Eureka/Hello-Service/Hello-Consumer) yang kami tulis sebelumnya? Kami melakukan percobaan berdasarkan ini.
1. Mulai Pusat Registrasi Layanan Eureka dengan nomor port 1111
2. Mulai penyedia layanan Hello-Service. Di sini kami memulai dua layanan, dengan nomor port 9090.9091 masing -masing.
3. Mulai Hello-Consumer untuk melayani konsumen, dengan nomor port 9999; Saat ini, kami tidak punya masalah mengunjungi http: // localhost: 9999/hello-consumer beberapa kali.
4. Matikan layanan dengan nomor port 9091, lalu kunjungi http: // localhost: 9999/hello-consumer beberapa kali, dan kesalahan dilaporkan.
PS: Di sini kami menjelaskan mengapa kami perlu mengakses beberapa kali, karena kami telah mencapai keseimbangan beban melalui pita. Ketika kami mengakses http: // localhost: 9999/hello-consumer, kami akan polling dua layanan yang mengakses hello-service. Kesalahan akan dilaporkan saat mengakses layanan dengan nomor port 9091. Tidak akan ada masalah dengan mengakses layanan dengan 9090.
3. Implementasi Kode Pemutus Sirkuit
Selanjutnya, mari kita lihat cara mengimplementasikan kode. Kami tidak memodifikasi pusat pendaftaran layanan dan penyedia layanan, kami hanya perlu memodifikasi konsumen konsumen konsumen.
1. Ubah file POM dan perkenalkan dependensi Hystrix
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/maven.romp.romp.romp. http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>hello-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-Boot-Starter-Parent </arttifactid> <version> 1.5.1.release </version> </indu <groupid> org.springframework.cloud </groupid> <ArtifactId> ketergantungan cloud-spring </t Artifactid> <version> camden.sr6 </version> <yype> pom </type> <cuppope> </scope-! <GroupId> org.springframework.cloud </groupid> <ArtifactId> Spring-cloud-starter-eureka </artifactid> </gandendency> <!-memperkenalkan ketergantungan pita digunakan untuk mengimplementasikan penyeimbangan beban. Kami hanya menggunakannya di sini dan tidak akan memperkenalkannya di tempat lain-> <dependency> <groupid> org.springframework.cloud </groupid> <Artifactid> spring-cloud-starter-ribbon </stifactid> </dependency> <!-memperkenalkan dependensi hystrix untuk mengimplementasikan kesalahan toleransi kesalahan layanan layanan toleransi layanan-> <! <ArTifactId> Spring-cloud-starter-hystrix </artifactid> </gandendency> </dependencies> </project>
2. Ubah kelas startup, tambahkan anotasi @enablecircuitbreaker, dan aktifkan pemutus sirkuit
@EnableDiscoveryClient@SpringBootApplication@EnableCircuitBreakerpublic class ConsumerApp { //@Bean is applied on the method and used to set the method return value to be bean @Bean @LoadBalanced //@LoadBalanced to achieve load balancing public RestTemplate restTemplate() { return new RestTemplate(); } public static void main (string [] args) {springApplication.run (konsumenApp.class, args); }}Pada saat ini, Anda akan menemukan bahwa kelas startup ini memiliki tiga anotasi. Bukankah ini sangat merepotkan? Tidak masalah, kita bisa menggunakan anotasi @springcloudapplication
@SpringcloudApplicationPublic Class ConsumerApp {// @bean diterapkan pada metode ini dan digunakan untuk mengatur nilai metode pengembalian menjadi bean @bean @loadbalanced // @loadbalanced untuk mencapai penyeimbangan beban resttemplate resttemplate () {return resttemplate baru (); } public static void main (string [] args) {springApplication.run (konsumenApp.class, args); }}@SpringcloudApplication = @EnableDiscoveryClient +@springbootApplication +@enableCircuTbreaker, Anda dapat melihat dari kode sumber:
@Target (elementType.type) @retention (retentionpolicy.runtime)@didokumentasikan@warisan@springbootApplication@enableDiscoveryclient@enableCircuTbreakerPublic @Interface springcloudApplication {}3. Layanan ADD
@ServICEPublic ConsumerService {@Autowired restTemplate restTemplate; @HyStrixCommand (fallbackMethod = "errorMsg") public string konsumen () {// hubungi layanan hello-service, perhatikan bahwa nama layanan digunakan di sini, bukan IP+port resttemplate.getForObject ("http: // hello-service/hello", string.class); kembalikan "Hello Consumer Finish !!!"; } public string errorMsg () {return "error !!!"; }}Kami memasukkan implementasi pengontrol asli dari memanggil restTemplate ke dalam layanan, dan menentukan metode panggilan balik melalui @HyStrixCommand, dan panggil metode ini ketika kesalahan terjadi.
4. Ubah pengontrol
/** *RestTemplate tidak lagi dipanggil langsung di sini, *tetapi diimplementasikan dengan menelepon layanan * */ @restcontrollerPublic kelas konsumen ConsumController { @autowired // resttemplate restTemplate; Layanan Layanan Konsumen; @RequestMapping ("/Hello-Consumer") Public String HelloConsumer () {// // Hubungi layanan hello-service, perhatikan bahwa nama layanan digunakan di sini, bukan port+port // resttemplate.getForObject ("http: // hello-service/hello", string.class); return service.consumer (); }}5. Tes, beberapa kunjungan, dan ketika kesalahan dilaporkan, konten berikut akan ditampilkan.
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.