Регистрация сервиса и открытие SpringColud Eureka

Spring Cloud

1. Введение в Эврику

Весь код в этой статье будет загружен на git, не стесняйтесь просматривать Git-адрес проекта:GitHub.com/839022478/S…

В традиционных приложениях вызовы между компонентами реализуются через интерфейсы со стандартизированными ограничениями, чтобы обеспечить хорошее взаимодействие между различными модулями. Однако после разделения на микросервисы сетевой адрес каждого экземпляра микросервиса может динамически меняться, и число также изменится, что сделает исходный жестко закодированный адрес бесполезным. Централизованный компонент необходим для регистрации и управления услугами.Для решения вышеуказанных проблем существует управление услугами, которое заключается в управлении всей информацией и статусом услуг, что мы называемРегистрационный центр

1.1 Центр регистрации

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

блок-схема:

在这里插入图片描述
Используя регистрационный центр, нам не нужно заботиться о том, сколько предложений, только звонок, тогда что такое регистрационные центры?

Реестр: Eureka, Nacos, Consul, Zookeeper

В этой статье объясняется Eureka в рамках популярных микросервисов Spring Cloud. Eureka — это платформа обнаружения служб, разработанная Netflix, служба RESTful, базовый компонент для обнаружения и регистрации служб, а также платформа для создания микрослужб Spring Cloud. Одна из предпосылок заключается в том, что она скрывает детали взаимодействия между сервером и клиентом, позволяя разработчикам сосредоточиться на бизнесе.

Регистрация и обнаружение службы в основном состоит из двух частей:服务端(Eureka Server)和客户端(Eureka Client)

  • Сервер (Сервер Эврика):Общедоступная служба, которая предоставляет клиенту функции регистрации и обнаружения службы, поддерживает соответствующую информацию клиента, зарегистрированного на себя, и предоставляет интерфейс для клиента, чтобы получить информацию о других службах в реестре, чтобы динамически меняющиеся клиенты могут звонить друг другу между службами.

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

Официальный сайт Эврика GIT:GitHub.com/Netflix/Евро…

1.3 Регистрация и обнаружение службы

Схема регистрации и обнаружения сервисов:

在这里插入图片描述

1.2 функция клиента и функция сервера

1.2.1 функция клиента

  1. Регистрация: при запуске каждая микрослужба регистрирует свой сетевой адрес и другую информацию в реестре, а реестр сохраняет (в памяти) эту информацию.
  2. Получить реестр услуг: потребитель услуг запрашивает сетевой адрес поставщика услуг из реестра и использует этот адрес для вызова поставщика услуг.Чтобы не проверять информацию реестра каждый раз, клиент будет регулярно обращаться к серверу для тянуть информацию из реестра в кеш клиенту локально.
  3. Сердцебиение: каждый микросервис взаимодействует с реестром через определенный механизм (пульс).Если реестр не связывается со службой в течение длительного времени, экземпляр будет отменен.
  4. Вызов: фактический вызов службы через реестр, анализируется соответствующая связь между именем службы и конкретным адресом, находится адрес конкретной службы и выполняется фактический вызов.

1.2.2 функция реестра сервера

  1. Реестр служб: записывайте информацию о каждой микрослужбе, такую ​​как имя службы, IP-адрес, порт и т. д. Реестр предоставляет API запросов (для запроса доступных экземпляров микрослужб) и API управления (для регистрации и отмены регистрации службы).
  2. Регистрация и обнаружение службы: Регистрация: Зарегистрируйте информацию о микрослужбе в реестре. Обнаружение: запросите список доступных микросервисов и их сетевых адресов.
  3. Проверка службы: регулярно проверяйте зарегистрированные службы и удаляйте их из реестра, если экземпляр оказывается недоступным в течение длительного времени.

2. Одноузловая конструкция Эврика

2.1 pom.xml

В некоторых учебниках он представитspring-boot-starter-web, эта зависимость на самом деле не нужна, т.к.spring-cloud-starter-netflix-eureka-serverЗависимости уже включают его, и вы можете зависеть от него в файле pom.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.2 application.yml

server:
  port: 8500
eureka:
  client:
    #是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息
    register-with-eureka: false
    #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false
    fetch-registry: false
    #设置服务注册中心的URL,用于client和server端交流
    service-url:
      defaultZone: http://localhost:8080/eureka/

2.3 Класс запуска сервера

Добавьте эту аннотацию в класс запуска, чтобы идентифицировать службу как центр конфигурации. @EnableEurekaServer

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

2.4 Старт

