Обмен технологиями

SpringCloud — кластер Эврика

2024-07-12

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

Кластер регистрационного центра Эврика

Зачем кластеризовать

Если есть только один сервер центра регистрации, будет одна точка отказа, и ее невозможно будет обработать с высоким параллелизмом, поэтому требуется кластер.

Как кластеризовать

Подготовьте три сервера EurekaServer для регистрации друг с другом. Это означает, что каждый сервер EurekaServer должен зарегистрироваться на всех серверах EurekaServer, включая самого себя. Каждый сервер EurekaServer действует как сервер и клиент. Остальным нашим микросервисам (заказ, пользователь) нужно только указать адрес регистрации всем EurekaServers.

Код:

Здесь используется модуль Eureka, который настраивает несколько файлов yml для достижения эффекта кластеризации.

Стартап-класс

  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>

Балансировка нагрузки сервиса

Зачем нужна балансировка нагрузки

Чтобы обеспечить параллелизм, иногда один и тот же поставщик услуг может развернуть несколько (товарных сервисов). Этот клиент должен завершить вызов нагрузки в соответствии с определенной стратегией ответственной балансировки при вызове.

Конфигурация поставщика услуг

  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

Общие технологии реализации балансировки нагрузки

Лента

Через RestTmplate завершите вызов службы с помощью URL-адреса.

Реализация кода (сторона потребителя сервиса):

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

Вызов балансировки нагрузки ленты

Ribbon — это проект облачной службы среднего уровня с открытым исходным кодом, выпущенный Netflix. Его основная функция — предоставить алгоритм балансировки нагрузки клиента. Клиентский компонент ленты предоставляет ряд полных элементов конфигурации, таких как время ожидания соединения, повторная попытка и т. д. Проще говоря, Ribbon — это клиентский балансировщик нагрузки. Мы можем перечислить все машины, стоящие за балансировщиком нагрузки, в файле конфигурации, и Ribbon автоматически поможет вам подключиться на основе определенных правил (таких как простой опрос, случайные соединения и т. д.). машинах, мы можем легко использовать Ribbon для реализации пользовательских алгоритмов балансировки нагрузки. Лента — это клиентский балансировщик нагрузки, который может выполнять вызовы балансировки нагрузки для нескольких экземпляров службы в соответствии с определенными правилами. Эти правила также поддерживают настройку.

Схема:

Балансировка нагрузки OpenFeign

OpenFeign — это декларативный клиент веб-службы, цель которого — упростить вызовы веб-службы. Feign предоставляет шаблон интерфейса для HTTP-запросов (на нем отмечен адрес доступа). Написав простой интерфейс и вставив аннотации, вы можете определить параметры, формат, адрес и другую информацию HTTP-запроса. OpenFeign будет полностью проксировать (динамический прокси) HTTP-запросы. Нам нужно только вызвать его как метод для завершения запроса на обслуживание и соответствующей обработки. Feign интегрирует Ribbon и Hystrix (о Hystrix мы поговорим позже), так что нам больше не нужно явно использовать эти два компонента.

Стратегия балансировки нагрузки

IПравило

Настраивая разные подклассы IRule, вы можете выбирать разные стратегии балансировки нагрузки, то есть выбирать службу из списка служб с определенной стратегией для завершения вызова. Конечно, его также можно настроить. Таким образом, стратегии балансировки нагрузки можно разделить на встроенные и пользовательские.

Встроенная стратегия балансировки нагрузки