Kali ini saya berbagi dengan Anda cara mengkonsumsi layanan. Artikel sebelumnya berbicara tentang penggunaan Petchign untuk konsumsi, artikel ini menggunakan layanan konsumsi REST+Pita, dan menyesuaikan komponen konsumsi sederhana melalui pemungutan suara. Tujuan artikel ini adalah: Gagasan menyesuaikan layanan konsumsi; Jika ada keuntungan, tolong "suka":
Istirahat+Pita mewujudkan layanan konsumen
Sebagai konsumen layanan, kami telah membuat dua proses utama untuk membedakan antara 1) memperoleh layanan dan 2) layanan panggilan. Jadi bagaimana cara mendapatkan layanan dan apa yang akan dihubungi layanan? Mari kita lihat diagram manual di bawah ini:
Dapat dilihat dari diagram manual bahwa konsumen terlebih dahulu memperoleh alamat antarmuka nyata dari penyedia layanan, dan kemudian memanggil antarmuka melalui alamat; Kemudian untuk arsitektur Microservice, jelas tidak disarankan untuk mendapatkan IP atau port kelas tertentu dan kemudian memanggil antarmuka, sehingga konsep serviceID telah muncul dalam layanan mikro; Proses sederhana telah diperkenalkan, dan berikut ini adalah contoh untuk menganalisisnya; Pertama tambahkan dependensi seperti:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency>
Mari kita gunakan eureka_server (pusat layanan) dan eureka_provider (penyedia layanan) yang dibangun dalam artikel sebelumnya untuk melakukan kasus uji. Di sini saya mendefinisikan kembali modul eureka_consumer_ribbon sebagai layanan konsumen; Pertama -tama buat kelas dan kode lapisan layanan:
@ServICEPublic UsersEver UserService mengimplementasikan UserInterface {@Autowired dilindungi restTemplate restTemplate; @Override public morp <list <mouser>> getUsers (morq rq) {return null; } @Override public string getMsg () {string str = restTemplate.getForObject ("http: // eureka-provider/msg", string.class); mengembalikan str; }}Terutama gunakan fungsi resttemplate.getForObject dari restTemplate, dan kemudian Anda perlu mendefinisikan pengontrol untuk menanggapi data yang diperoleh pada halaman. Untuk kesederhanaan, cukup gunakan antarmuka layanan GETMSG untuk menguji:
@RestControllerPublic kelas UserController {@Autowired Private UserService UserserService; @GetMapping ("/msg") public string getMsg () {return userservice.getmsg (); }}Akhirnya, kami menambahkan kode berikut ke kelas startup. Perhatikan bahwa tag @Loadalanced harus ditambahkan, karena ketergantungan eureka yang kami perkenalkan berisi pita (versi dalston.release). Pita merangkum algoritma penyeimbangan beban. Jika anotasi ini tidak ditambahkan, URL dari metode sisanya harus menjadi jalur URL yang tersedia. Tentu saja, jika anotasi ditambahkan di sini, Anda dapat menggunakan layanan yang disebutkan di atas:
@SpringbootApplication @enableDiscoveryclient // Klien Klien Klien Klien Publik EureKaconsumerBbonApplication {@bean @LoadBalAnded // Load Balancing RestTemplate restTemplate () {return new resttemplate (); } public static void main (string [] args) {springApplication.run (eureKaconsumerbbonApplication.class, args); }}Berikut ini adalah efek yang ditampilkan oleh konsumen:
Istirahat+Polling Komponen Konsumsi Sederhana Kustom
Komponen konsumsi khusus hampir sama dengan gambar manual wajah. Ini pertama -tama mendapatkan alamat antarmuka nyata dari penyedia layanan, dan kemudian hubungi URL melalui istirahat untuk mendapatkan hasil hasil yang sesuai; Berikut adalah kelas komponen shenniubanlance:
/** * Dibuat oleh Shenniu pada 2018/6 * <p> * REST+EUREKA+Klien Kustom */ @ComponentPublic Class ShenniubanLance {@Autowired Private RestTemplate RestTemplate; @Autowired Private Discoveryclient Discoveryclient; / ** * Layanan Alamat Nyata ConcurrenthashMap <"nama aplikasi layanan", ("IP Antarmuka Nyata", Jumlah Kunjungan)> */ Public Static ConcurrhentHashMap <String, List <Moservice>> ServicesMap = ConcurrentHashMap baru <> (); /** * Tetapkan informasi penyedia layanan ke peta */public void setServicesMap () {// Dapatkan semua Daftar Aplikasi Penyedia Layanan <string> appNames = DiscoveryClient.GetServices (); // penyimpanan alamat nyata untuk memetakan (string appname: appnames) {// Dapatkan informasi dari daftar penyedia layanan <serviceInstance> instanceInfos = DiscoveryClient.getInstances (AppName); if (instanceInfos.isempty ()) {lanjutan; } Daftar <Moservice> layanan = ArrayList baru <> (); instanceInfos.foreach (b -> {moservice service = new moservice (); // Jumlah layanan yang diakses.setWatch (0l); // layanan alamat antarmuka nyata.setUrl (b.geturi (). toString ()); services.add (service);}); // Jika ada, perbarui servicesmap.put (appname.tolowercase (), layanan); }} / ** * Layanan yang dipilih sesuai dengan aplikasi * * @param appname * @return * / public moservice choiceserviceByappname (string appname) melempar pengecualian {appname = appname.tolowercase (); // Beberapa Daftar Koleksi Layanan Layanan Aplikasi <Moservice> serviceMap = servicesMap.get (AppName); if (serviceMap == null) {// inisialisasi semua layanan aplikasi setServicesMap (); serviceMap = servicesMap.get (AppName); if (serviceMap == null) {lempar pengecualian baru ("gagal menemukan" + appname + "layanan terkait"); }} // Saring metode polling layanan dengan jumlah terkecil kunjungan moservice moservice = serviceMap.stream (). Min (comparator.cparing (moservice :: getWatch)) .get (); // Load Record +1 Moservice.SetWatch (moservice.getWatch () + 1); mengembalikan moservice; } / ** * Secara otomatis menyegarkan informasi penyedia layanan ke peta * / @scheduled (fixedDelay = 1000 * 10) public void refreshServicesMap () {setServicesMap (); } / ** * Dapatkan Layanan Permintaan untuk mendapatkan data pengembalian * * @param Appname Nama Aplikasi Aplikasi coba {// filter untuk mendapatkan layanan moservice layanan nyata = choiceserviceByappname (appname); // Minta URL Layanan String APIURL = Service.getUrl () + "/" + ServiceName; System.out.println (APIURL); Hasil = Peta! = NULL? resttemplate.getForObject (apiurl, tclass, peta): resttemplate.getForObject (apiurl, tclass); } catch (exception ex) {ex.printstacktrace (); } hasil pengembalian; } / *** Informasi Layanan* / Kelas Publik Moservice { / *** Jumlah catatan beban* / Watch Private Long; /** * Alamat Antarmuka Nyata: http://xxx.com/api/add */private string url; Public Long GetWatch () {Return Watch; } public void setWatch (Long Watch) {this.watch = watch; } public String getUrl () {return url; } public void setUrl (string url) {this.url = url; }}}Di atas adalah kode implementasi utama. Logika Kode: Tetapkan informasi penyedia layanan ke MAP-》 Menurut aplikasi untuk mendapatkan metode pemungutan suara, Layanan-》 meminta layanan untuk mendapatkan data pengembalian; Prinsip implementasi pemungutan suara adalah menggunakan nomor catatan beban, yang secara otomatis +1 setelah setiap permintaan. Ketika Anda ingin mendapatkan penyedia layanan tertentu, contoh dari nilai minimum disaring melalui nomor catatan, dan URL alamat antarmuka nyata disimpan; Panggilan hanya perlu seperti ini (tentu saja, itu dapat disebut sebagai anotasi):
@Override public string getMsg () {string str = BanLance.getServicedata ("eureka-provider", "msg", null, string.class); mengembalikan str; }Perlu dicatat di sini bahwa kami menambahkan anotasi @Load-seimbang di restemplate sebelumnya, sehingga permintaan sisanya harus diakses dalam non-IP (yaitu, serviceId) untuk merespons secara normal, jika tidak kesalahan akan diminta seperti:
Sederhananya, Anda tidak perlu menggunakan IP lagi karena ada mekanisme penyeimbang beban; Ketika kami menghapus anotasi ini, komponen kami yang disesuaikan akan dapat berjalan dengan sukses, dan renderingnya sama dengan yang ada di Contoh 1, dan peta tidak akan melekat;
Refresh Informasi Penyedia Layanan Menggunakan Terjadwal
Dalam arsitektur Microservice, jika suatu layanan digantung, informasi cache layanan klien harus diperbarui tepat waktu, jika tidak, ia dapat meminta URL bawah. Berdasarkan pertimbangan ini, saya menggunakan tag yang diaktifkan untuk melakukan penyegaran waktunya; Pertama, tambahkan @enablesceduling ke kelas startup, dan kemudian tentukan layanan yang mem -flash informasi layanan seperti:
/ ** * Secara otomatis menyegarkan informasi penyedia layanan ke peta */ @scheduled (fixedDelay = 1000 * 10) public void RefreshServicesMap () {setServicesMap (); }Untuk memfasilitasi efek uji, ketika server, penyedia (2), dan konsumen telah dimulai, kami memulai layanan penyedia dengan Port 2005; Kemudian menyegarkan antarmuka konsumen untuk melihat efeknya:
Pada saat ini, Anda dapat melihat bahwa antarmuka yang memanggil port 2005 telah berhasil dipanggil. Setelah layanan terbaru atau tidak valid ditambahkan ke layanan waktu @scheduled, itu akan memenuhi kebutuhan apa yang Anda butuhkan; Jika Anda pikir konten ini bermanfaat bagi Anda, tolong sukai, terima kasih. Saya berharap ini akan membantu untuk pembelajaran semua orang, dan saya harap semua orang akan lebih mendukung wulin.com.