Posting blog sebelumnya membangun kerangka kerja Eureka+Ribbon+Hystrix. Meskipun pada dasarnya dapat memenuhi panggilan antar layanan, kode ini terlihat sangat jelek. Klien harus menulis RestTemplate setiap saat. Untuk membuat panggilan lebih indah dan mudah dibaca, kita sekarang belajar untuk berpura -pura.
Petana termasuk Ribbon dan Hystrix, yang secara bertahap mengalami signifikansinya dalam pertempuran yang sebenarnya. Inklusi yang disebut bukanlah inklusi fisik dari paket toples Petana termasuk paket toples Ribbon dan Hystrix, tetapi dimasukkannya logis dari fungsi-fungsi Petana termasuk fungsi dua lainnya. Singkatnya: Petugas dapat melakukan hal -hal tentang Ribbon dan Hystrix, tetapi untuk menggunakan anotasi yang dibawa oleh Pita dan Hystrix, paket JAR yang sesuai harus diperkenalkan.
Kasus 1:
Pusat Pendaftaran Eureka: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
Penyedia Layanan: https://github.com/yejingtao/forblog/tree/master/demo-feign-freeservice
Penelepon Layanan: https://github.com/yejingtao/forblog/tree/master/demo-feign-freeconsumer
Penyedia layanan adalah aplikasi web eureKaclient+sederhana, memberikan metode berikut
@RestController @RequestMapping ("/fign-service") kelas publik HelloServiceContorller {private Logger Logger = LoggerFactory.getLogger (this.getClass ()); private void sleep (string methodName) {int sleepminTime = new random (). nextInt (3000); Logger.info ("HelloService"+MethodName+"SleepMinTime:"+sleepminTime); coba {thread.sleep (sleepminTime); } catch (InterruptedException e) {E.PrintStackTrace (); }} @RequestMapping (value = "/serviceGet", Method = requestMethod.get) String publik HelloService (@RequestParam nama string) {sleep ("get"); kembalikan "nama helloServiceImpl:"+nama; } @RequestMapping (value = "/servicehead", Method = requestMethod.head) Public String HelloService (@RequestHeader nama string, @Requestheader kata sandi string) {sleep ("header"); mengembalikan "nama helloServiceHead:"+nama+"kata sandi:"+kata sandi; } @RequestMapping (value = "/servicePost", Method = requestMethod.post) Public String HelloService (@RequestBody UserDemo userDemo) {sleep ("post"); kembalikan userdemo.tostring (); }} Anotasi berikut yang perlu diperhatikan tidak dapat dihilangkan.
@RequestParam: Anotasi yang menunjukkan bahwa parameter metode harus terikat pada parameter permintaan web
@RequestBody: Anotasi yang menunjukkan MethodParameter harus terikat pada badan permintaan web.
@Requestheader: Anotasi yang menunjukkan bahwa parameter metode harus terikat ke header permintaan web.
Jika anotasi di atas tidak ada, meskipun layanan tidak akan melaporkan kesalahan setelah dijalankan, ia tidak dapat memperoleh parameter entri.
Proyek Penelepon Layanan:
<dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-feign </stifactid> </dependency>
Petana hanya bergantung di sini, bukan Pita dan Hystrix.
application.yml:
server: port: 9051 spring: application: name: demo-feign-freeconsumer eureka: client: serviceUrl: defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/ feign: hystrix: enabled: true #Ribbon Timeout Setting#ribbon: # ConnectTimeout: 500 # ReadTimeout: 3000
Konfigurasi Hystrix telah menipu saya untuk waktu yang lama. Spring Cloud yang saya gunakan adalah Dalston Version SR1, yang lebih baru dari versi materi lain di Internet. Karena dalam versi baru, dukungan Pisau untuk Hystrix dimatikan secara default, jadi Anda harus secara manual menyalakan fign.hystrix.enabled = true melalui konfigurasi, sehingga penurunan peringkat layanan dan fungsi lainnya akan efektif.
Program Starter Aplikasi
@SpringbootApplication @EnableeureKaclient @EnableFeignClients kelas publik DemofeignApplication {public static void main (string [] args) {springApplication.run (demofeignApplication.class, args); }} Perhatikan bahwa ada jebakan lain di sini. Saya menggunakan @springbootApplication+ @enableeureKaClient bukan @springcloudApplication, karena yang terakhir berisi @EnableCircuTbreaker, dan @EnableCircuTbreaker adalah konten dalam paket Hystrix. Pom saya tidak memperkenalkan Hystrix. Jadi Spring Cloud masih memiliki kekurangan dalam hal ini. Anda tidak akan melaporkan kesalahan dengan secara langsung dikompilasi dengan @springcloudApplication, tetapi tidak dapat dimulai. Tentu saja, protagonis di sini masih merupakan anotasi @enablefeignclients.
Kode Klien Inti
@FeignClient (name = "Demo-Feign-Freeservice", Fallback = Demofeignfallback.class) Antarmuka Publik DemofeignService {@RequestMapping (value = "/Petchign-Service/ServiceGet", Method = RequestMethod) String HelloService (@ReQuestParam ("Name") Name; @RequestMapping (value = "/Pisit-Service/ServiceHead", Method = requestMethod.head) String HelloService (@Requestheader ("Name") Name String, @Requestheader ("Kata Sandi") Kata sandi string); @RequestMapping (value = "/Pisau-Service/ServicePost", Method = requestMethod.post) String HelloService (@RequestBody userDemo userDemo); } Anotasi @FeignClient mendefinisikan bahwa antarmuka adalah klien kepura -pura, nama menentukan nama layanan yang terdaftar di Eureka, dan Fallback adalah kelas implementasi antarmuka setelah layanan diturunkan peringkatnya.
@RequestMapping menentukan metode permintaan URL dan HTTP relatif dari permintaan, yang sesuai dengan server satu per satu. @RequestParam,
Anotasi @RequestBody dan @Requestheader memiliki lebih banyak atribut nilai daripada server. Mereka tidak dapat dihilangkan di sini. Mereka perlu secara eksplisit menginformasikan kepada klien kepura -pura bagaimana cara menyesuaikan parameter.
Kode Layanan Downgrade:
@Component kelas publik Demofeignfallback mengimplementasikan DemofeignService {@Override public string helloService (nama string) {return "get error"; } @Override Public String HelloService (nama string, string password) {return "head error"; } @Override Public String HelloService (userDemo userDemo) {return "post error"; }} Saya menemukan bahwa saya sengaja menghapus anotasi @RequestParam, @RequestBody, dan @Requestheader dalam parameter entri di sini, karena signifikansi penting dari anotasi ini adalah bahwa berpura -pura menggunakan parameter ke http ketika melakukan panggilan layanan mikro, tetapi penurunan layanan tidak akan membuat http di sini.
Kode Pengontrol:
@RestController kelas publik DemofeignController {@Autowired Private DEMOFeignService DemofeignService; @RequestMapping (value = "/test", Method = requestMethod.get) public String demoserVicetest () {StringBuffer SB = New StringBuffer (); SB.Append (Demofeignservice.HelloService ("Yuanyuan")); SB.Append ("/n"); SB.Append (Demofeignservice.HelloService ("yjt", "xixihaha")); SB.Append ("/n"); SB.Append (Demofeignservice.HelloService (UserDemo baru ("yejingtao", "123456")))); return sb.tostring (); }}Mari kita lihat efeknya:
Layanan kami tidak berkurang, ketiga metode itu normal, tetapi permintaan kepala tidak mendapatkan nilai pengembalian. Ini ditentukan oleh karakteristik Metode Kepala Permintaan HTTP. Kepala tidak mengembalikan tubuh respons, dan umumnya digunakan untuk pengujian konektivitas.
Mari kita lihat set lain:
Metode kepala dan pasca permintaan telah diproses selama lebih dari 2000ms, dan layanan diturunkan peringkatnya, dan implementasinya digantikan oleh kelas pemrosesan fallback.
Dalam kasus satu, kami selalu memiliki perasaan bahwa ada kode duplikat antara penyedia layanan dan penelepon layanan. Bisakah itu dioptimalkan? Silakan lihat Kasus 2.
Kasus 2:
Pusat Pendaftaran Eureka: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
API Antarmuka: https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceapi
Penyedia Layanan: https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceImpl
Penelepon Layanan: https://github.com/yejingtao/forblog/tree/master/demo-feign-apicconsumer
Perubahan terbesar dalam kasus 2 adalah menulis kemampuan layanan secara terpisah ke dalam proyek API, dan baik penelepon dan penyedia POM mengandalkan API ini.
API:
antarmuka publik HelloService {@RequestMapping (value = "/fign-service/serviceGet", method = requestMethod.get) string helloService (@RequestParam ("name") name string); @RequestMapping (value = "/Pisit-Service/ServiceHead", Method = requestMethod.head) String HelloService (@Requestheader ("Name") Name String, @Requestheader ("Kata Sandi") Kata sandi string); @RequestMapping (value = "/Pisau-Service/ServicePost", Method = requestMethod.post) String HelloService (@RequestBody userDemo userDemo); } Penyedia Layanan:
@RestController kelas publik HelloServiceContorller mengimplementasikan HelloService {private Logger Logger = LoggerFactory.getLogger (this.getClass ()); private void sleep (string methodName) {int sleepminTime = new random (). nextInt (3000); Logger.info ("HelloService"+MethodName+"SleepMinTime:"+sleepminTime); coba {thread.sleep (sleepminTime); } catch (InterruptedException e) {E.PrintStackTrace (); }} @Override Public String HelloService (@RequestParam ("Name") Name) {sleep ("get"); kembalikan "nama helloServiceImpl:"+nama; } @Override Public String HelloService (@Requestheader ("Name") Name String, @Requestheader ("Kata Sandi") Kata sandi string) {sleep ("header"); mengembalikan "nama helloServiceHead:"+nama+"kata sandi:"+kata sandi; } @Override Public String HelloService (@RequestBody UserDemo userDemo) {sleep ("Post"); kembalikan userdemo.tostring (); }} Penelepon Layanan:
@FeignClient (name = "Demo-Feign-ServiceImpl", Fallback = FignserviceFallback.class) Antarmuka Publik Petana Petchignservice Memperluas HelloService {}Kode lain pada dasarnya tetap tidak berubah, dan efeknya sama.
Dua gaya memiliki kelebihan dan kekurangannya sendiri: Freestyle lebih gratis, dan metode baru yang ditambahkan ke server tidak akan mempengaruhi kode klien. Kerugiannya adalah bahwa kemampuan layanan tidak disinkronkan dan perubahan kemampuan layanan akan menyebabkan kelainan; Kemampuan layanan klien server format API disinkronkan, tetapi perubahan antarmuka memerlukan modifikasi kode di kedua sisi, dan Anda harus mempertimbangkannya dengan jelas saat membangunnya.
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.