Eureka для начала работы с Spring Cloud (1)

Spring Boot Java задняя часть Spring

Введение

Spring Cloud — это упорядоченный набор фреймворков. Он использует удобство разработки Spring Boot для тонкого упрощения разработки инфраструктуры распределенной системы, такой как регистрация обнаружения служб, центр конфигурации, шина сообщений, балансировка нагрузки, автоматический выключатель, мониторинг данных и т. д., все из которых можно сделать в Стиль разработки Spring Boot для запуска и развертывания одним щелчком мыши.

Эта статья представляет Eureka в серии Spring Cloud Getting Started для быстрого старта.

2. Краткое введение

Eureka, подмодуль Netflix, представляет собой службу на основе REST для поиска служб для обнаружения и аварийного переключения облачных служб среднего уровня.

Регистрация и обнаружение сервисов очень важны для микросервисной архитектуры. При обнаружении и регистрации службы доступ к службам можно получить, используя только идентификатор службы, не изменяя файл конфигурации вызова службы. Эта функция аналогична реестру Dubbo, например Zookeeper.

Eureka принимает архитектуру дизайна CS. Eureka Server, как сервер функции регистрации услуги, является центром регистрации услуги. Другие микросервисы в системе используют клиент Eureka для подключения к серверу Eureka и поддержания подключения пульса.

Принцип его работы следующий:

Как видно из рисунка принцип работы Eureka аналогичен Dubbo.Eureka состоит из двух компонентов: Eureka Server и Eureka Client.

Eureka Server предоставляет услугу регистрации сервисов. После запуска каждого сервисного узла служба будет зарегистрирована в Eureka Server, а в реестре служб на Eureka Server будет храниться вся доступная информация о сервисном узле.

Eureka Client — это Java-клиент, упрощающий взаимодействие с Eureka Server.Клиент также имеет встроенный балансировщик нагрузки, использующий циклический алгоритм загрузки. После запуска приложения отправьте пульс на сервер Eureka (период по умолчанию — 30 секунд). Если Eureka Server не получает пульс от узла в течение нескольких циклов пульса, Eureka Server удалит информацию об узле службы из реестра службы.

3. Создайте центр регистрации

Создайте проект Spring Boot с именем eureka-server и выполните следующие действия:

3.1 Добавить зависимости

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>Dalston.SR1</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>1.5.9.RELEASE</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>
  19. <dependencies>
  20. <!-- eureka 服务端 -->
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  24. </dependency>
  25. </dependencies>

Spring Boot и Spring Cloud имеют совместимость версий. Если указанная версия не соответствует, при запуске проекта будет сообщено об ошибке.

3.2 параметры конфигурации application.yml

  1. server:
  2. port: 9000
  3. eureka:
  4. instance:
  5. hostname: localhost # eureka 实例名称
  6. client:
  7. register-with-eureka: false # 不向注册中心注册自己
  8. fetch-registry: false # 是否检索服务
  9. service-url:
  10. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心访问地址

3.3 Включить функцию центра регистрации

добавить в класс запуска@EnableEurekaServerаннотация.

На этом подготовительная работа завершена, после запуска проекта браузер получает доступhttp://localhost:9000, просмотрите интерфейс мониторинга службы Eureka, как показано ниже:

По этому URL-адресу вы можете просмотреть соответствующую информацию службы регистрации центра регистрации. В настоящее время нет регистраций услуг, поэтому нет информации об услугах.

Пополнить:http://localhost:9000адрес доступа к интерфейсу контроля Eureka, иhttp://localhost:9000/eureka/Адрес регистрационной службы Юрика.

4. Практические упражнения

После понимания окружения Эврики нам нужно интуитивно ощутить реальную роль Эврики в реальном бою, чтобы мы могли ясно понять и изучить Эврику.

Давайте создадим еще два проекта Spring Boot, один с именем user-api, который используется для предоставления служб интерфейса, а другой с именем user-web, который используется для вызова интерфейса user-api для получения данных и взаимодействия с браузером.

Экземпляр службы порт описывать
eureka 9000 Реестр (сервер Эврика)
user-api 8081 Поставщик услуг (клиент Eureka)
user-web 80 Потребитель сервиса, взаимодействующий со стороной браузера (клиент Eureka)

3.1 Часть кода проекта user-api (услуга предоставляется)