мы начинаемEurekaDemoApplication, затем введите адрес в браузереhttp://localhost:8500/, мы можем запускать нашу Эврику. Давайте посмотрим на эффект. Когда появляется этот экран, это означает, что мы успешно запустились~, но в это время в нашем сервисе нет регистрации клиента.

在这里插入图片描述

3. Регистрация в сервисе

Примечание. Клиентский pom, который нам нужно добавитьspring-boot-starter-webВ противном случае служба не может быть запущена должным образом

3.1 pom.xml

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>     

3.2 application.yml

#注册中心
eureka:
  client:
    #设置服务注册中心的URL
    service-url:
      defaultZone: http://localhost:8500/eureka/
  #服务名
  instance:
    appname: mxn

3.3 Класс запуска клиента

В класс запуска клиента нам нужно добавить@EnableDiscoveryClientаннотация

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

3.4 Просмотр эффекта

После запуска проекта обновитеhttp://localhost:8500/страница, мы можем обнаружить, что регистрация службы прошла успешно

在这里插入图片描述

и мы можем увидеть в журнале идей печатьDiscoveryClient_MXN/DESKTOP-5BQ3UK8 - registration status: 204, что означает, что регистрация прошла успешно Соединение между сервером Eureka и клиентом Eureka в основном реализуется посредством сердцебиения. Сердцебиение означает, что Eureka Client регулярно сообщает о текущем состоянии этого экземпляра службы на Eureka Server и поддерживает действительность аренды этого экземпляра службы в реестре.

Клиент Eureka будет регулярно извлекать информацию из реестра с сервера Eureka и локально кэшировать информацию для обнаружения служб.

4. Конечные точки Эврика

Адрес официального сайта:GitHub.com/Netflix/Евро…

Сервер Eureka также предоставляет конечную точку(eureka/apps/{applicaitonName})Вы можете просмотреть подробную информацию о регистрируемом сервисе. Название applicaitonName — это микросервисы, например места, которые мы посещаем.http://localhost:8500/eureka/apps/mxn

在这里插入图片描述

Пять, принцип Эврика

5.1 Природа

Сохраняет регистрационную информацию для каждого клиента. EurekaClient синхронно получает список регистрации службы от EurekaServer. Выберите услугу для вызова по определенным правилам

5.2 Схема архитектуры Эврика

在这里插入图片描述

  • поставщики услуг:Это клиент Eureka для регистрации и обновления собственной информации на сервер Eureka, а также может получить информацию из реестра Eureka Server.
  • Реестр услуг:Предоставляет функции для регистрации и обнаружения служб. Каждый Eureka Cient регистрирует свою собственную информацию на Eureka Server, а также может получать информацию о других службах через Eureka Server для обнаружения и вызова других служб.
  • Потребители услуг:Это клиент eureka, который получает информацию о других сервисах, зарегистрированных на нем через Eureka Server, чтобы найти нужный сервис и инициировать удаленный вызов в соответствии с информацией.
  • Синхронная репликация:Синхронная репликация информации реестра между серверами Eureka обеспечивает согласованность информации об экземплярах службы в разных реестрах в кластере серверов Eureka.
  • Удаленный вызов:Удаленные звонки между клиентами службы.
  • регистр:Клиентская сторона регистрирует свои собственные метаданные на стороне сервера для обнаружения службы.
  • Обновление:Поддерживайте и обновляйте достоверность метаданных экземпляра службы в реестре, отправляя тактовые импульсы на сервер. Если сервер не получает информацию о пульсе клиента в течение определенного периода времени, служба по умолчанию будет отключена, а информация об экземпляре службы будет удалена из реестра.
  • Не в сети:Когда клиент закрывается, метаданные экземпляра службы клиента активно отменяются с сервера. В это время данные экземпляра службы клиента будут удалены из реестра сервера.
  • Получить реестр:Клиент запрашивает информацию реестра у Сервера для обнаружения службы, тем самым инициируя удаленные вызовы между службами.

5.3 Самозащита Эврика

Иногда мы будем видеть это подсказку:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE., это связано с тем, что по умолчанию Eureka Server не получает пульс микрослужбы в течение определенного периода времени и отключает микрослужбу (90S). Однако при сбое сети микросервис и сервер не могут нормально взаимодействовать, и описанное выше поведение очень опасно, поскольку микросервис является нормальным и не должен выходить из системы.Его руководящая идеологияЛучше бы сохранили здоровых и нездоровых, чем слепо списали бы любую здоровую службуМы также можем отключить функцию самозащиты с помощью команды:

