Berbagi teknologi

SpringCloud--Kluster Eureka

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Cluster pusat pendaftaran Eureka

Mengapa mengelompok

Jika hanya ada satu server pusat registrasi, maka akan terjadi satu titik kegagalan dan tidak dapat diproses dengan konkurensi tinggi, sehingga diperlukan cluster.

Bagaimana mengelompokkan

Siapkan tiga EurekaServer untuk mendaftar satu sama lain, artinya setiap EurekaServer harus mendaftar dengan semua EureakServer, termasuk dirinya sendiri. Layanan mikro kami yang lain (pesanan, pengguna) hanya perlu mengarahkan alamat pendaftaran ke semua Server Eureka.

Kode:

Yang digunakan di sini adalah modul Eureka, yang mengonfigurasi beberapa file yml untuk mencapai efek pengelompokan.

Kelas permulaan

  1. package org.example;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. /**
  6. * @ClassName EurekaStart
  7. * @Author 23
  8. * @Date 2024/7/10 19:12
  9. * @Version 1.0
  10. * @Description TODO
  11. **/
  12. @SpringBootApplication
  13. @EnableEurekaServer
  14. public class EurekaStart {
  15. public static void main(String[] args) {
  16. SpringApplication.run(EurekaStart.class,args);
  17. }
  18. }

bahasa inggris

  1. spring:
  2. profiles:
  3. active: peer3
  4. ---
  5. spring:
  6. profiles: peer1
  7. application:
  8. name: Eureka1
  9. eureka:
  10. instance:
  11. hostname: localhost
  12. client:
  13. serviceUrl:
  14. defaultZone: http://localhost:10070/eureka/
  15. server:
  16. port: 10070
  17. ---
  18. spring:
  19. profiles: peer2
  20. application:
  21. name: Eureka2
  22. eureka:
  23. instance:
  24. hostname: localhost
  25. client:
  26. serviceUrl:
  27. defaultZone: http://localhost:10071/eureka/
  28. server:
  29. port: 10071
  30. ---
  31. spring:
  32. profiles: peer3
  33. application:
  34. name: Eureka3
  35. eureka:
  36. instance:
  37. hostname: localhost
  38. client:
  39. serviceUrl:
  40. defaultZone: http://localhost:10072/eureka/
  41. server:
  42. port: 10072

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.example</groupId>
  6. <artifactId>Springcloud-Netflix</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <artifactId>Eureka-Service</artifactId>
  10. <packaging>jar</packaging>
  11. <name>Eureka-Service</name>
  12. <url>http://maven.apache.org</url>
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>junit</groupId>
  19. <artifactId>junit</artifactId>
  20. <version>3.8.1</version>
  21. <scope>test</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. </dependency>
  31. <!-- Eureka服务端支持 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  35. </dependency>
  36. </dependencies>
  37. </project>

Penyeimbangan beban layanan

Mengapa penyeimbangan beban diperlukan

Untuk menyediakan konkurensi, terkadang penyedia layanan yang sama dapat menyebarkan beberapa (layanan komoditas). Klien ini harus menyelesaikan panggilan beban sesuai dengan strategi penyeimbangan tertentu yang bertanggung jawab saat melakukan panggilan.

Konfigurasi penyedia layanan

  1. spring:
  2. profiles:
  3. active: order2
  4. ---
  5. server:
  6. port: 10010
  7. spring:
  8. profiles: order1
  9. application:
  10. name: order-service
  11. eureka:
  12. client:
  13. service-url:
  14. defaultZone: http://localhost:10072/eureka
  15. instance:
  16. prefer-ip-address: true
  17. ---
  18. server:
  19. port: 10012
  20. spring:
  21. profiles: order2
  22. application:
  23. name: order-service
  24. eureka:
  25. client:
  26. service-url:
  27. defaultZone: http://localhost:10072/eureka
  28. instance:
  29. prefer-ip-address: true

Teknologi implementasi penyeimbangan beban yang umum

Pita

Melalui RestTmplate, selesaikan panggilan layanan dengan url