Поскольку содержание статьи предназначено для начала работы и использования Eureka, публикуется только важный код. Для получения конкретного кода посетите адрес исходного кода, указанный ниже.

  1. Добавьте зависимости:
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <!-- eureka 客户端 -->
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-eureka</artifactId>
  9. </dependency>
  1. Параметры конфигурации:
  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: user-api
  6. eureka:
  7. instance:
  8. instance-id: user-api-8081
  9. prefer-ip-address: true # 访问路径可以显示 IP
  10. client:
  11. service-url:
  12. defaultZone: http://localhost:9000/eureka/ # 注册中心访问地址

Уведомление:http://localhost:9000/eureka/Это адрес реестра, настроенный в Разделе 3.

  1. Интерфейс сервиса:
  1. public interface UserService {
  2. public User getById(Integer id);
  3. }
  4. @Service
  5. public class UserServiceImpl implements UserService {
  6. private static Map<Integer,User> map;
  7. static {
  8. map = new HashMap<>();
  9. for (int i=1; i<6; i++) {
  10. map.put(i, new User(i,"test" +i , "pwd" + i));
  11. }
  12. }
  13. @Override
  14. public User getById(Integer id) {
  15. return map.get(id);
  16. }
  17. }
  1. @RestController
  2. @RequestMapping("/provider/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping("/get/{id}")
  7. public User get(@PathVariable("id") Integer id) {
  8. return this.userService.getById(id);
  9. }
  10. }

Примечание. Этот контроллер используется пользователем-сетью (внутренняя служба), а не вызывается браузером.

  1. Чтобы включить регистрацию службы:

добавить в класс запуска@EnableEurekaClientаннотация.

После завершения стартового проекта браузер получает доступhttp://localhost:9000Просмотрите интерфейс мониторинга службы Eureka, как показано ниже:

Как видно из рисунка, сервисная информация о пользователях зарегистрирована в сервисе Eureka.

Дополнение: На картинке выше мы также видим кучу красных шрифтов, это потому, что Эврика активировала механизм самозащиты. Когда EurekaServer теряет слишком много клиентов за короткий промежуток времени (мог произойти сбой сети), EurekaServer переходит в режим самозащиты. После входа в этот режим EurekaServer защитит информацию в реестре службы от удаления. Когда сетевой сбой будет восстановлен, EurekaServer автоматически выйдет из режима самозащиты.

3.2 Часть кода пользовательско-веб-проекта (потребление услуг)

  1. Добавьте зависимости:
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <!-- eureka 客户端 -->
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-eureka</artifactId>
  9. </dependency>
  1. Параметры конфигурации:
  1. server:
  2. port: 80
  3. spring:
  4. application:
  5. name: user-web
  6. eureka:
  7. client:
  8. register-with-eureka: false # 不向注册中心注册自己
  9. fetch-registry: true # 是否检索服务
  10. service-url:
  11. defaultZone: http://localhost:9000/eureka/ # 注册中心访问地址
  1. Клиент:
  1. @Configuration
  2. public class RestConfiguration {
  3. @Bean
  4. @LoadBalanced
  5. public RestTemplate getRestTemplate() {
  6. return new RestTemplate();
  7. }
  8. }
  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. // @RequestMapping("get/{id}")
  7. // public User get(@PathVariable("id") Integer id) throws Exception {
  8. // // 没有使用 Eureka 时,uri 为消息提供者的地址,需要指定 ip 和 端口
  9. // return restTemplate.getForObject(new URI("http://localhost:8081/provider/user/get/" + id), User.class);
  10. // }
  11. @Autowired
  12. private DiscoveryClient client;
  13. @RequestMapping("get/{id}")
  14. public User get(@PathVariable("id") Integer id) throws Exception {
  15. List<ServiceInstance> list = this.client.getInstances("USER-API");
  16. String uri = "";
  17. for (ServiceInstance instance : list) {
  18. if (instance.getUri() != null && !"".equals(instance.getUri())) {
  19. uri = instance.getUri().toString();
  20. break;
  21. }
  22. }
  23. return restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class);
  24. }
  25. }

Примечание: Это только для того, чтобы отразить эффект обнаружения службы.В фактической разработке служба запросов DiscoveryClient не используется для вызова! Что касается того, как выполнить обнаружение и вызов службы, подождите и просмотрите последующие статьи на ленте.

  1. Чтобы включить обнаружение службы:

добавить в класс запуска@EnableDiscoveryClientаннотация.

