Ketika beberapa instans layanan berjalan di balik satu nama layanan, konsumen memerlukan cara untuk mendistribusikan permintaan di antara instans tersebut. Aplikasi Spring Cloud pada Enterprise Distributed Application Service (EDAS) menggunakan Ribbon untuk load balancing sisi klien. Ribbon mengintersepsi panggilan layanan yang dilakukan melalui RestTemplate dan Feign, lalu mendistribusikan permintaan ke instans yang terdaftar di Nacos.
Cara kerja
Nacos bertindak sebagai service registry. Ketika konsumen layanan memanggil penyedia dengan nama (misalnya, http://service-provider/query), Ribbon menyelesaikan nama tersebut menjadi daftar instans yang terdaftar dan mendistribusikan permintaan di antara mereka.
Nacos mengimplementasikan antarmuka standar com.netflix.loadbalancer.ServerList melalui NacosServerList. Alat penemuan layanan lainnya juga mengimplementasikan antarmuka yang sama:
| Service discovery tool | ServerList implementation |
|---|---|
| Nacos | NacosServerList |
| Eureka | DomainExtractingServerList |
| Consul | ConsulServerList |
| ZooKeeper | ZookeeperServerList |
Karena semua implementasi berbagi antarmuka ini, beralih dari Eureka, Consul, atau ZooKeeper ke Spring Cloud Alibaba tidak memerlukan perubahan pada kode RestTemplate, Feign, atau AsyncRestTemplate yang sudah tidak digunakan lagi.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi Spring Cloud yang dideploy di EDAS dengan Nacos sebagai service registry
Setidaknya satu penyedia layanan dan satu konsumen layanan
(Opsional) Dependensi Hystrix ditambahkan ke konsumen Anda untuk memastikan kompatibilitas antara EDAS dan Hystrix. Fitur ini mendukung atribut fallback. Hal ini juga dapat diimplementasikan oleh Sentinel
Aplikasi contoh
Unduh proyek demo berikut untuk mengikuti langkah-langkahnya:
Tambahkan load balancing ke RestTemplate
RestTemplate adalah klien HTTP Spring untuk layanan RESTful. Tambahkan anotasi @LoadBalanced ke bean RestTemplate untuk mengaktifkan load balancing sisi klien.
public class MyApp {
// Anotasi @LoadBalanced menambahkan LoadBalancerInterceptor ke RestTemplate ini.
// LoadBalancerInterceptor menggunakan RibbonLoadBalancerClient untuk mendistribusikan permintaan
// ke instans layanan yang terdaftar di Nacos.
@Autowired
private RestTemplate restTemplate;
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
// Gunakan nama layanan ("service-provider") alih-alih hostname.
// Ribbon menyelesaikannya ke instans yang tersedia.
public void doSomething() {
Foo foo = restTemplate.getForObject("http://service-provider/query", Foo.class);
doWithFoo(foo);
}
...
}@LoadBalancedpada metode@BeanmendaftarkanLoadBalancerInterceptoryang mengarahkan permintaan melaluiRibbonLoadBalancerClient.Gunakan nama layanan (misalnya,
service-provider) sebagai hostname dalam URL. Ribbon menggantinya dengan alamat IP dan port dari instans yang tersedia.
Tambahkan load balancing ke Feign
Feign adalah klien HTTP deklaratif yang menyederhanakan panggilan API RESTful. Load balancing bekerja secara otomatis ketika klien Feign mereferensikan nama layanan yang terdaftar di Nacos.
Langkah 1: Aktifkan Feign
Tambahkan
@EnableFeignClientske kelas aplikasi Spring Boot Anda:@SpringBootApplication @EnableFeignClients public class MyApplication { ... }Langkah 2: Definisikan antarmuka klien Feign
Buat antarmuka yang dianotasi dengan
@FeignClient. Atur parameternameke nama layanan target:@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); }Langkah 3: Inject dan panggil klien Feign
Inject antarmuka tersebut dan panggil metodenya. Setiap panggilan memicu permintaan HTTP ke salah satu instans
service-provider:public class MyService { @Autowired private EchoService echoService; public void doSomething() { // Setara dengan GET http://service-provider/echo/test // Ribbon memilih instans dari Nacos dan mengarahkan permintaan. echoService.echo("test"); } ... }
Verifikasi load balancing
Setelah layanan service-consumer dan beberapa layanan service-provider dijalankan, akses URL yang disediakan oleh service-consumer untuk memeriksa apakah load balancing telah diimplementasikan.
RestTemplate
Akses
/echo-rest/rest-testbeberapa kali dan periksa apakah permintaan diteruskan ke instans yang berbeda.Feign
Akses
/echo-feign/feign-testbeberapa kali dan periksa apakah permintaan diteruskan ke instans yang berbeda.