Condivisione della tecnologia

SpringCloud: cluster Eureka

2024-07-12

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

Cluster del centro di registrazione Eureka

Perché raggrupparsi

Se è presente un solo server del centro di registrazione, sarà presente un singolo punto di errore e non potrà essere elaborato con elevata concorrenza, pertanto è necessario un cluster.

Come raggruppare

Preparare tre EurekaServer per registrarsi tra loro, il che significa che ogni EurekaServer deve registrarsi con tutti gli EureakServer, incluso se stesso. Ogni EurekaServer agisce sia come server che come client. Gli altri nostri microservizi (ordine, utente) devono solo indirizzare l'indirizzo di registrazione a tutti gli EurekaServer.

Codice:

Ciò che viene utilizzato qui è un modulo Eureka, che configura più file yml per ottenere l'effetto del clustering.

Classe di avvio

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

piccolo formato

  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>

Bilanciamento del carico del servizio

Perché è necessario il bilanciamento del carico

Per garantire la concorrenza, a volte lo stesso fornitore di servizi può distribuirne più (servizi di base). Questo client deve completare la chiamata di carico secondo una determinata strategia di bilanciamento responsabile durante la chiamata.

Configurazione del fornitore di servizi

  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

Tecnologie comuni di implementazione del bilanciamento del carico

Nastro

Tramite RestTmplate, completa la chiamata di servizio con l'URL

Implementazione del codice (lato consumatore del servizio):

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

Chiamata di bilanciamento del carico della barra multifunzione

Ribbon è un progetto open source del servizio di livello intermedio cloud rilasciato da Netflix. La sua funzione principale è fornire un algoritmo di bilanciamento del carico del client. Il componente client della barra multifunzione fornisce una serie di elementi di configurazione completi, come timeout della connessione, nuovo tentativo, ecc. In poche parole, Ribbon è un bilanciatore del carico del client. Possiamo elencare tutte le macchine dietro il bilanciatore del carico nel file di configurazione e Ribbon ti aiuterà automaticamente a connetterti in base a determinate regole (come polling semplice, connessioni casuali, ecc.) Per queste. macchine, possiamo facilmente utilizzare Ribbon per implementare algoritmi di bilanciamento del carico personalizzati. La barra multifunzione è un bilanciatore del carico client in grado di completare le chiamate di bilanciamento del carico per più istanze di un servizio in base a determinate regole. Queste regole supportano anche la personalizzazione.

Schema:

Bilanciamento del carico OpenFeign

OpenFeign è un client di servizi Web dichiarativo il cui scopo è semplificare le chiamate ai servizi Web. Feign fornisce un modello di interfaccia per le richieste HTTP (su di esso è indicato l'indirizzo di accesso). Scrivendo una semplice interfaccia e inserendo annotazioni, è possibile definire i parametri, il formato, l'indirizzo e altre informazioni della richiesta HTTP. OpenFeign eseguirà completamente il proxy delle richieste HTTP (proxy dinamico). Dobbiamo solo chiamarlo come un metodo per completare la richiesta di servizio e la relativa elaborazione. Feign integra Ribbon e Hystrix (di Hystrix parleremo più avanti), in modo che non abbiamo più bisogno di utilizzare questi due componenti esplicitamente.

Strategia di bilanciamento del carico

Io domino

Configurando diverse sottoclassi IRule, è possibile scegliere diverse strategie di bilanciamento del carico, ovvero selezionare un servizio dall'elenco dei servizi con una strategia specifica per completare la chiamata. Naturalmente può anche essere personalizzato. Pertanto, le strategie di bilanciamento del carico possono essere suddivise in integrate e personalizzate.

Strategia di bilanciamento del carico integrata