После запуска проекта используйте браузер для доступа к пользовательскому веб-интерфейсу проекта, и результаты будут следующими:

На данный момент демонстрация регистрации и обнаружения службы Eureka завершена.

Последующие статьи этой серии будут знакомить и практиковать на основе этого случая.

4. Кластер Эврика

Являясь центром регистрации, Эврика сохраняет актуальную информацию о системных службах, если центр регистрации зависнет, система будет парализована. Поэтому очень важно обеспечить высокую доступность кластеров Eureka.

В этом тесте используется один компьютер для развертывания кластера Eureka, а различные службы eureka различаются по имени и порту.

Эврика имя Номер порта
eureka01 9001
eureka02 9002
  1. Поскольку используется одна машина, использование двух имен также требует изменения файла хоста в папке C:\Windows\System32\drivers\etc и добавления следующей конфигурации:
  1. 127.0.0.1 eureka01
  2. 127.0.0.1 eureka02
  1. Файл application.yml необходимо изменить следующим образом:
  1. server:
  2. port: 9001
  3. eureka:
  4. instance:
  5. hostname: eureka01 # eureka 实例名称
  6. client:
  7. register-with-eureka: false # 不向注册中心注册自己
  8. fetch-registry: false # 表示自己就是注册中心
  9. service-url:
  10. defaultZone: http://eureka01:9001/eureka/,http://eureka02:9002/eureka/

Файлы конфигурации двух экземпляров службы eureka изменяются аналогичным образом, просто измените имя и порт.

  1. В проекте регистрации службы измените eureka.client.service-url.defaultZone на URL-адрес кластера.

Эффект запуска следующий:

Пять, разница между Eureka и Zookeeper

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

5.1 Теория CAP

CAP — это согласованность (строгая согласованность), доступность (доступность) и толерантность к разделу (отказоустойчивость раздела).

Теоретическое ядро: Распределенная система не может одновременно удовлетворять трем требованиям согласованности, доступности и отказоустойчивости разделов. Поэтому по принципу CAP базы данных NoSQL делятся на три категории: те, которые соответствуют принципу CA, те, которые соответствуют принципу CP, и те, которые соответствуют принципу AP:

  1. CA:单点集群,满足一致性,可用性的系统,通常在可扩展性上不高
  2. CP: 满足一致性,分区容错性的系统,通常性能不是特别高
  3. AP: 满足可用性,分区容错性的系统,通过对一致性要求较低

Проще говоря: теория CAP описывает, что в распределенной системе хранения могут быть выполнены не более двух требований.

5.2 Zookeeper гарантирует CP

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

Однако в zookeeper будет ситуация, когда мастер-нода потеряет связь с другими нодами из-за сбоя в сети, оставшиеся ноды будут переизбирать лидера. Проблема в том, что выборы лидера занимают много времени, от 30 до 120 секунд, а весь кластер zookeeper во время выборов недоступен, из-за чего служба регистрации будет парализована. В среде облачного развертывания существует высокая вероятность того, что кластер zookeeper потеряет мастер-узел из-за проблем с сетью.Хотя служба в конечном итоге может быть восстановлена, длительное время выбора, которое приводит к тому, что служба регистрации недоступна в течение длительного время нельзя терпеть.

5.3 Эврика гарантирует AP

Eureka уделяет первостепенное внимание удобству использования по дизайну. Все узлы EurekaServer равны.Отказ нескольких узлов не повлияет на работу обычных узлов.Остальные узлы по-прежнему могут предоставлять услуги регистрации и обнаружения.

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

Кроме того, EurekaServer также имеет механизм самозащиты.Если более 85% узлов не имеют нормального биения в течение 15 минут, то EurekaServer будет думать, что произошел сбой сети между клиентом и реестром.В это время , может возникнуть несколько ситуаций. :

  1. EurekaServer 不再从注册列表中移除因为长时间没有收到心跳而应该过期的服务
  2. EurekaServer 仍然能够接收新服务的注册和查询请求,但不会被同步到其他节点上
  3. 当网络稳定时,当前 EurekaServer 节点新的注册信息会同步到其他节点中

Поэтому Eureka вполне может справиться с ситуацией, когда некоторые узлы теряют связь из-за сетевых сбоев, не парализуя при этом всю службу регистрации, как Zookeeper.

6. Исходный код кейса

Исходный код демо-версии Eureka

7. Ссылки

Китайский сайт Springcloud

Сравнение ZooKeeper и Eureka