eureka:
  server: 
    enable-self-preservation: false

Так как же срабатывает самозащита? Состояние срабатывания механизма самозащиты – это когда число ударов сердца в минуту (renewsLastMin) меньше чемnumberOfRenewsPerMinThreshold, и включите переключатель режима автоматической защиты (eureka.server.enable-self-preservation = true), запускает механизм самозащиты и больше не истечет срок аренды автоматически. Все вышеперечисленное меньшеnumberOfRenewsPerMinThreshold, как он рассчитывается, мы можем знать в исходниках eureka

numberOfRenewsPerMinThreshold = ожидаемое количество обновленийPerMin * процент продления (по умолчанию 0,85) ожидаемоеNumberOfRenewsPerMin = количество зарегистрированных экземпляров приложения x 2 Число зарегистрированных экземпляров приложения x 2 связано с тем, что по умолчанию зарегистрированные экземпляры приложения продлевают аренду каждые полминуты, поэтому частота пульса составляет два раза в минуту, поэтому x 2

Например: у нас 10 сервисов, ожидаемое количество обновлений в минуту: 10*2=20, ожидаемый порог: 20*0,85=17, когда меньше 17, сработает механизм самозащиты

在这里插入图片描述

5.4 Проверка работоспособности

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

在这里插入图片描述

Например, сердцебиение всегда было в норме, а служба работала, но сервисная БД (база данных) не может быть подключена, и услуга не может быть предоставлена ​​нормально.

На этом этапе нам также необходимо синхронизировать состояние работоспособности микросервиса с сервером. Просто запустите проверку работоспособности eureka. Таким образом, микросервис будет синхронизировать свое состояние работоспособности с eureka. Конфигурация следующая.

Настроено на стороне клиента: распространение собственного состояния работоспособности на сервер.

eureka:
  client:
    healthcheck:
      enabled: true

5.5 Eureka прослушивает события

import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.netflix.eureka.server.event.*;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
public class CustomEvent {

    @EventListener
    public void listen(EurekaInstanceCanceledEvent event ) {
        System.out.println(LocalDateTime.now()+"服务下线事件:"+event.getAppName()+"---"+event.getServerId());
//发钉钉
    }

    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.out.println(LocalDateTime.now()+"服务上线事件:"+instanceInfo.getAppName()+"---"+instanceInfo.getInstanceId());
    }

    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) {
        System.out.println(LocalDateTime.now()+"服务续约/心跳上报事件:"+event.getAppName()+"---"+event.getServerId());

    }

    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
        System.out.println(LocalDateTime.now()+"注册中心可用事件");
    }

    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        System.out.println(LocalDateTime.now()+"注册中心启动事件");

    }
}

5.6 REW: Обновление услуг

Клиент Eureka отправит сердцебиение каждые 30 секунд для продления договора. Обновите договор, чтобы сообщить серверу Eureka, что клиент Eureka работает нормально без проблем. По умолчанию, если Eureka Server не получает продление от клиента Eureka в течение 90 секунд, сторона сервера будет удалять экземпляр из своего реестра. На этот раз настраивается, и, как правило, не рекомендуется его изменить.

5.6 Исключение услуги

Если Eureka Client не продлевает контракт и не отключается после регистрации (сбой службы или сбой сети и т. д.), то статус службы находится в неизвестном состоянии, и нет гарантии, что можно будет получить обратную связь от экземпляра службы, поэтому требуется отбраковка служб. Этот метод регулярно очищает эти нестабильные службы. Этот метод удалит все просроченные договоры аренды в реестре в пакетном режиме. Отбраковка — это задача по времени, которая по умолчанию выполняется один раз каждые 60 секунд. Задержка 60 секунд, интервал 60 секунд

Устранены ограничения:1. Не очищается во время самозащиты. 2. Очистить партиями.

6. Дефекты Эврика

Поскольку синхронная репликация между кластерами осуществляется через HTTP, исходя из ненадежности сети, информация реестра между серверами Eureka в кластере неизбежно будет иметь не синхронизированные узлы времени, что не соответствует C (консистентность данных) в КАП.

7. Резюме

В середине мы объяснили конструкцию узла и принцип эврики. Для микросервисов, которые сейчас очень популярны, нам очень необходимо понять Эврику. Если вы считаете, что статья полезна для вас, пожалуйста, поставьте лайк и поддержите ее. Если вы есть какие-либо вопросы по статье Вопросы или предложения, добро пожаловать, чтобы обсудить и оставить сообщение, спасибо~