Partage de technologie

SpringCloud - cluster Eureka

2024-07-12

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

Cluster du centre d'enregistrement Eureka

Pourquoi regrouper

S'il n'y a qu'un seul serveur de centre d'enregistrement, il y aura un seul point de défaillance et il ne pourra pas être traité avec une concurrence élevée, un cluster est donc requis.

Comment regrouper

Préparez trois EurekaServers pour qu'ils s'enregistrent les uns auprès des autres, ce qui signifie que chaque EurekaServer doit s'enregistrer auprès de tous les EureakServers, y compris lui-même. Chaque EurekaServer agit à la fois comme serveur et comme client. Nos autres microservices (commande, utilisateur) n'ont qu'à pointer l'adresse d'enregistrement vers tous les EurekaServers.

Code:

Ce qui est utilisé ici est un module Eureka, qui configure plusieurs fichiers yml pour obtenir l'effet de clustering.

Classe de démarrage

  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. }

yml

  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>

Équilibrage de la charge des services

Pourquoi l'équilibrage de charge est nécessaire

Afin d'assurer la concurrence, le même fournisseur de services peut parfois en déployer plusieurs (services de base). Ce client doit effectuer l'appel de charge selon une certaine stratégie d'équilibrage responsable lors de l'appel.

Configuration du fournisseur de services

  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

Technologies courantes de mise en œuvre de l'équilibrage de charge

Ruban

Via RestTmplate, complétez l'appel de service avec l'URL

Implémentation du code (côté consommateur du service) :

  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. }

Appel d’équilibrage de charge du ruban

Ribbon est un projet open source de service cloud de couche intermédiaire publié par Netflix. Sa fonction principale est de fournir un algorithme d'équilibrage de charge client. Le composant client Ribbon fournit une série d'éléments de configuration complets, tels que le délai d'expiration de la connexion, la nouvelle tentative, etc. En termes simples, Ribbon est un équilibreur de charge client. Nous pouvons lister toutes les machines derrière l'équilibreur de charge dans le fichier de configuration, et Ribbon vous aidera automatiquement à vous connecter en fonction de certaines règles (telles qu'une simple interrogation, des connexions aléatoires, etc.). machines, nous pouvons facilement utiliser Ribbon pour implémenter des algorithmes d’équilibrage de charge personnalisés. Ribbon est un équilibreur de charge client qui peut effectuer des appels d'équilibrage de charge pour plusieurs instances de service d'un service selon certaines règles. Ces règles prennent également en charge la personnalisation.

Schématique:

Équilibrage de charge OpenFeign

OpenFeign est un client de service Web déclaratif dont le but est de faciliter les appels de services Web. Feign fournit un modèle d'interface pour les requêtes HTTP (l'adresse d'accès y est marquée). En écrivant une interface simple et en insérant des annotations, vous pouvez définir les paramètres, le format, l'adresse et d'autres informations de la requête HTTP. OpenFeign proxyera complètement les requêtes HTTP (proxy dynamique). Il nous suffit de l'appeler comme une méthode pour terminer la demande de service et le traitement associé. Feign intègre Ribbon et Hystrix (nous parlerons d'Hystrix plus tard), de sorte que nous n'avons plus besoin d'utiliser explicitement ces deux composants.

Stratégie d'équilibrage de charge

Je décide

En configurant différentes sous-classes d'IRule, vous pouvez choisir différentes stratégies d'équilibrage de charge, c'est-à-dire sélectionner un service dans la liste des services avec une stratégie spécifique pour terminer l'appel. Bien entendu, il peut également être personnalisé. Par conséquent, les stratégies d’équilibrage de charge peuvent être divisées en stratégies intégrées et personnalisées.

Stratégie d'équilibrage de charge intégrée