Perkenalan
Spring Cloud menyediakan perpustakaan toleran kesalahan Hystrix untuk mengimplementasikan strategi penurunan peringkat untuk metode yang dikonfigurasi dengan pemutus sirkuit ketika layanan tidak tersedia dan sementara memanggil metode alternatif. Artikel ini akan membuat Microservice Produk, mendaftar dengan Pusat Registrasi Layanan Eureka, dan kemudian kami menggunakan API Akses Klien Web/Produk untuk mendapatkan daftar produk, dan ketika layanan produk gagal, metode siaga lokal dipanggil untuk menurunkan peringkat tetapi menyediakan layanan secara normal.
Lingkungan dasar
Git: Kode Sumber Proyek
Tambahkan Layanan Produk
Buat proyek Maven baru di Intellij, menggunakan konfigurasi berikut
Kemudian tambahkan kode berikut di pom.xml:
<? Xml Version = "1.0" encoding = "UTF-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <ModelVersion> 4.0.0 </modelversion> <groupid> CN.ZXUCUCTRICE </Group.0. <version> 1.0-Snapshot </version> <partent> <groupid> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-parent </StifactId> <versies> 2.0.1.release </version> <relativePath/</Parent> <versies> Properties> <Project.Build.Sourceencoding> UTF-8 </project.build.sourceencoding> <Java.Version> 1.8 </java.version> </Properties> </Artixid> <ArtiFSid> org.springframework.cloud </groupid> <ArtifacTid> </Dependency> <dependency> <GroupId> org.springframework.cloud </groupid> <t ArtifactId> Spring-cloud-starter-config </arttifactid> </dependency> <sependency> <trotifD> org.springframework.boot </groupid> <ArtifactId> SPRINGINGENCE-SPRINSIONTER.BACTID </groupid> <ArtiFacTID> SPRINGINGATIONS-SPRINSIONTER.BACTICE </Groupid> <ArtiFACTID> SPRINGINGING-SPRINSIONTER.BACTICE </Groupid> <ArtiFACTID> SPRINGINGING-BOKTORER.BACTIC <groupId> org.springframework.boot </groupid> <ArtifactId> spring-boot-starter-test </arttifactid> <scope> test </seupope> </dependency> </dependency> </dependency> <gandelencyManagement> <dependency> <dependency> <groupid> org.springfring.cringfrework <ArTifactId> Spring-cloud-Dependencies </arttifactid> <version> finchley.m9 </version> <ypeement> pom </ype> <scope> impor </opope> </dependency> </dependency> </dependency> </ketergantungan Management> <build> <diggin> <groupid> org.springfring.boot <ArTifactId> Spring-Boot-Maven-plugin </artifactid> </lugin> </lugin> </build> <r repositories> <repository> <drange> <dring-milestones </drepo> tonggak sejarah </name> <rrtps://repo.spring.io--lestones </name> <rrtps://repo.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io <Enabled> false </denabled> </snapshots> </repository> </bepository> </repositories> </joy Project>
Kami terus menggunakan Spring-Cloud-Starter-Netflix-Eureka-Client untuk memungkinkan produk dan layanan secara otomatis terdaftar dengan layanan Eureka. Kemudian Spring-Cloud-Starter-Config juga digunakan untuk membaca file konfigurasi pusat layanan konfigurasi. Proyek ini hanyalah proyek web musim semi yang sederhana.
Buat file bootstrap.yml di bawah src/main/sumber daya dan tambahkan konten berikut:
Spring: Aplikasi: Nama: Layanan Produk Cloud: Config: URI: http: // localhost: 8888
Buat file product-service.yml di repositori git di pusat konfigurasi dan tambahkan konfigurasi berikut dan kirim:
Server: Port: 8081
Konfigurasi ini menentukan bahwa port layanan produk adalah 8081. Kemudian buat kelas aplikasi dan tambahkan kode berikut:
paket cn.zxuqian; impor org.springframework.boot.springapplication; impor org.springframework.boot.autoconfigure.springbootApplication; Impor org.springframework.cloud.client.discovery.enableClicovery -clipplion@@client.discovery. static void main (string [] args) {springApplication.run (application.class, args); }}Anotasi @EnableDiscoveryclient akan menginstruksikan Spring Cloud untuk secara otomatis mendaftarkan layanan ini dengan Eureka. Akhirnya, buat pengontrol cn.zxuqian.controllers.productController, berikan API /produk, dan kembalikan data sampel:
Paket cn.zxuqian.controllers; impor org.springframework.web.bind.annotation.requestmapping; impor org.spramework.web.bind.annotation.restController, "return (" return ("return (" @restcontroller () {@restcontrollerpublic {@restcontrollerpublic {@restcontroller {@restcontrollic {@restcontrollic Sweater, t-shirt "; }}Konfigurasikan klien web
Buka proyek web yang kami buat sebelumnya dan tambahkan ketergantungan Hystrix baru ke pom.xml:
<dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-netflix-hystrix </artifactid> </dependency>
Kemudian perbarui kode kelas aplikasi:
paket cn.zxuqian; impor org.springframework.boot.springapplication; impor org.springframework.boot.autoconfigure.springbootApplication; impor org.springframework.boot.web.client.restemplateBuilder; org.springframework.cloud.client.circuitbreaker.enableCircuTbreaker; impor org.springframework.cloud.client.discovery.enableDiscovercient; impor org.springframework.context.annotation.bean; impor org.springframework.web.client.resttemplate;@enableCircuTbreaker@enableDiscoveryclient@springbootApplicationPublic Class Application {public static Main (String [] args) {springApplication.run (application.class, args); } @Bean resttemplate rest (resttemplateBuilder builder) {return builder.build (); }}Di sini, @EnableCircuTbreaker digunakan untuk mengaktifkan fungsi pemutus sirkuit, dan kemudian metode istirahat ditambahkan dan anotasi @Bean digunakan. Bagian ini termasuk dalam fungsi injeksi ketergantungan pegas. Metode menggunakan tag @Bean akan memberi tahu Anda cara menginisialisasi objek tersebut. Misalnya, dalam contoh ini, menggunakan resttemplateBuilder untuk membuat objek resttemplate, yang akan digunakan nanti di layanan menggunakan pemutus sirkuit.
Buat kelas cn.zxuqian.service.productservice dan tambahkan kode berikut:
Paket cn.zxuqian.services; impor com.netflix.hystrix.contrib.javanica.annotation.hystrixCommand; impor org.springframework.beans.factory.annotation.Autowired; Impor org.springframework.cloud.client.service.Autowired; IMPREG.SPRINGRAMEWork.cloud.client.service. org.springframework.cloud.client.discovery.discoveryclient; impor org.springframework.stereotype.service; impor org.springframework.web.client.resttemplate; import java.uttpemplate; @servicePublic class classervice; @Autowired Private Discoveryclient Discoveryclient; Public ProductService (restTemplate restTemplate) {this.resttemplate = restTemplate; } @HyStrixCommand (fallbackMethod = "backupproductList") public string ProductList () {list <serviceInstance> instances = this.discoveryclient.getInstances ("layanan produk"); if (instances! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instances.get (0) .geturi () + "/produk", string.class); } kembali ""; } public string backupproductList () {return "jack, sweater"; }} Alasan untuk membuat kelas layanan adalah bahwa Hystrix hanya dapat digunakan di kelas yang ditandai @Service atau @Component, sehingga API yang disediakan oleh Konteks Musim Semi dapat digunakan secara normal. Ini akan dijelaskan nanti saat Anda memasuki musim semi.
Setelah menggunakan anotasi @HyStrixCommand, Hystrix akan memantau metode beranotasi, yaitu daftar produk (lapisan yang mendasarinya membungkus metode ini untuk mencapai pemantauan). Setelah kesalahan metode ini menumpuk ke ambang batas tertentu, pemutus sirkuit akan dimulai. Semua permintaan berikutnya untuk memanggil metode ProductList akan gagal, dan metode yang ditentukan oleh FallbackMethod akan sementara disebut BackupproductList (), dan kemudian ketika layanan kembali normal, pemutus sirkuit akan ditutup.
Di kelas ini, kami juga menggunakan Discoveryclient untuk menemukan alamat URI dari layanan produk, menggunakan nilai spring.Application.name Item Konfigurasi Layanan Produk, yaitu, layanan produk diteruskan ke metode DiscoveryClient.GetInstances () sebagai layanan, dan kemudian daftar akan dikembalikan. Karena kami hanya memiliki satu layanan produk yang dimulai, kami hanya perlu mengambil alamat URI dari contoh pertama.
Kemudian kami menggunakan RestTemplate untuk mengakses API layanan produk. Perhatikan bahwa injeksi konstruktor Spring digunakan di sini, yaitu metode yang kami anotasi dengan @Bean akan digunakan untuk menginisialisasi variabel restemplate tanpa kami secara manual menginisialisasi. Kelas RestTemplate menyediakan metode GetForObject () untuk mengakses API REST lainnya dan membungkus hasilnya ke dalam bentuk objek. Parameter pertama adalah alamat URI API yang akan diakses, dan parameter kedua adalah jenis hasil yang diperoleh. Di sini kami mengembalikan string, jadi kami meneruskannya ke String.class.
Metode backupproductlist () mengembalikan informasi daftar produk yang diturunkan.
Akhirnya, buat controller cn.zxuqian.controllers.productController dan tambahkan kode berikut:
Paket cn.zxuqian.controllers; impor cn.zxuqian.services.productservice; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.web.bind.annotation.requestmapppappappapping; impor; org.springframework.web.bind.annotation.RestController; @RestControllerPublic Class ProductController {@Autowired private ProductService ProductService; @RequestMapping ("/Products") Public String ProductList () {return ProductService.productList (); }} Di sini, gunakan ProductService untuk menyediakan data untuk jalur /produk.
tes
Pertama, kami menggunakan Spring-Boot: Run Plug-in untuk memulai layanan Pusat Konfigurasi, Config-Server, lalu mulai Eureka-Server, lalu mulai layanan produk, dan akhirnya mulai klien Web. Tunggu sebentar sebelum layanan Eureka berhasil didaftarkan dan kunjungi http: // localhost: 8080/produk. Dalam keadaan normal, kita akan mendapatkan hasil jaket, jaket, sweater, dan t-shirt. Kemudian kami menutup layanan produk, dan kemudian mengakses jalur yang sama, dan kami akan mendapatkan hasil penurunan peringkat: jaket, sweter
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.