Implementasi kode (sisi konsumen layanan):

  1. package org.example.Controller;
  2. import org.example.domain.Order;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.cloud.client.ServiceInstance;
  5. import org.springframework.cloud.client.discovery.DiscoveryClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.springframework.web.client.RestTemplate;
  11. import java.util.Arrays;
  12. import java.util.List;
  13. /**
  14. * @ClassName UserController
  15. * @Author 23
  16. * @Date 2024/7/10 18:52
  17. * @Version 1.0
  18. * @Description TODO
  19. **/
  20. @RestController
  21. @RequestMapping("/User")
  22. public class UserControllerrlb {
  23. @Autowired
  24. private RestTemplate restTemplate;
  25. // @Autowired
  26. // private DiscoveryClient discoveryClient;
  27. @GetMapping("/getOrder/{id}")
  28. public List<Order> getOrderById(@PathVariable("id") Integer id) {
  29. // Order[] order = restTemplate.getForObject("http://localhost:10010/OrderService/user/" + id, Order[].class);
  30. // return Arrays.asList(order);
  31. // List<ServiceInstance> instances=discoveryClient.getInstances("order-service");//通过服务的名字去获取服务实例
  32. // ServiceInstance serviceInstance=instances.get(0);//定死只获取第一个服务实例对象
  33. // String ip=serviceInstance.getHost();//获取服务对象ip
  34. // int port=serviceInstance.getPort();//获取获取的实例对象的服务端口号
  35. Order[] orders=restTemplate.getForObject("http://Order-Service/OrderService/user/"+id,Order[].class);
  36. return Arrays.asList(orders);
  37. }
  38. }

Panggilan penyeimbangan beban pita

Ribbon adalah proyek open source layanan lapisan tengah cloud yang dirilis oleh Netflix. Fungsi utamanya adalah menyediakan algoritma penyeimbangan beban klien. Komponen klien Ribbon menyediakan serangkaian item konfigurasi lengkap, seperti batas waktu koneksi, coba lagi, dll. Sederhananya, Ribbon adalah penyeimbang beban klien. Kita dapat mencantumkan semua mesin di belakang penyeimbang beban di file konfigurasi, dan Ribbon akan secara otomatis membantu Anda terhubung berdasarkan aturan tertentu (seperti polling sederhana, koneksi acak, dll.) Untuk ini mesin, kita dapat dengan mudah menggunakan Ribbon untuk mengimplementasikan algoritma penyeimbangan beban khusus. Ribbon adalah penyeimbang beban klien yang dapat menyelesaikan panggilan penyeimbangan beban untuk beberapa contoh layanan dari suatu layanan sesuai dengan aturan tertentu.

Skema:

Penyeimbangan beban OpenFeign

OpenFeign adalah klien Layanan Web deklaratif yang tujuannya adalah membuat panggilan Layanan Web menjadi lebih mudah. Feign menyediakan templat antarmuka untuk permintaan HTTP (alamat akses ditandai di atasnya). Dengan menulis antarmuka sederhana dan memasukkan anotasi, Anda dapat menentukan parameter, format, alamat, dan informasi lain dari permintaan HTTP. OpenFeign akan sepenuhnya mem-proxy (proksi dinamis) permintaan HTTP. Kita hanya perlu memanggilnya seperti metode untuk menyelesaikan permintaan layanan dan pemrosesan terkait. Feign mengintegrasikan Ribbon dan Hystrix (kita akan membicarakan Hystrix nanti), sehingga kita tidak perlu lagi menggunakan kedua komponen ini secara eksplisit.

Strategi penyeimbangan beban

Aturan IR

Dengan mengonfigurasi subkelas IRule yang berbeda, Anda dapat memilih strategi penyeimbangan beban yang berbeda, yaitu memilih layanan dari daftar layanan dengan strategi khusus untuk menyelesaikan panggilan. Tentu saja bisa juga disesuaikan. Oleh karena itu, strategi penyeimbangan beban dapat dibagi menjadi strategi bawaan dan strategi khusus.

Strategi penyeimbangan beban bawaan